Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
c95a582a
Commit
c95a582a
authored
May 30, 2019
by
Madelyn Olson
Browse files
Add configuration option for allowing reads on cluster down
parent
e9b99c78
Changes
4
Hide whitespace changes
Inline
Side-by-side
redis.conf
View file @
c95a582a
...
@@ -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.
...
...
src/cluster.c
View file @
c95a582a
...
@@ -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
;
...
...
src/config.c
View file @
c95a582a
...
@@ -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
),
...
...
src/server.h
View file @
c95a582a
...
@@ -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 */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment