nogara-redis_failover 0.9.7.3 → 0.9.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changes.md +5 -3
- data/README.md +14 -3
- data/lib/redis_failover/client.rb +9 -3
- data/lib/redis_failover/version.rb +1 -1
- metadata +1 -1
data/Changes.md
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
HEAD
|
2
2
|
-----------
|
3
|
-
- redis_failover now supports distributed monitoring among the
|
4
|
-
as a means of redundancy in case a particular node manager crashed. Starting with version 1.0 of redis_failover, the
|
5
|
-
|
3
|
+
- redis_failover now supports distributed monitoring among the Node Managers! Previously, the Node Managers were only used
|
4
|
+
as a means of redundancy in case a particular node manager crashed. Starting with version 1.0 of redis_failover, the Node
|
5
|
+
Managers will all periodically report their health report/snapshots. The primary Node Manager will utilize a configurable
|
6
6
|
"node strategy" to determine if a particular node is available or unavailable.
|
7
7
|
- redis_failover now supports a configurable "failover strategy" that's consulted when performing a failover. Currently,
|
8
8
|
a single strategy is provided that takes into account the average latency of the last health check to the redis server.
|
9
|
+
- Improved handling of underlying ZK client connection in RedisFailover::NodeManager
|
10
|
+
- Add support for passing in an existing ZK client instance to RedisFailover::Cient.new
|
9
11
|
|
10
12
|
0.9.7.2
|
11
13
|
-----------
|
data/README.md
CHANGED
@@ -90,6 +90,9 @@ would look like the following:
|
|
90
90
|
|
91
91
|
---
|
92
92
|
:max_failures: 2
|
93
|
+
:node_strategy: majority
|
94
|
+
:failover_strategy: latency
|
95
|
+
:required_node_managers: 2
|
93
96
|
:nodes:
|
94
97
|
- localhost:6379
|
95
98
|
- localhost:1111
|
@@ -115,22 +118,30 @@ this Node Manager process dies or becomes partitioned from the network, another
|
|
115
118
|
will be promoted as the primary manager of redis servers. You can run as many Node Manager
|
116
119
|
processes as you'd like. Every Node Manager periodically records health "snapshots" which the
|
117
120
|
primary/master Node Manager consults when determining if it should officially mark a redis
|
118
|
-
server as unavailable. By default, a majority strategy is used.
|
121
|
+
server as unavailable. By default, a majority strategy is used. Also, when a failover
|
122
|
+
happens, the primary Node Manager will consult the node snapshots to determine the best
|
123
|
+
node to use as the new master.
|
119
124
|
|
120
125
|
## Client Usage
|
121
126
|
|
122
127
|
The redis failover client must be used in conjunction with a running Node Manager daemon. The
|
123
128
|
client supports various configuration options, however the only mandatory option is the list of
|
124
|
-
ZooKeeper servers:
|
129
|
+
ZooKeeper servers OR an existing ZK client instance:
|
125
130
|
|
131
|
+
# Explicitly specify the ZK servers
|
126
132
|
client = RedisFailover::Client.new(:zkservers => 'localhost:2181,localhost:2182,localhost:2183')
|
127
133
|
|
134
|
+
# Explicitly specify an existing ZK client instance (useful if using a connection pool, etc)
|
135
|
+
zk = ZK.new('localhost:2181,localhost:2182,localhost:2183')
|
136
|
+
client = RedisFailover::Client.new(:zk => zk)
|
137
|
+
|
128
138
|
The client actually employs the common redis and redis-namespace gems underneath, so this should be
|
129
139
|
a drop-in replacement for your existing pure redis client usage.
|
130
140
|
|
131
141
|
The full set of options that can be passed to RedisFailover::Client are:
|
132
142
|
|
133
|
-
:
|
143
|
+
:zk - an existing ZK client instance
|
144
|
+
:zkservers - comma-separated ZooKeeper host:port pairs
|
134
145
|
:znode_path - the Znode path override for redis server list (optional)
|
135
146
|
:password - password for redis nodes (optional)
|
136
147
|
:db - db to use for redis nodes (optional)
|
@@ -40,6 +40,7 @@ module RedisFailover
|
|
40
40
|
#
|
41
41
|
# @param [Hash] options the options used to initialize the client instance
|
42
42
|
# @option options [String] :zkservers comma-separated ZooKeeper host:port
|
43
|
+
# @option options [String] :zk an existing ZK client connection instance
|
43
44
|
# @option options [String] :znode_path znode path override for redis nodes
|
44
45
|
# @option options [String] :password password for redis nodes
|
45
46
|
# @option options [String] :db database to use for redis nodes
|
@@ -49,6 +50,7 @@ module RedisFailover
|
|
49
50
|
# @option options [Integer] :max_retries max retries for a failure
|
50
51
|
# @option options [Boolean] :safe_mode indicates if safe mode is used or not
|
51
52
|
# @option options [Boolean] :master_only indicates if only redis master is used
|
53
|
+
# @note Use either :zkservers or :zk
|
52
54
|
# @return [RedisFailover::Client]
|
53
55
|
def initialize(options = {})
|
54
56
|
Util.logger = options[:logger] if options[:logger]
|
@@ -177,8 +179,8 @@ module RedisFailover
|
|
177
179
|
|
178
180
|
# Sets up the underlying ZooKeeper connection.
|
179
181
|
def setup_zk
|
180
|
-
@zk = ZK.new(@zkservers)
|
181
|
-
@zk.
|
182
|
+
@zk = ZK.new(@zkservers) if @zkservers
|
183
|
+
@zk.register(redis_nodes_path) { |event| handle_zk_event(event) }
|
182
184
|
if @safe_mode
|
183
185
|
@zk.on_expired_session { purge_clients }
|
184
186
|
end
|
@@ -475,7 +477,11 @@ module RedisFailover
|
|
475
477
|
#
|
476
478
|
# @param [Hash] options the configuration options
|
477
479
|
def parse_options(options)
|
478
|
-
@zkservers = options.
|
480
|
+
@zk, @zkservers = options.values_at(:zk, :zkservers)
|
481
|
+
if [@zk, @zkservers].all? || [@zk, @zkservers].none?
|
482
|
+
raise ArgumentError, 'must specify :zk or :zkservers'
|
483
|
+
end
|
484
|
+
|
479
485
|
@root_znode = options.fetch(:znode_path, Util::DEFAULT_ROOT_ZNODE_PATH)
|
480
486
|
@namespace = options[:namespace]
|
481
487
|
@password = options[:password]
|