提交 c95a582a 编写于 作者: M Madelyn Olson

Add configuration option for allowing reads on cluster down

上级 e9b99c78
...@@ -1194,6 +1194,22 @@ lua-time-limit 5000 ...@@ -1194,6 +1194,22 @@ lua-time-limit 5000
# #
# cluster-replica-no-failover no # cluster-replica-no-failover no
# This option, when set to yes, allows nodes to serve read traffic while the
# the cluster is in a down state, as long as it believes it owns the slots.
#
# This is useful for two cases. The first case is for when an application
# doesn't require consistency of data during node failures or network partitions.
# One example of this is a cache, where as long as the node has the data it
# should be able to serve it.
#
# The second use case is for configurations that don't meet the recommended
# three shards but want to enable cluster mode and scale later. A
# master outage in a 1 or 2 shard configuration causes a read/write outage to the
# entire cluster without this option set, with it set there is only a write outage.
# Without a quorum of masters, slot ownership will not change automatically.
#
# cluster-allow-reads-when-down no
# In order to setup your cluster make sure to read the documentation # In order to setup your cluster make sure to read the documentation
# available at http://redis.io web site. # available at http://redis.io web site.
......
...@@ -5595,8 +5595,12 @@ clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, in ...@@ -5595,8 +5595,12 @@ clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, in
* without redirections or errors in all the cases. */ * without redirections or errors in all the cases. */
if (n == NULL) return myself; if (n == NULL) return myself;
/* Cluster is globally down but we got keys? We can't serve the request. */ /* Cluster is globally down but we got keys? We only serve the request
if (server.cluster->state != CLUSTER_OK) { * if it is a read command and when allow_reads_when_down is enabled. */
if ((server.cluster->state != CLUSTER_OK) &&
!(server.cluster_allow_reads_when_down && ((cmd->flags & CMD_READONLY)
|| (cmd->proc == evalCommand) || (cmd->proc == evalShaCommand))))
{
if (error_code) *error_code = CLUSTER_REDIR_DOWN_STATE; if (error_code) *error_code = CLUSTER_REDIR_DOWN_STATE;
return NULL; return NULL;
} }
...@@ -5701,7 +5705,10 @@ int clusterRedirectBlockedClientIfNeeded(client *c) { ...@@ -5701,7 +5705,10 @@ int clusterRedirectBlockedClientIfNeeded(client *c) {
dictEntry *de; dictEntry *de;
dictIterator *di; dictIterator *di;
/* If the cluster is down, unblock the client with the right error. */ /* If the cluster is down, unblock the client with the right error.
* If the cluster is configured to allow reads on cluster down, we
* still want to emit this error since a write will be required
* to unblock them which may never come. */
if (server.cluster->state == CLUSTER_FAIL) { if (server.cluster->state == CLUSTER_FAIL) {
clusterRedirectClient(c,NULL,0,CLUSTER_REDIR_DOWN_STATE); clusterRedirectClient(c,NULL,0,CLUSTER_REDIR_DOWN_STATE);
return 1; return 1;
......
...@@ -2166,6 +2166,8 @@ standardConfig configs[] = { ...@@ -2166,6 +2166,8 @@ standardConfig configs[] = {
createBoolConfig("syslog-enabled", NULL, IMMUTABLE_CONFIG, server.syslog_enabled, 0, NULL, NULL), createBoolConfig("syslog-enabled", NULL, IMMUTABLE_CONFIG, server.syslog_enabled, 0, NULL, NULL),
createBoolConfig("cluster-enabled", NULL, IMMUTABLE_CONFIG, server.cluster_enabled, 0, NULL, NULL), createBoolConfig("cluster-enabled", NULL, IMMUTABLE_CONFIG, server.cluster_enabled, 0, NULL, NULL),
createBoolConfig("appendonly", NULL, MODIFIABLE_CONFIG, server.aof_enabled, 0, NULL, updateAppendonly), createBoolConfig("appendonly", NULL, MODIFIABLE_CONFIG, server.aof_enabled, 0, NULL, updateAppendonly),
createBoolConfig("cluster-allow-reads-when-down", NULL, MODIFIABLE_CONFIG, server.cluster_allow_reads_when_down, 0, NULL, NULL},
/* String Configs */ /* String Configs */
createStringConfig("aclfile", NULL, IMMUTABLE_CONFIG, ALLOW_EMPTY_STRING, server.acl_filename, "", NULL, NULL), createStringConfig("aclfile", NULL, IMMUTABLE_CONFIG, ALLOW_EMPTY_STRING, server.acl_filename, "", NULL, NULL),
......
...@@ -1334,6 +1334,8 @@ struct redisServer { ...@@ -1334,6 +1334,8 @@ struct redisServer {
to set in order to suppress certain to set in order to suppress certain
native Redis Cluster features. Check the native Redis Cluster features. Check the
REDISMODULE_CLUSTER_FLAG_*. */ REDISMODULE_CLUSTER_FLAG_*. */
int cluster_allow_reads_when_down; /* Are reads allowed when the cluster
is down? */
/* Scripting */ /* Scripting */
lua_State *lua; /* The Lua interpreter. We use just one for all clients */ lua_State *lua; /* The Lua interpreter. We use just one for all clients */
client *lua_client; /* The "fake client" to query Redis from Lua */ client *lua_client; /* The "fake client" to query Redis from Lua */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册