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
d4c3c124
Commit
d4c3c124
authored
Sep 17, 2014
by
antirez
Browse files
Cluster: new option to work with partial slots coverage.
parent
fbaa4388
Changes
6
Show whitespace changes
Inline
Side-by-side
redis.conf
View file @
d4c3c124
...
@@ -660,6 +660,19 @@ lua-time-limit 5000
...
@@ -660,6 +660,19 @@ lua-time-limit 5000
#
#
# cluster-migration-barrier 1
# cluster-migration-barrier 1
# By default Redis Cluster nodes stop accepting queries if they detect there
# is at least an hash slot uncovered (no available node is serving it).
# This way if the cluster is partially down (for example a range of hash slots
# are no longer covered) all the cluster becomes, eventually, unavailable.
# It automatically returns available as soon as all the slots are covered again.
#
# However sometimes you want the subset of the cluster which is working,
# to continue to accept queries for the part of the key space that is still
# covered. In order to do so, just set the cluster-require-full-coverage
# option to no.
#
# cluster-require-full-coverage yes
# 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 @
d4c3c124
...
@@ -3171,6 +3171,7 @@ void clusterUpdateState(void) {
...
@@ -3171,6 +3171,7 @@ void clusterUpdateState(void) {
new_state = REDIS_CLUSTER_OK;
new_state = REDIS_CLUSTER_OK;
/* Check if all the slots are covered. */
/* Check if all the slots are covered. */
if (server.cluster_require_full_coverage) {
for (j = 0; j < REDIS_CLUSTER_SLOTS; j++) {
for (j = 0; j < REDIS_CLUSTER_SLOTS; j++) {
if (server.cluster->slots[j] == NULL ||
if (server.cluster->slots[j] == NULL ||
server.cluster->slots[j]->flags & (REDIS_NODE_FAIL))
server.cluster->slots[j]->flags & (REDIS_NODE_FAIL))
...
@@ -3179,6 +3180,7 @@ void clusterUpdateState(void) {
...
@@ -3179,6 +3180,7 @@ void clusterUpdateState(void) {
break;
break;
}
}
}
}
}
/* Compute the cluster size, that is the number of master nodes
/* Compute the cluster size, that is the number of master nodes
* serving at least a single slot.
* serving at least a single slot.
...
...
src/cluster.h
View file @
d4c3c124
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
* multiplicators of the node timeout value (when ending with MULT). */
* multiplicators of the node timeout value (when ending with MULT). */
#define REDIS_CLUSTER_DEFAULT_NODE_TIMEOUT 15000
#define REDIS_CLUSTER_DEFAULT_NODE_TIMEOUT 15000
#define REDIS_CLUSTER_DEFAULT_SLAVE_VALIDITY 10
/* Slave max data age factor. */
#define REDIS_CLUSTER_DEFAULT_SLAVE_VALIDITY 10
/* Slave max data age factor. */
#define REDIS_CLUSTER_DEFAULT_REQUIRE_FULL_COVERAGE 1
#define REDIS_CLUSTER_FAIL_REPORT_VALIDITY_MULT 2
/* Fail report validity. */
#define REDIS_CLUSTER_FAIL_REPORT_VALIDITY_MULT 2
/* Fail report validity. */
#define REDIS_CLUSTER_FAIL_UNDO_TIME_MULT 2
/* Undo fail if master is back. */
#define REDIS_CLUSTER_FAIL_UNDO_TIME_MULT 2
/* Undo fail if master is back. */
#define REDIS_CLUSTER_FAIL_UNDO_TIME_ADD 10
/* Some additional time. */
#define REDIS_CLUSTER_FAIL_UNDO_TIME_ADD 10
/* Some additional time. */
...
...
src/config.c
View file @
d4c3c124
...
@@ -429,6 +429,13 @@ void loadServerConfigFromString(char *config) {
...
@@ -429,6 +429,13 @@ void loadServerConfigFromString(char *config) {
} else if (!strcasecmp(argv[0],"cluster-config-file") && argc == 2) {
} else if (!strcasecmp(argv[0],"cluster-config-file") && argc == 2) {
zfree(server.cluster_configfile);
zfree(server.cluster_configfile);
server.cluster_configfile = zstrdup(argv[1]);
server.cluster_configfile = zstrdup(argv[1]);
} else if (!strcasecmp(argv[0],"cluster-require-full-coverage") &&
argc == 2)
{
if ((server.cluster_require_full_coverage = yesnotoi(argv[1])) == -1)
{
err = "argument must be 'yes' or 'no'"; goto loaderr;
}
} else if (!strcasecmp(argv[0],"cluster-node-timeout") && argc == 2) {
} else if (!strcasecmp(argv[0],"cluster-node-timeout") && argc == 2) {
server.cluster_node_timeout = strtoll(argv[1],NULL,10);
server.cluster_node_timeout = strtoll(argv[1],NULL,10);
if (server.cluster_node_timeout <= 0) {
if (server.cluster_node_timeout <= 0) {
...
@@ -918,6 +925,11 @@ void configSetCommand(redisClient *c) {
...
@@ -918,6 +925,11 @@ void configSetCommand(redisClient *c) {
ll < 0) goto badfmt;
ll < 0) goto badfmt;
server.repl_min_slaves_max_lag = ll;
server.repl_min_slaves_max_lag = ll;
refreshGoodSlavesCount();
refreshGoodSlavesCount();
} else if (!strcasecmp(c->argv[2]->ptr,"cluster-require-full-coverage")) {
int yn = yesnotoi(o->ptr);
if (yn == -1) goto badfmt;
server.cluster_require_full_coverage = yn;
} else if (!strcasecmp(c->argv[2]->ptr,"cluster-node-timeout")) {
} else if (!strcasecmp(c->argv[2]->ptr,"cluster-node-timeout")) {
if (getLongLongFromObject(o,&ll) == REDIS_ERR ||
if (getLongLongFromObject(o,&ll) == REDIS_ERR ||
ll <= 0) goto badfmt;
ll <= 0) goto badfmt;
...
@@ -1039,6 +1051,8 @@ void configGetCommand(redisClient *c) {
...
@@ -1039,6 +1051,8 @@ void configGetCommand(redisClient *c) {
config_get_numerical_field("cluster-slave-validity-factor",server.cluster_slave_validity_factor);
config_get_numerical_field("cluster-slave-validity-factor",server.cluster_slave_validity_factor);
/* Bool (yes/no) values */
/* Bool (yes/no) values */
config_get_bool_field("cluster-require-full-coverage",
server.cluster_require_full_coverage);
config_get_bool_field("no-appendfsync-on-rewrite",
config_get_bool_field("no-appendfsync-on-rewrite",
server.aof_no_fsync_on_rewrite);
server.aof_no_fsync_on_rewrite);
config_get_bool_field("slave-serve-stale-data",
config_get_bool_field("slave-serve-stale-data",
...
@@ -1806,6 +1820,7 @@ int rewriteConfig(char *path) {
...
@@ -1806,6 +1820,7 @@ int rewriteConfig(char *path) {
rewriteConfigNumericalOption(state,"lua-time-limit",server.lua_time_limit,REDIS_LUA_TIME_LIMIT);
rewriteConfigNumericalOption(state,"lua-time-limit",server.lua_time_limit,REDIS_LUA_TIME_LIMIT);
rewriteConfigYesNoOption(state,"cluster-enabled",server.cluster_enabled,0);
rewriteConfigYesNoOption(state,"cluster-enabled",server.cluster_enabled,0);
rewriteConfigStringOption(state,"cluster-config-file",server.cluster_configfile,REDIS_DEFAULT_CLUSTER_CONFIG_FILE);
rewriteConfigStringOption(state,"cluster-config-file",server.cluster_configfile,REDIS_DEFAULT_CLUSTER_CONFIG_FILE);
rewriteConfigYesNoOption(state,"cluster-require-full-coverage",server.cluster_require_full_coverage,REDIS_CLUSTER_DEFAULT_REQUIRE_FULL_COVERAGE);
rewriteConfigNumericalOption(state,"cluster-node-timeout",server.cluster_node_timeout,REDIS_CLUSTER_DEFAULT_NODE_TIMEOUT);
rewriteConfigNumericalOption(state,"cluster-node-timeout",server.cluster_node_timeout,REDIS_CLUSTER_DEFAULT_NODE_TIMEOUT);
rewriteConfigNumericalOption(state,"cluster-migration-barrier",server.cluster_migration_barrier,REDIS_CLUSTER_DEFAULT_MIGRATION_BARRIER);
rewriteConfigNumericalOption(state,"cluster-migration-barrier",server.cluster_migration_barrier,REDIS_CLUSTER_DEFAULT_MIGRATION_BARRIER);
rewriteConfigNumericalOption(state,"cluster-slave-validity-factor",server.cluster_slave_validity_factor,REDIS_CLUSTER_DEFAULT_SLAVE_VALIDITY);
rewriteConfigNumericalOption(state,"cluster-slave-validity-factor",server.cluster_slave_validity_factor,REDIS_CLUSTER_DEFAULT_SLAVE_VALIDITY);
...
...
src/redis.c
View file @
d4c3c124
...
@@ -1451,6 +1451,7 @@ void initServerConfig(void) {
...
@@ -1451,6 +1451,7 @@ void initServerConfig(void) {
server
.
cluster_node_timeout
=
REDIS_CLUSTER_DEFAULT_NODE_TIMEOUT
;
server
.
cluster_node_timeout
=
REDIS_CLUSTER_DEFAULT_NODE_TIMEOUT
;
server
.
cluster_migration_barrier
=
REDIS_CLUSTER_DEFAULT_MIGRATION_BARRIER
;
server
.
cluster_migration_barrier
=
REDIS_CLUSTER_DEFAULT_MIGRATION_BARRIER
;
server
.
cluster_slave_validity_factor
=
REDIS_CLUSTER_DEFAULT_SLAVE_VALIDITY
;
server
.
cluster_slave_validity_factor
=
REDIS_CLUSTER_DEFAULT_SLAVE_VALIDITY
;
server
.
cluster_require_full_coverage
=
REDIS_CLUSTER_DEFAULT_REQUIRE_FULL_COVERAGE
;
server
.
cluster_configfile
=
zstrdup
(
REDIS_DEFAULT_CLUSTER_CONFIG_FILE
);
server
.
cluster_configfile
=
zstrdup
(
REDIS_DEFAULT_CLUSTER_CONFIG_FILE
);
server
.
lua_caller
=
NULL
;
server
.
lua_caller
=
NULL
;
server
.
lua_time_limit
=
REDIS_LUA_TIME_LIMIT
;
server
.
lua_time_limit
=
REDIS_LUA_TIME_LIMIT
;
...
...
src/redis.h
View file @
d4c3c124
...
@@ -858,6 +858,8 @@ struct redisServer {
...
@@ -858,6 +858,8 @@ struct redisServer {
struct
clusterState
*
cluster
;
/* State of the cluster */
struct
clusterState
*
cluster
;
/* State of the cluster */
int
cluster_migration_barrier
;
/* Cluster replicas migration barrier. */
int
cluster_migration_barrier
;
/* Cluster replicas migration barrier. */
int
cluster_slave_validity_factor
;
/* Slave max data age for failover. */
int
cluster_slave_validity_factor
;
/* Slave max data age for failover. */
int
cluster_require_full_coverage
;
/* If true, put the cluster down if
there is at least an uncovered slot. */
/* 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 */
redisClient
*
lua_client
;
/* The "fake client" to query Redis from Lua */
redisClient
*
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