RedisServerWrapper.Cluster (redis_server_wrapper v0.7.4)

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")
  • :control_host - address used by redis-cli and cluster announcements (default: first bind address)
  • :password - Redis password (default: nil)
  • :username - optional ACL username paired with :password
  • :tls - use TLS-only cluster node connections (default: false)
  • :tls_cert_file, :tls_key_file - server certificate and private key
  • :tls_ca_cert_file or :tls_ca_cert_dir - trusted CA for Redis and redis-cli
  • :tls_client_cert_file, :tls_client_key_file - optional redis-cli client identity
  • :tls_server_name - optional redis-cli SNI name
  • :tls_insecure - explicitly disable redis-cli certificate verification
  • :redis_server_bin - redis-server binary path
  • :redis_cli_bin - redis-cli binary path
  • :distribution - :core (default), :full, or :legacy_stack
  • :timeout - startup timeout per node in ms (default: 10_000)
  • :convergence_timeout - bounded wait for every node to agree on the cluster topology (default: the value of :timeout)
  • :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 every tracked node process is alive and responds to PING.

Returns a specification to start this module under a supervisor.

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

Checks every node's CLUSTER INFO, including state, slots, failures, expected node count, and expected master count.

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 every tracked node process is alive and responds 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 every node's CLUSTER INFO, including state, slots, failures, expected node count, and expected master count.

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.