Add configuration option for allowing reads on cluster down
This commit is contained in:
parent
e9b99c78df
commit
c95a582a74
16
redis.conf
16
redis.conf
@ -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
|
|||||||
* 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) {
|
|||||||
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[] = {
|
|||||||
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 {
|
|||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user