Redis 集群环境搭建
用两台机器模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。
redis 采用 redis-3.2.4 版本。
两台虚拟机都是 CentOS ,一台 CentOS7 (IP:192.168.31.245),一台 CentOS7(IP:192.168.31.210) 。
安装过程
1. 下载并解压
wget http://download.redis.io/releases/redis-3.2.4.tar.gz
tar -zxvf redis-3.2.4.tar.gz
2. 编译安装
cd redis-3.2.4
make && make install
3. 将 redis-trib.rb 复制到 /usr/local/bin 目录下
cd src
cp redis-trib.rb /usr/local/bin/
4. 创建 Redis 节点
首先在 192.168.31.245 机器上 /root/software/redis-3.2.4 目录下创建 redis_cluster 目录;
mkdir redis_cluster
在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中
mkdir 7000 7001 7002<br>cp redis.conf redis_cluster/7000
cp redis.conf redis_cluster/7001
cp redis.conf redis_cluster/7002
分别修改这三个配置文件,修改如下内容
port 7000 //端口7000,7002,7003
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
接着在另外一台机器上(192.168.31.210),的操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可
5. 启动各个节点
第一台机器上执行
redis-server redis_cluster/7000/redis.conf
redis-server redis_cluster/7001/redis.conf
redis-server redis_cluster/7002/redis.conf
另外一台机器上执行
redis-server redis_cluster/7003/redis.conf
redis-server redis_cluster/7004/redis.conf
redis-server redis_cluster/7005/redis.conf
6. 检查 redis 启动情况
##一台机器<br>ps -ef | grep redis
root 61020 1 0 02:14 ? 00:00:01 redis-server 127.0.0.1:7000 [cluster]
root 61024 1 0 02:14 ? 00:00:01 redis-server 127.0.0.1:7001 [cluster]
root 61029 1 0 02:14 ? 00:00:01 redis-server 127.0.0.1:7002 [cluster]
netstat -tnlp | grep redis
tcp 0 0 127.0.0.1:17000 0.0.0.0:* LISTEN 61020/redis-server
tcp 0 0 127.0.0.1:17001 0.0.0.0:* LISTEN 61024/redis-server
tcp 0 0 127.0.0.1:17002 0.0.0.0:* LISTEN 61029/redis-server
tcp 0 0 127.0.0.1:7000 0.0.0.0:* LISTEN 61020/redis-server
tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 61024/redis-server
tcp 0 0 127.0.0.1:7002 0.0.0.0:* LISTEN 61029/redis-server
##另外一台机器
ps -ef | grep redis
root 9957 1 0 02:32 ? 00:00:01 redis-server 127.0.0.1:7003 [cluster]
root 9964 1 0 02:32 ? 00:00:01 redis-server 127.0.0.1:7004 [cluster]
root 9971 1 0 02:32 ? 00:00:01 redis-server 127.0.0.1:7005 [cluster]
root 10065 4744 0 02:38 pts/0 00:00:00 grep --color=auto redis
netstat -tlnp | grep redis
tcp 0 0 127.0.0.1:17003 0.0.0.0:* LISTEN 9957/redis-server 1
tcp 0 0 127.0.0.1:17004 0.0.0.0:* LISTEN 9964/redis-server 1
tcp 0 0 127.0.0.1:17005 0.0.0.0:* LISTEN 9971/redis-server 1
tcp 0 0 127.0.0.1:7003 0.0.0.0:* LISTEN 9957/redis-server 1
tcp 0 0 127.0.0.1:7004 0.0.0.0:* LISTEN 9964/redis-server 1
tcp 0 0 127.0.0.1:7005 0.0.0.0:* LISTEN 9971/redis-server 1
7.创建集群
Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。
redis-trib.rb create --replicas 1 192.168.31.245:7000 192.168.31.245:7001 192.168.31.245:7002 192.168.31.210:7003 192.168.31.210:7004 192.168.31.210:7005
其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。
等等,出错了。这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下:
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
之后再运行 redis-trib.rb 命令,会出现如下提示:
输入 yes 即可,然后出现如下内容,说明安装成功。
8. 集群验证
在第一台机器上连接集群的7002端口的节点,在另外一台连接7005节点,连接方式为 redis-cli -h 192.168.31.245 -c -p 7002 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。
在7005节点执行命令 set hello world ,执行结果如下:
然后在另外一台7002端口,查看 key 为 hello 的内容, get hello ,执行结果如下:
说明集群运作正常。
简单说一下原理
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数 <(xiao于) 总节点数的一半时,整个集群就无法提供服务了。
Redis运维
1.2 启动
[root@hadoop2 create-cluster]# ps -ef |grep redis
root 3912 2444 0 10:40 pts/0 00:00:00 grep redis
#先执行start,启动6个节点
[root@hadoop2 create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
#确认下
[root@hadoop2 create-cluster]# ps -ef |grep redis
root 5189 1 0 13:58 ? 00:00:00 ../../src/redis-server *:30001 [cluster]
root 5191 1 0 13:58 ? 00:00:00 ../../src/redis-server *:30002 [cluster]
root 5193 1 0 13:58 ? 00:00:00 ../../src/redis-server *:30003 [cluster]
root 5201 1 0 13:58 ? 00:00:00 ../../src/redis-server *:30004 [cluster]
root 5206 1 0 13:58 ? 00:00:00 ../../src/redis-server *:30005 [cluster]
root 5208 1 0 13:58 ? 00:00:00 ../../src/redis-server *:30006 [cluster]
root 5235 2444 0 13:59 pts/0 00:00:00 grep redis
#6节点纳入集群管理
[root@hadoop2 create-cluster]# ./create-cluster create
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:30001
127.0.0.1:30002
127.0.0.1:30003
Adding replica 127.0.0.1:30004 to 127.0.0.1:30001
Adding replica 127.0.0.1:30005 to 127.0.0.1:30002
Adding replica 127.0.0.1:30006 to 127.0.0.1:30003
M: 7556689b3dacc00ee31cb82bb4a3a0fcda39db75 127.0.0.1:30001
slots:0-5460 (5461 slots) master
M: 29cc0b04ce1485f2d73d36c204530b38c69db463 127.0.0.1:30002
slots:5461-10922 (5462 slots) master
M: 8c8c363fed795d56b319640ca696e74fbbbd3c77 127.0.0.1:30003
slots:10923-16383 (5461 slots) master
S: 6ca5cc8273f06880f63ea8ef9ef0f26ee68677f8 127.0.0.1:30004
replicates 7556689b3dacc00ee31cb82bb4a3a0fcda39db75
S: c47d9b24c51eea56723ebf40b5dd7bb627a0d92d 127.0.0.1:30005
replicates 29cc0b04ce1485f2d73d36c204530b38c69db463
S: e16c5b58943ed11dda1a90e5cacb10f42f4fcc53 127.0.0.1:30006
replicates 8c8c363fed795d56b319640ca696e74fbbbd3c77
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 7556689b3dacc00ee31cb82bb4a3a0fcda39db75 127.0.0.1:30001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 6ca5cc8273f06880f63ea8ef9ef0f26ee68677f8 127.0.0.1:30004
slots: (0 slots) slave
replicates 7556689b3dacc00ee31cb82bb4a3a0fcda39db75
S: c47d9b24c51eea56723ebf40b5dd7bb627a0d92d 127.0.0.1:30005
slots: (0 slots) slave
replicates 29cc0b04ce1485f2d73d36c204530b38c69db463
M: 8c8c363fed795d56b319640ca696e74fbbbd3c77 127.0.0.1:30003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 29cc0b04ce1485f2d73d36c204530b38c69db463 127.0.0.1:30002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: e16c5b58943ed11dda1a90e5cacb10f42f4fcc53 127.0.0.1:30006
slots: (0 slots) slave
replicates 8c8c363fed795d56b319640ca696e74fbbbd3c77
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
All 16384 slots covered,说明创建成功了。
上面信息,整理成图如下
./create-cluster start命令指定的参数
../../src/redis-server
--port $PORT
--cluster-enabled yes
--cluster-config-file nodes-${PORT}.conf
--cluster-node-timeout $TIMEOUT
--appendonly yes
--appendfilename appendonly-${PORT}.aof
--dbfilename dump-${PORT}.rdb
--logfile ${PORT}.log --daemonize yes
1.3 集群创建了之后,watch查看下
[root@hadoop2 create-cluster]# ./create-cluster watch
watch命令,一秒监控一次。
节点信息格式
见http://redis.io/commands/cluster-nodes
通过上面配置,可以清楚了解主备情况。
2.演示节点fail-over情况
[root@hadoop2 create-cluster]# ps -ef |grep redis
root 2424 1 0 21:41 ? 00:00:00 ../../src/redis-server *:30001 [cluster]
root 2426 1 0 21:41 ? 00:00:00 ../../src/redis-server *:30002 [cluster]
root 2428 1 0 21:41 ? 00:00:00 ../../src/redis-server *:30003 [cluster]
root 2430 1 0 21:41 ? 00:00:00 ../../src/redis-server *:30004 [cluster]
root 2441 1 0 21:41 ? 00:00:00 ../../src/redis-server *:30005 [cluster]
root 2446 1 0 21:41 ? 00:00:00 ../../src/redis-server *:30006 [cluster]
模拟关闭 30003 Master节点
[root@hadoop2 create-cluster]# kill -9 2428
监控nodes信息
127.0.0.1:30001> cluster nodes
6ca5cc8273f06880f63ea8ef9ef0f26ee68677f8 127.0.0.1:30004@40004 slave 7556689b3dacc00ee31cb82bb4a3a0fcda39db75 0 1473688179624 4 connected
c47d9b24c51eea56723ebf40b5dd7bb627a0d92d 127.0.0.1:30005@40005 slave 29cc0b04ce1485f2d73d36c204530b38c69db463 0 1473688179624 5 connected
8c8c363fed795d56b319640ca696e74fbbbd3c77 127.0.0.1:30003@40003 master,fail - 1473688174327 1473688173499 3 disconnected
29cc0b04ce1485f2d73d36c204530b38c69db463 127.0.0.1:30002@40002 master - 0 1473688179624 2 connected 5461-10922
e16c5b58943ed11dda1a90e5cacb10f42f4fcc53 127.0.0.1:30006@40006 master - 0 1473688179624 7 connected 10923-16383
7556689b3dacc00ee31cb82bb4a3a0fcda39db75 127.0.0.1:30001@40001 myself,master - 0 0 1 connected 0-5460
发生了主备切换。
实验证明:集群环境下,如果某个节点宕掉,可以正常发生主备切换,集群正常使用。
演示主备节点都宕掉的情况
模拟30006节点宕[dàng]掉
[root@hadoop2 create-cluster]# kill -9 2446
[root@hadoop2 create-cluster]# /usr/local/redis/bin/redis-cli -c -p 30002
127.0.0.1:30002> get title
(error) CLUSTERDOWN The cluster is down
集群环境不可用。
现在陆续恢复,30006,30003节点
#恢复启动30006节点
[root@hadoop2 create-cluster]# ../../src/redis-server --port 30006 --cluster-enabled yes
--cluster-config-file nodes-30006.conf --cluster-node-timeout 5000 --appendonly yes
--appendfilename appendonly-30006.aof
--dbfilename dump-30006.rdb --logfile 30006.log --daemonize yes
#集群恢复正常工作。
127.0.0.1:30002> get title
-> Redirected to slot [2217] located at 127.0.0.1:30001
"1"
127.0.0.1:30001> cluster nodes
6ca5cc8273f06880f63ea8ef9ef0f26ee68677f8 127.0.0.1:30004@40004 slave 7556689b3dacc00ee31cb82bb4a3a0fcda39db75 0 1473689972166 4 connected
c47d9b24c51eea56723ebf40b5dd7bb627a0d92d 127.0.0.1:30005@40005 slave 29cc0b04ce1485f2d73d36c204530b38c69db463 0 1473689972166 5 connected
8c8c363fed795d56b319640ca696e74fbbbd3c77 127.0.0.1:30003@40003 master,fail - 1473688174327 1473688173499 3 disconnected
29cc0b04ce1485f2d73d36c204530b38c69db463 127.0.0.1:30002@40002 master - 0 1473689972166 2 connected 5461-10922
e16c5b58943ed11dda1a90e5cacb10f42f4fcc53 127.0.0.1:30006@40006 master - 0 1473689972166 7 connected 10923-16383
7556689b3dacc00ee31cb82bb4a3a0fcda39db75 127.0.0.1:30001@40001 myself,master - 0 0 1 connected 0-5460
# 恢复启动30003节点
[root@hadoop2 create-cluster]# ../../src/redis-server --port 30003 --cluster-enabled yes
--cluster-config-file nodes-30003.conf --cluster-node-timeout 5000 --appendonly yes
--appendfilename appendonly-30003.aof --dbfilename dump-30003.rdb
--logfile 30003.log --daemonize yes
# 30003不再被恢复成主节点
127.0.0.1:30001> cluster nodes
6ca5cc8273f06880f63ea8ef9ef0f26ee68677f8 127.0.0.1:30004@40004 slave 7556689b3dacc00ee31cb82bb4a3a0fcda39db75 0 1473690034497 4 connected
c47d9b24c51eea56723ebf40b5dd7bb627a0d92d 127.0.0.1:30005@40005 slave 29cc0b04ce1485f2d73d36c204530b38c69db463 0 1473690034497 5 connected
8c8c363fed795d56b319640ca696e74fbbbd3c77 127.0.0.1:30003@40003 slave e16c5b58943ed11dda1a90e5cacb10f42f4fcc53 0 1473690034497 7 connected
29cc0b04ce1485f2d73d36c204530b38c69db463 127.0.0.1:30002@40002 master - 0 1473690034497 2 connected 5461-10922
e16c5b58943ed11dda1a90e5cacb10f42f4fcc53 127.0.0.1:30006@40006 master - 0 1473690034497 7 connected 10923-16383
7556689b3dacc00ee31cb82bb4a3a0fcda39db75 127.0.0.1:30001@40001 myself,master - 0 0 1 connected 0-5460
具体集群概括如图
如果发现 error MOVED,可能是因为客户端没有开启cluster模式。
错误描述如下
127.0.0.1:30001> set title3 "3"
(error) MOVED 9980 127.0.0.1:30002
集群扩容
xiezefan@ubuntu:~$ ps -ef | grep redis
xiezefan 13372 1 0 20:09 ? 00:00:08 redis-server *:7000 [cluster]
xiezefan 13376 1 0 20:09 ? 00:00:08 redis-server *:7001 [cluster]
xiezefan 13380 1 0 20:09 ? 00:00:08 redis-server *:7002 [cluster]
xiezefan 13382 1 0 20:09 ? 00:00:08 redis-server *:7003 [cluster]
xiezefan 13386 1 0 20:09 ? 00:00:08 redis-server *:7004 [cluster]
xiezefan 13390 1 0 20:09 ? 00:00:08 redis-server *:7005 [cluster]
xiezefan 13394 1 0 20:09 ? 00:00:08 redis-server *:7006 [cluster]
xiezefan 13400 1 0 20:09 ? 00:00:08 redis-server *:7007 [cluster]
现在我们已经有一个包含6个节点的集群,为集群加入一个master节点7006和一个slave节点7007。
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
以上命令将7006节点接入7000所在的集群。接下来,我们为7006增加一个slave节点。
redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000
以上命令表示增加slave节点,将7006的节点加入7000节点所在的集群中作为slave节点,随机依附现有的master节点中slave最少的节点,如果需要再指定特别的master节点,使用
redis-trib.rb add-node --slave --master-id 23b412673af0506df6382353e3a65960d5b7e66d 127.0.0.1:7007 127.0.0.1:7000
其中的23b412673af0506df6382353e3a65960d5b7e66d
是7006节点的id,我们可以通过cluster nodes
命令查看节点的id。
接下来我们用负载均衡,Slot是Redis Cluster数据承载的最单位,我们可以指定将一定范围的Slot转移到新的节点来实现负载均衡。
用户同样可以用运维工具redis-trib.rb完成reshard工作,具体步骤如下:
(1)输入如下命令:
./redis-trib.rb reshard 127.0.0.1:7000
其中127.0.0.1:7000是集群里任一节点。
(2)接着要求输入需要迁移的哈希槽数目,提示如下:
How many slots do you want to move (from 1 to 16384)?
假如输入100
(3)接着要求输入迁入哈希槽的目的节点ID,提示如下:
What is the receiving node ID?
假如输入ID:1
(4)接着要求输入迁出哈希槽的源节点ID,提示如下:
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs
这里可以输入多个节点ID或选择所有节点(all),这里注意源节点ID不能是目的节点ID。
5)接着redis-trib.rb会根据上面信息制定迁移计划,并输出如下:
Resharding plan:
Moving slot $slot1 from $sourceid1
Moving slot $slot2 from $sourceid2
Do you want to proceed with the proposed reshard plan (yes/no)?
这里输入yes
(6)接着等待数据迁移完成,至此reshard工作结束。
集群相关命令
cluster meet ip:port
集群间相互握手,加入彼此所在的集群。(将指定节点加入到集群)
cluster nodes
获取集群间节点信息的列表,如下所示,格式为<node ID> <node IP:PORT> <node role> [master node ID|-] <node ping_sent> <node pong_received> <node epoch> <node status>。
127.0.0.1:6379> cluster nodes
a15705fdb7cac60e07ff699bf4c514e80f245a2c 10.180.157.205:6379 slave 2b5603326d0fca28031467727fae4558115a99d8 0 1450854214289 11 connected
6477541e4594e60e095c8f440882636236545936 10.180.157.202:6379 slave 9b35a393fa6623887215023b761d531dde452d3c 0 1450854211276 12 connected
ecf9ae60e87ea3358d9c5f1f269e0ed9a387ea40 10.180.157.201:6379 master - 0 1450854214788 5 connected 10923-16383
2b5603326d0fca28031467727fae4558115a99d8 10.180.157.200:6379 master - 0 1450854213283 11 connected 5461-10922
f31f6ce49b3a2f3a246b2d97349c8f8614cf3a2c 10.180.157.208:6379 slave ecf9ae60e87ea3358d9c5f1f269e0ed9a387ea40 0 1450854212286 9 connected
9b35a393fa6623887215023b761d531dde452d3c 10.180.157.199:6379 myself,master - 0 0 12 connected 0-5460
cluster myid
返回节点的id。
127.0.0.1:6379> cluster myid
"9b35a393fa6623887215023b761d531dde452d3c"
cluster slots
返回集群间节点负责的数据分布表。
127.0.0.1:6379> cluster slots
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "10.180.157.201"
2) (integer) 6379
4) 1) "10.180.157.208"
2) (integer) 6379
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "10.180.157.200"
2) (integer) 6379
4) 1) "10.180.157.205"
2) (integer) 6379
3) 1) (integer) 0
2) (integer) 5460
3) 1) "10.180.157.199"
2) (integer) 6379
4) 1) "10.180.157.202"
2) (integer) 6379
cluster flushslots
清空该节点负责slots,必须在节点负责的这些slot都没有数据的情况下才能执行,该命令需要谨慎使用,由于之前说的bitmapTestBit方法,redis只比较负责的节点,清空的slots信息无法被其他节点同步。
cluster addslots [slot]
在当前节点上增加slot。(将指定的一个或多个slot 指派给当前节点)
cluster delslots [slot]
在节点上取消slot的负责。这也会导致前面说的slot信息无法同步,而且一旦集群有slot不负责,配置
为yes的话,该节点就无法提供服务了,所以使用也需谨慎。
cluster setslot <slot> MIGRATING <nodeid>
把本节点负责的某个slot设置为迁移到目的节点。(即将本节点的slot指派给或叫迁移到指定的节点)
cluster setslot <slot> MIGRATING <nodeid>
把本节点负责的某个slot设置为迁移到目的节点。(即将本节点的slot指派给或叫迁移到指定的节点)
cluster setslot <slot> IMPORTING <nodeid>
设置某个slot为从迁移源节点迁移标志。(即将指定节点的slot指派给或叫迁移到本节点)
cluster setslot <slot> STABLE
设置某个slot为从迁移状态恢复为正常状态。(取消slot的导入(importing)或迁移(migrating))
cluster setslot <slot> NODE <nodeid>
设置某个slot为某节点负责。该命令使用也需要注意,cluster setslot的四个命令需要配置迁移工具使用,单独使用容易引起集群混乱。该命令在集群出现异常时,需要指定某个slot为某个节点负责时,最好在每个节点上都执行一遍,至少要在迁移的节点和最高epoch的节点上执行成功。(将指定的slot指派给指定的节点,如果该slot已经指派给另一个节点,则要另一个节点先删除该slot)
cluster info
集群的一些info信息。
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:12
cluster_my_epoch:12
cluster_stats_messages_sent:1449982
cluster_stats_messages_received:1182698
cluster saveconfig
保存集群的配置文件,集群默认在配置修改的时候会自动保存配置文件,该方法也能手动执行命令保存。
cluster keyslot
可以查询某个key对应的slot地址。
127.0.0.1:6379> cluster keyslot key
(integer) 12539
cluster countkeysinslot
可以查询该节点负责的某个slot内部key的数量。
127.0.0.1:6379> cluster countkeysinslot 13252
(integer) 2
cluster getkeysinslot <slot> <count>
可以查询该节点负责的某个slot内部指定数量的key列表。
127.0.0.1:6379> cluster getkeysinslot 13252 10
1) "key0"
2) "key2298"
cluster forget
把某个节点加入黑名单,这样就无法完成握手。黑名单的过期时为60s,60s后两节点又会继续完成握手。
cluster replicate <nodeid>
负责某个节点,成为它的slave。(将当前节点设置为指定nodeid节点的从节点)
cluster slaves
列出某个节点slave列表。
127.0.0.1:6379> cluster slaves 2b5603326d0fca28031467727fae4558115a99d8
1) "a15705fdb7cac60e07ff699bf4c514e80f245a2c 10.180.157.205:6379 slave 2b5603326d0fca28031467727fae4558115a99d8 0 1450854932667 11 connected"
cluster count-failure-reports
列出某个节点的故障转移记录的长度。
cluster failover [FORCE|TAKEOVER]
手动执行故障转移。
cluster set-config-epoch
设置节点epoch,只有在节点加入集群前才能设置。
cluster reset [SOFT|HARD]
重置集群信息,soft是清空其他节点的信息,但不修改自己的id。hard还会修改自己的id。不传该参数则使用soft方式。
readonly
在slave上执行,执行该命令后,可以在slave上执行只读命令。
readwrite
在slave上执行,执行该命令后,取消在slave上执行命令。
集群相关配置
cluster-enabled
说明:集群开关,默认是不开启集群模式。
默认值:no。
是否可以动态修改:no。
值的范围:yes|no。
cluster-config-file
说明:集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。
默认值:nodes.conf。
是否可以动态修改:no。
值的范围:文件路径。
cluster-node-timeout
说明:节点的超时时间,单位是毫秒。
默认值:15000。
是否可以动态修改:yes。
值的范围:大于0。
cluster-slave-validity-factor
说明:在进行故障转移的时候,group的全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period。
默认值:10。
是否可以动态修改:yes。
值的范围:大于等于0。
cluster-migration-barrier
说明:master的slave数量大于该值,slave才能迁移到其他孤儿master上,具体说明见均衡集群的slave章节。
默认值:1。
是否可以动态修改:yes。
值的范围:大于等于0。
说明:默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,分区的master一直在接受写请求,而造成很长时间数据不一致。
默认值:yes。
是否可以动态修改:yes。
值的范围:yes|no。