0.涉及命令一览
redis.conf中
命令 | 解释 |
---|---|
cluster-enabled yes | 打开集群功能 |
cluster-require-full-coverage yes | 所有插槽都能使用,否则集群下线 |
批量修改字符串为另一个
[root@localhost 8004]# sed -i 's/8003/8004/g' redis.conf
使用redis-cli搭建集群,3主3从
[root@localhost myCluster]# redis-cli --cluster create 127.0.0.1:8005 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 --cluster-replicas 1
查看集群状态
[root@localhost myCluster]# redis-cli --cluster check 127.0.0.1:8005
127.0.0.1:8000> cluster SLOTS
redis-cli连接任一集群内节点,使用cluster meet ip port
插槽之前没被分配过,分配给指定节点命令
cluster add slot s
cluster nodes获取集群中的主节点运行ID,cluster getkeysinslot 插槽号 要返回键的数量去获取要移动的插槽中有没有键
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
如果没有键,使用 cluster setslot 插槽号 node 新节点运行ID移动插槽到指定数据库
127.0.0.1:8000> cluster setslot 5461 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
不下线把12182号插槽从127.0.0.1:8001迁移到127.0.0.1:8000,需要5步
(1)在127.0.0.1:8000执行cluster setslot 12182 importing 127.0.0.1:8001的运行ID
(2)在127.0.0.1:8001执行cluster setslot 12182 migrating 127.0.0.1:8000的运行ID
(3)获取12182号插槽的键列表:cluster getkeysinslot 12182 10
(4)对第3步获取的每个键执行migrate命令,将其从127.0.0.1:8001迁移到127.0.0.1:8000
(5)执行cluster slot 12182 node 127.0.0.1:8000的运行ID来完成迁移
127.0.0.1:8000> cluster setslot 12182 importing 6eea8395cc4f8ba4dd1885a7f4b2a05b8cf3948c
OK
127.0.0.1:8001> cluster setslot 12182 migrating 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
127.0.0.1:8001> migrate 127.0.0.1 8000 foo 0 15999 replace
OK
127.0.0.1:8001> get foo
(error) ASK 12182 127.0.0.1:8000
127.0.0.1:8000> cluster setslot 12182 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8000> get foo8
"bar"
启动命令行客户端时添加-c可以自动重定向
[root@localhost ~]# redis-cli -c -p 8000
127.0.0.1:8000> set a a
-> Redirected to slot [15495] located at 127.0.0.1:8001
OK
1.客户端分片与集群比较
客户端分片:
- 维护成本高
- 增加、移除节点较繁琐
集群:
- 有和单机实例同样的性能
- 网络分区后能够提供一定的可访问性
- 主数据库故障分配的支持
2. 配置集群
新建一个myClusters文件夹,集群需要至少3个主数据库,所以要有6个节点,选取8000-8005端口,在myClusters文件夹新建这几个文件夹。
[root@localhost redis-5.0.0]# mkdir myCluster
[root@localhost redis-5.0.0]# cd myCluster
[root@localhost myCluster]# mkdir 8000
把redis.conf 复制一份到8000,改下几个配置参数
参数 | 解释 |
---|---|
daemonize | yes后台运行 |
cluster-enabled | yes启用cluster功能 |
port | 自己的端口 |
dir | 具体的子目录 |
批量修改字符串为另一个
[root@localhost 8004]# sed -i 's/8003/8004/g' redis.conf
进入目录下,启动redis
[root@localhost 8005]# redis-server redis.conf
2467:C 12 Apr 2020 15:24:38.396 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2467:C 12 Apr 2020 15:24:38.396 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=2467, just started
2467:C 12 Apr 2020 15:24:38.396 # Configuration loaded
全部启动完毕后查看下
[root@localhost 8004]# ps -ef|grep redis
\root 2468 1 0 15:24 ? 00:00:00 redis-server 127.0.0.1:8005 [cluster]
root 2489 1 0 15:25 ? 00:00:00 redis-server 127.0.0.1:8000 [cluster]
root 2494 1 0 15:25 ? 00:00:00 redis-server 127.0.0.1:8001 [cluster]
root 2499 1 0 15:26 ? 00:00:00 redis-server 127.0.0.1:8002 [cluster]
root 2504 1 0 15:26 ? 00:00:00 redis-server 127.0.0.1:8003 [cluster]
root 2509 1 0 15:26 ? 00:00:00 redis-server 127.0.0.1:8004 [cluster]
root 2514 2148 0 15:26 pts/0 00:00:00 grep --color=auto redis
使用redis-cli搭建集群,3主3从
[root@localhost myCluster]# redis-cli --cluster create 127.0.0.1:8005 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 --cluster-replicas 1
查看集群状态
[root@localhost myCluster]# redis-cli --cluster check 127.0.0.1:8005
127.0.0.1:8000> cluster SLOTS
3.增加节点
redis-cli连接任一集群内节点,使用cluster meet ip port
4. 插槽的分配
- 一个集群有16384个插槽,使用命令大概是平均分给主数据库
- 键与插槽关系:键的有效部分{}之间,或全部使用CRC16算法算出散列值,然后取16384的余数
- 插槽之前没被分配过,分配给指定节点命令
cluster add slot s - 插槽被分配过,首先获取该插槽有没有键,首先cluster nodes获取集群中的主节点运行ID,cluster getkeysinslot 插槽号 要返回键的数量去获取要移动的插槽中有没有键
127.0.0.1:8000> set foo bar
(error) MOVED 12182 127.0.0.1:8001
[root@localhost ~]# redis-cli -p 8001
127.0.0.1:8001> keys *
(empty list or set)
127.0.0.1:8001> set foo bar
OK
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
- 如果没有键,使用 cluster setslot 插槽号 node 新节点运行ID移动插槽到指定数据库
127.0.0.1:8000> cluster setslot 6000 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8000> cluster setslot 5461 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
- 如果插槽有键,集群下线后可以对每个键使用migrate 目标节点地址 目标节点接口 键名 数据库号码(集群模式只能使用0号数据库) 超时时间 [copy] [replace],copy表示不将键从当前数据库删除,replace表示如果目标节点存在同名键,则覆盖。已知foo键在12182插槽
127.0.0.1:8001> cluster setslot 12182 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
(error) ERR Can't assign hashslot 12182 to a different node while I still hold keys for this hash slot.
- 不下线把12182号插槽从127.0.0.1:8001迁移到127.0.0.1:8000,需要5步
(1)在127.0.0.1:8000执行cluster setslot 12182 importing 127.0.0.1:8001的运行ID
(2)在127.0.0.1:8001执行cluster setslot 12182 migrating 127.0.0.1:8000的运行ID
(3)获取12182号插槽的键列表:cluster getkeysinslot 12182 10
(4)对第3步获取的每个键执行migrate命令,将其从127.0.0.1:8001迁移到127.0.0.1:8000
(5)执行cluster slot 12182 node 127.0.0.1:8000的运行ID来完成迁移
127.0.0.1:8000> cluster setslot 12182 importing 6eea8395cc4f8ba4dd1885a7f4b2a05b8cf3948c
OK
第四步之后,第五步之前
127.0.0.1:8001> get foo
(error) ASK 12182 127.0.0.1:8000
127.0.0.1:8000> get foo
(error) MOVED 12182 127.0.0.1:8001
在8001端口迁移原来8001端口持有的12182插槽不管用
127.0.0.1:8001> cluster setslot 12182 migrating 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
127.0.0.1:8001> migrate 127.0.0.1 8000 foo 0 15999 replace
OK
127.0.0.1:8001> get foo
(error) ASK 12182 127.0.0.1:8000
要在8000端口操作
127.0.0.1:8000> cluster setslot 12182 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8000> get foo8
"bar"
4. 获取插槽对应节点
正常用命令行客户端进有提示信息
127.0.0.1:8000> set a a
(error) MOVED 15495 127.0.0.1:8001
启动命令行客户端时添加-c可以自动重定向
[root@localhost ~]# redis-cli -c -p 8000
127.0.0.1:8000> set a a
-> Redirected to slot [15495] located at 127.0.0.1:8001
OK
5. 故障恢复
和哨兵类似
如果一个至少负责一个插槽的主数据库下线且没有相应的从数据库可以进行故障恢复,则整个集群下线且无法正常工作。如果这时想让集群正常工作,修改cluster-require-full-coverage no.
主库下线后从数据库升级为主数据库,主数据库要使用redis-server redis.conf的方式重启会自动成为原来它从库的从数据库