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<yes/no>:如果是,则在特定的Redis实例中启用Redis Cluster支持。否则,该实例将像往常一样作为独立实例启动。
cluster-config-file<filename>:请注意,尽管有此选项的名称,但它不是用户可编辑的配置文件,而是Redis Cluster节点每次发生更改时都会自动保留集群配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了诸如群集中其他节点之类的内容,它们的状态,持久变量等等。通常,由于收到某些消息,此文件将被重写并刷新到磁盘上。
cluster-node-timeout<milliseconds>:Redis群集节点不可用的最长时间(不被视为失败)。如果主节点无法访问的时间超过指定的时间长度,则其主节点将对其进行故障转移。此参数控制Redis Cluster中的其他重要事项。值得注意的是,在指定的时间内无法到达大多数主节点的每个节点都将停止接受查询。
cluster-slave-validity-factor<factor>:如果设置为零,则从服务器将始终认为自己是有效的,因此将始终尝试对主服务器进行故障转移,而与主服务器和从服务器之间的链接保持断开状态无关。如果该值为正,则将最大断开时间计算为节点超时值乘以此选项提供的因子,如果节点是从节点,则如果断开主链接的时间超过指定的时间,它将不会尝试启动故障转移。例如,如果节点超时设置为5秒,而有效性因子设置为10,则从服务器与主服务器断开连接超过50秒将不会尝试对其主服务器进行故障转移。请注意,如果没有从属设备可以对其进行故障转移,则任何非零的值都可能导致Redis群集在主设备发生故障后不可用。在这种情况下,只有当原始主服务器重新加入群集后,群集才会恢复可用。
cluster-migration-barrier<count>:主机将保持连接的最小数量的从机,以便另一个从机迁移到不再受任何从机覆盖的主机。有关更多信息,请参见本教程中有关副本迁移的相应部分。
cluster-require-full-coverage<yes/no>:如果设置为yes,默认情况下,如果某个节点未覆盖一定比例的密钥空间,集群将停止接受写入。如果该选项设置为no,即使仅可以处理有关密钥子集的请求,群集仍将提供查询。
cluster-allow-reads-when-down<yes/no>:如果将其设置为no(默认情况下为默认值),则当Redis群集被标记为失败时,或者当节点无法到达时,Redis群集中的节点将停止为所有流量提供服务法定人数的主持人或未达到完全覆盖的情况。这样可以防止从不知道群集更改的节点读取可能不一致的数据。可以将此选项设置为yes,以允许在失败状态期间从节点进行读取,这对于希望优先考虑读取可用性但仍希望防止写入不一致的应用程序很有用。当仅使用一个或两个分片的Redis Cluster时,也可以使用它,因为它允许节点在主服务器发生故障但无法进行自动故障转移时继续为写入提供服务。
-
再创建其他集群的配置文件
[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* root@172.16.153.179:/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 掉的主节点重新上线后会成为新主节点的从节点。