三、 集群
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:请注意,尽管有此选项的名称,但它不是用户可编辑的配置文件,而是Redis Cluster节点每次发生更改时都会自动保留集群配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了诸如群集中其他节点之类的内容,它们的状态,持久变量等等。通常,由于收到某些消息,此文件将被重写并刷新到磁盘上。
cluster-node-timeout:Redis群集节点不可用的最长时间(不被视为失败)。如果主节点无法访问的时间超过指定的时间长度,则其主节点将对其进行故障转移。此参数控制Redis Cluster中的其他重要事项。值得注意的是,在指定的时间内无法到达大多数主节点的每个节点都将停止接受查询。
cluster-slave-validity-factor:如果设置为零,则从服务器将始终认为自己是有效的,因此将始终尝试对主服务器进行故障转移,而与主服务器和从服务器之间的链接保持断开状态无关。如果该值为正,则将最大断开时间计算为节点超时值乘以此选项提供的因子,如果节点是从节点,则如果断开主链接的时间超过指定的时间,它将不会尝试启动故障转移。例如,如果节点超时设置为5秒,而有效性因子设置为10,则从服务器与主服务器断开连接超过50秒将不会尝试对其主服务器进行故障转移。请注意,如果没有从属设备可以对其进行故障转移,则任何非零的值都可能导致Redis群集在主设备发生故障后不可用。在这种情况下,只有当原始主服务器重新加入群集后,群集才会恢复可用。
cluster-migration-barrier:主机将保持连接的最小数量的从机,以便另一个从机迁移到不再受任何从机覆盖的主机。有关更多信息,请参见本教程中有关副本迁移的相应部分。
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-trib.rb
工具已经弃用
使用如下命令创建集群
redis-cli --cluster create --cluster-replicas 1 主节点1的IP:端口 主节点2的IP:端口 主节点3的IP:端口 从节点1的IP:端口 从节点2的IP:端口 从节点3的IP:端口
选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
redis-cli --cluster create --cluster-replicas 1 172.16.153.178:7001 172.16.153.178:7002 172.16.153.178:7003 172.16.153.179:7011 172.16.153.179:7012 172.16.153.179:7013
验证
[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-trib.rb add-node new_host:new_port existing_host:existing_port
// new_host:new_port 为新添加的节点信息
// existing_host:existing_port 集群中任意节点的信息
添加一个新节点为从节点
redis-trib.rb add-node --slave --master-id 主节点的 ID new_host:new_port existing_host:existing_port
主节点 ID 可以使用如下命令查看,此命令还同时输出了各个节点的角色
redis-trib.rb check host:port
// host:port 为集群中任意节点的信息
例如:
加入一个主节点到集群中
[root@s1 redis]# redis-trib.rb add-node 172.16.153.182:7004 172.16.153.182:7002
加入一个从节点到集群中
- 获取刚才新加入的主节点信息
[root@s1 redis]# redis-trib.rb check 172.16.153.182:7002
- 添加从节点到集群中,并指定他的主节点
[root@s1 redis]# redis-trib.rb add-node --slave --master-id 7be2d3d7d25112178ea5cdd3c218bbb2298b62ee 172.16.153.181:7014 172.16.153.182:7001
- 向新加入的主节点中分配槽
- 完成后观察各主节点的数据槽的分配情况
减少节点(缩容)
缩容时的迁移槽
忘记节点操作
实验
命令:
./redis-trib.rb reshard --from 下线节点 ID --to 集群中的任意主节点 ID --slots 迁移到槽数 目前集群中任意节点 IP:端口
注意:
需要把下线节点的槽数平均迁移到剩余的所有节点,所以需要分批分次执行上面的命令。
并且,每次都集群中的主节点应该不同。
删除节点
当我们使用 redis-trib.rb
工具时,只需要在目前集群中的任意一个节点中执行如下命令即可。
注意:
你应该始终先删除从节点,再删除主节点