RedisServerWrapper.Cluster (redis_server_wrapper v0.7.0)

Copy Markdown View Source

GenServer managing a Redis Cluster (multiple redis-server nodes in cluster mode).

Starts N master nodes (with optional replicas), then uses redis-cli --cluster create to form the cluster.

Usage

{:ok, pid} = RedisServerWrapper.Cluster.start_link(
  masters: 3,
  replicas_per_master: 1,
  base_port: 7100
)

RedisServerWrapper.Cluster.healthy?(pid)
RedisServerWrapper.Cluster.node_addrs(pid)
RedisServerWrapper.Cluster.stop(pid)

Options

  • :masters - number of master nodes (default: 3)
  • :replicas_per_master - replicas per master (default: 0)
  • :base_port - starting port (default: 7100). Note: 7000 is avoided because macOS AirPlay Receiver binds it by default, which causes confusing cluster-start failures on Mac.
  • :bind - bind address (default: "127.0.0.1")
  • :password - Redis password (default: nil)
  • :redis_server_bin - redis-server binary path
  • :redis_cli_bin - redis-cli binary path
  • :timeout - startup timeout per node in ms (default: 10_000)
  • :cluster_node_timeout - cluster node timeout in ms (default: 5000)
  • :loadmodule - modules loaded into every cluster node; accepts paths or {path, [args]} tuples (default: [])
  • :extra - extra redis config directives as [{key, value}]
  • :managed - process lifecycle backend forwarded to every node. See RedisServerWrapper.Server for true, :forcola, and false. Only managed: false supports detach/1.

Summary

Functions

Returns the seed node address (first node).

Checks if all nodes respond to PING.

Returns a specification to start this module under a supervisor.

Detaches daemonized cluster nodes so their OS processes survive this GenServer.

Checks cluster health via CLUSTER INFO (state=ok, all slots assigned).

Returns cluster info map.

Returns all node addresses.

Returns all node PIDs (GenServer pids, not OS pids).

Runs a redis-cli command against the seed node.

Stops the cluster.

Functions

addr(server)

@spec addr(GenServer.server()) :: String.t()

Returns the seed node address (first node).

all_alive?(server)

@spec all_alive?(GenServer.server()) :: boolean()

Checks if all nodes respond to PING.

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

detach(server)

@spec detach(GenServer.server()) :: :ok | {:error, :managed_server}

Detaches daemonized cluster nodes so their OS processes survive this GenServer.

healthy?(server)

@spec healthy?(GenServer.server()) :: boolean()

Checks cluster health via CLUSTER INFO (state=ok, all slots assigned).

info(server)

@spec info(GenServer.server()) :: map()

Returns cluster info map.

node_addrs(server)

@spec node_addrs(GenServer.server()) :: [String.t()]

Returns all node addresses.

nodes(server)

@spec nodes(GenServer.server()) :: [pid()]

Returns all node PIDs (GenServer pids, not OS pids).

run(server, args)

@spec run(GenServer.server(), [String.t()]) ::
  {:ok, String.t()} | {:error, String.t()}

Runs a redis-cli command against the seed node.

start(opts \\ [])

@spec start(keyword()) :: GenServer.on_start()

start_link(opts \\ [])

@spec start_link(keyword()) :: GenServer.on_start()

stop(server)

@spec stop(GenServer.server()) :: :ok

Stops the cluster.