https://www.jianshu.com/p/faf342b9f01b
三、 集群
1.Redis 集群的优势
自动分割数据到不同的节点上。
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
特点
主从复制
实现了高可用
数据分片存储
集群节点的 meet
过程
指派槽
客户端和槽
3. Redis 集群的安装
原生命令安装
步骤
配置开启集群节点
配置
meet
指派槽
配置主从
实例操作
准备两台虚拟机:
一台启动三个 Redis 实例作为 主节点
另一台启动三个 Redis 实例作为 从节点
架构图
实验步骤
- 先编辑一个集群的配置文件
编译配置文件 /etc/redis/cluster-redis-7001.conf
, 添加如下内容:
bind 0.0.0.0
port 7001
daemonize yes
# 允许任何地址不使用密码访问我
protected-mode no
dir "/redis/data/"
logfile "cluster-7001.log"
dbfilename "cluster-dump-7001.log"
cluster-enabled yes
cluster-config-file cluster-redis-7001.conf
# 不需要集群的全部节点完好才提供服务
cluster-require-full-coverage no
Redis集群配置参数
我们将创建一个示例集群部署。在继续之前,让我们介绍Redis Cluster在redis.conf文件中引入的配置参数。当您继续阅读时,有些会很明显,有些会更清晰。
cluster-enabled
cluster-config-file
cluster-node-timeout
cluster-slave-validity-factor
cluster-migration-barrier
cluster-require-full-coverage
cluster-allow-reads-when-down
-
再创建其他集群的配置文件
[root@s1 redis]# sed 's/7001/7002/g' cluster-redis-7001.conf > cluster-redis-7002.conf
[root@s1 redis]# sed 's/7001/7003/g' cluster-redis-7001.conf > cluster-redis-7003.conf
[root@s1 redis]# sed 's/7001/7011/g' cluster-redis-7001.conf > cluster-redis-7011.conf
[root@s1 redis]# sed 's/7001/7012/g' cluster-redis-7001.conf > cluster-redis-7012.conf
[root@s1 redis]# sed 's/7001/7013/g' cluster-redis-7001.conf > cluster-redis-7013.conf
拷贝从节点的配置文件到另外一台主机上
需要保证另一台主机上有目录 /etc/redis/
, 因为这里计划把所有的配置文件放在此目录下
[root@s1 redis]# scp -r cluster-redis-701* [email protected]:/etc/redis/
- 首先,需要启动主节点的服务进程
[root@s1 ~]# redis-server /etc/redis/cluster-redis-7001.conf
[root@s1 ~]# redis-server /etc/redis/cluster-redis-7002.conf
[root@s1 ~]# redis-server /etc/redis/cluster-redis-7003.conf
- 之后,再启动从节点的服务进程
[root@s2 ~]# mkdir -p /redis/data
[root@s2 ~]# redis-server /etc/redis/cluster-redis-7011.conf
[root@s2 ~]# redis-server /etc/redis/cluster-redis-7012.conf
[root@s2 ~]# redis-server /etc/redis/cluster-redis-7013.conf
检查进程
ps -ef | grep redis-server
假设你现在去连接到任意一个节点上执行操作会返回集群目前是没有启动的信息。
原因是目前集群各节点之间没有进行 meet
操作,都是各自孤立的状态。
可以使用如下命令查看集群的相关信息
还可以查看某一个集群节点信息,第一列是集群节点 ID
查看节点信息
创建集群
redis-cli --cluster create 192.168.122.230:7001 192.168.122.230:7002 192.168.122.230:7003 192.168.122.230:7011 192.168.122.230:7012 192.168.122.230:7013 --cluster-replicas 1
完全配置好后,可以观察集群的数据槽的分配情况
redis-cli -p 7011 cluster slots
最后用客户端登录集群的方式登录到集群中的任意一个节点,设置键值对进行测试。
验证
[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7002 -c set name xiguatian
OK
[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7002 -c get name
"xiguatian"
[root@ela2 ~]# redis-cli -h 192.168.122.106 -p 7003 -c get name
"xiguatian"
[root@ela2 ~]# redis-cli -h 192.168.122.218 -p 7013 -c get name
"xiguatian"
4. 深入集群
集群的伸缩
添加节点(扩容)
-
准备节点
启动两个新的 redis 实例, 分别监听不同端口 比如 7004
和 7014
我这里是分别在两台主机上启动 redis 实例
[root@s1 redis]# cp cluster-redis-7001.conf cluster-redis-7004.conf
[root@s1 redis]# sed -i 's/7001/7004/g' cluster-redis-7004.conf
[root@s1 redis]# redis-server cluster-redis-7004.conf
[root@s2 redis]# cp cluster-redis-7011.conf cluster-redis-7014.conf
[root@s2 redis]# sed -i 's/7011/7014/g' cluster-redis-7014.conf
[root@s2 redis]# redis-server cluster-redis-7014.conf
2.加入集群中
查看帮助信息
redis-cli --cluster help
添加一个新的节点为主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port
// new_host:new_port 为新添加的节点信息
// existing_host:existing_port 集群中任意节点的信息
添加一个新节点为某一个主节点的从节点
redis-cli --cluster add-node 从节点 IP:端口 集群中任意一个节点 ip:端口 --cluster-slave --cluster-master-id 集群中某一个主节点id
主节点 ID 可以使用如下命令查看,此命令还同时输出了各个节点的角色
redis-cli --cluster check 127.0.0.1:7001
- 向新加入的主节点中分配槽
目前redis cli只能在管理员支持的情况下执行reshard, 需要我们自己指定希望重新分配多少插槽
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?
假设,我们这里重新分配 1000 个
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID?
接着,我们应该告诉 Redis 谁接收这次哈希插槽,需要提供某个 master 的 ID
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? 6ab8f7fdfba1758c969e62cf07e584faca657bd5
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.
Source node #1:
这里的意思是重新分配的 1000 插槽由哪些节点提供,这里我们输入 all
, 表示当前集群中所有由插槽的节点都提供一部分。
Moving slot 11254 from 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7
Moving slot 11255 from 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7
Do you want to proceed with the proposed reshard plan (yes/no)? yes
键入 yes
你将会看到分配的过程
- 完成后观察各主节点的数据槽的分配情况
M: 72dd63854cf5cb9ab43d0bf4ca5fa32d5d5e098e 127.0.0.1:7001
slots:[333-5460] (5128 slots) master
1 additional replica(s)
M: 0277d3f664a38bf05fb7bea1bc866f64fce2f3d7 192.168.122.230:7003
slots:[11256-16383] (5128 slots) master
1 additional replica(s)
M: 6ab8f7fdfba1758c969e62cf07e584faca657bd5 192.168.122.230:7004
slots:[0-332],[5461-5794],[10923-11255] (1000 slots) master
1 additional replica(s)
replicates 6ab8f7fdfba1758c969e62cf07e584faca657bd5
M: 4a749969bb98334c5bc950823753c1376179e4b5 192.168.122.230:7002
slots:[5795-10922] (5128 slots) master
减少节点(缩容)
缩容时的迁移槽
忘记节点操作
实验
分配插槽的命令:
./redis-cli --cluster reshard --cluster-from 下线节点 ID --cluster-to 集群中接收插槽的主节点 ID --cluster-slots 迁移到槽数 目前集群中任意节点 IP:端口
注意:
需要把下线节点的槽数平均迁移到剩余的所有节点,所以需要分批分次执行上面的命令。
并且,每次都集群中的主节点应该不同。
删除节点
当我们使用 redis-cli --cluster
工具时,只需要在目前集群中的任意一个节点中执行如下命令即可。
注意:
你应该始终先删除从节点,再删除主节点
redis-cli --cluster del-node 127.0.0.1:7001 8e23a7c0006584ec487c3c8493d53ca519cc68900
测试故障转移
我们可以通过以下命令识别主机并使其崩溃:
redis-cli -p 主节点端口 debug segfault
被执行的 节点会被 down 掉,服务会停止
此时,其对应的从节点会成为主节点。
当被 down 掉的主节点重新上线后会成为新主节点的从节点。