这篇Redis 集群部署笔记参考的书籍资料是:
《Redis入门指南》第二版,作者:李子骅 第8章
《Redis开发与运维》 作者:付磊 第10章
以及博客园的博文:https://www.cnblogs.com/kevingrace/p/7910692.html
以下是学习笔记,记录了Redis集群部署过程,这篇文档里,讲解通过使用Redis Commands 命令来部署集群,大家也可以用redis-trib.rb 这个集群管理工具,来操作Redis集群部署。
操作环境准备了6台虚拟机,因为Redis 集群里至少需要3个master数据库才能正常运行。 所以这个架构是3主3从。
IP | 端口 | 功能 |
---|---|---|
192.168.100.4 | 6379 | master |
192.168.100.5 | 6380 | master |
192.168.100.6 | 6381 | master |
192.168.100.7 | 6382 | slave |
192.168.100.8 | 6383 | slave |
192.168.100.9 | 6384 | slave |
各结点对应关系
master | slave |
---|---|
192.168.100.4 | 192.168.100.7 |
192.168.100.5 | 192.168.100.8 |
192.168.100.6 | 192.168.100.9 |
1.部署前的准备工作
(1)确保每个redis 结点里没有数据。
(2)每台机器的防火墙,进行配置,或者关掉。(我在虚拟机里关掉了防火墙)
(3)每台redis 配置文件里,bind 127.0.0.1 这一行注释掉
(4)每个Redis结点的port 设置成不一样的。(多台机器里,这个看个人习惯)
2.正式部署集群
首先进行通用配置修改,在每台Redis结点的配置文件redis.conf 中修改如下配置内容:
port 6379
daemonize yes //开启守护进程
logfile "/var/log/server/redis.log" //日志
requirepass lafenfen //设置密码
masterauth lafenfen //如果requirepass设置了,masterauth也必须要保持一样,否则无法同步。
cluster-enabled yes //开启集群模式
cluster-config-file nodes-6379.conf //每台机器的集群配置文件,不需要人工修改,程序自动记录,这块名字可以根据端口号进行设置。
cluster-node-timeout 15000 //单位是毫秒,如果在15秒还没有响应,结点会被认为出了故障。
配置完成后,分别启动Redis服务
./redis-server ../config/redis.conf
可以看到cluster字样
ps aux|grep redis |grep -v 'grep'
root 3008 0.0 0.6 156552 3300 ? Ssl 06:12 0:04 ./redis-server *:6379 [cluster]
各台主机的Redis服务启动后,现在开始操作结点
3添加结点到集群
登陆192.168.100.4这台机器,连接redis
./redis-cli
auth lafenfen
127.0.0.1:6379> info cluster
# Cluster
cluster_enabled:1
使用CLUSTER MEET 命令,将其余五台服务器,添加到一个集群圈里。
127.0.0.1:6379> cluster meet 192.168.100.5 6380
OK
127.0.0.1:6379> cluster meet 192.168.100.6 6381
OK
127.0.0.1:6379> cluster meet 192.168.100.7 6382
OK
127.0.0.1:6379> cluster meet 192.168.100.8 6383
OK
127.0.0.1:6379> cluster meet 192.168.100.9 6384
然后输入命令 cluser nodes 查看当前结点关系
可以采用联想法在大脑里记忆,集群节点开大会。 meet就是会议的意思。
每个节点被添加后,都会随机产生一个角色(master或slave)
通过cluser nodes命令查看各节点的身份信息,6个节点都是master 这个角色。
一会将使用命令手动修改节点的角色,现在我开始准备分配插槽。
4.分配插槽
关于插槽的概念是这样的。
在Redis Cluster 将把所有的数据映射到16384个槽中。我们使用redis时,创建的每个key会映射到一个固
定的插槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过
cluster addslots命令为指定的master主节点分配插槽。
命令:CLUSTER ADDSLOTS slot [slot ...]
在未分配插槽前,cluster info 显示集群信息,下图红线处代表插槽分配数量为0
现在给100.4 100.5 100.6 这三台Redis结点分配插槽。登陆100.4服务器
先给100.4自己分配,IP地址直接用127.0.0.1 就行
./redis-cli -h 127.0.0.1 -p 6379 -a lafenfen cluster addslots {0..5461}
//其余两台注意,要加上IP地址,和指定端口号
./redis-cli -h 192.168.100.5 -a lafenfen -p 6380 cluster addslots {5462..10922}
./redis-cli -h 192.168.100.6 -a lafenfen -p 6381 cluster addslots {10923..16383}
执行命令时,会有下面的提示,可以忽略。
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
注意:上面的{0..5461} 表示范围时{}里是两个点(..),这块不要写错。
连接redis服务器,查看插槽分配情况
# 前两项代表插槽开始和结束的点
127.0.0.1:6379> cluster slots
1) 1) (integer) 0
2) (integer) 5461
3) 1) "192.168.100.4"
2) (integer) 6379
3) "cf685d370fb79383fa30832c4035d73b51d33d7a"
2) 1) (integer) 5462
2) (integer) 10922
3) 1) "192.168.100.5"
2) (integer) 6380
3) "1a73ba8c6367e4c592b49c60d7aef29ccf0687bb"
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "192.168.100.6"
2) (integer) 6381
3) "177749c1c7988f5cf8edd32cc153f32ce596b445"
5.修改节点角色
通过命令修改指定节点的身份,让它从master变为slave
CLUSTER REPLICATE <master node_id>
登陆指定节点服务器,然后运行上面的命令,其中的node_id 就是指定主节点的运行ID
在我的规划里 3主3从的对应结点关系如下
master | slave |
---|---|
192.168.100.4 | 192.168.100.7 |
192.168.100.5 | 192.168.100.8 |
192.168.100.6 | 192.168.100.9 |
现在100.4 的集群运行id 为 b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15
我要配置100.7 让它变成100.4 的slave结点
登陆100.7服务器上的redis
./redis-cli
cluster replicate b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15
OK
这样就设置成功。其余100.8,100.9也依样修改操作。
最后各结点的对应关系如下:
cluster nodes
dd42566f143bdf4731fbaa22fb1160634b310a7a 192.168.100.5:6380@16380 master - 0 1623805285501 0 connected 5462-10922
646e942d30a4ad0b17eb805839b2462edcde57e3 192.168.100.8:6383@16383 slave dd42566f143bdf4731fbaa22fb1160634b310a7a 0 1623805288520 4 connected
76c42fc6a375283d5e13c264ed197070edafa2ba 192.168.100.7:6382@16382 slave b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15 0 1623805287514 3 connected
b5a9577be8bf4aadcdaaa41aef41c8e311fa8b15 192.168.100.4:6379@16379 myself,master - 0 0 1 connected 0-5461
7cb96ccf3ae2acc59804e7e5be42d15bde5eea38 192.168.100.6:6381@16381 master - 0 1623805288017 2 connected 10923-16383
9a6cabdead853aa1da579d5984ef78ded0c4894e 192.168.100.9:6384@16384 slave 7cb96ccf3ae2acc59804e7e5be42d15bde5eea38 0 1623805289529 5 connected
127.0.0.1:6379>
到此集群配置工作完成,可以开始使用了。
6、使用集群
Redis 将每个键的键名的有效部分使用CRC16算法计算出hash值,然后取16384的余数,使得每个键可以分配到16384个插槽中的某一个里。
其中有效部分是指:
(1) 键名包含{}符号时,例如 name:{zhangsan} 这种键名,将取zhangsan 做有效部分,然后CRC16算法计算出zhangsan的hash值
(2) 如果不满足上一条规则时,将么整个键 就被视为有效部分
在192.168.100.4 的Redis服务器上,执行set命令
127.0.0.1:6379> set a b
(error) MOVED 15495 192.168.100.6:6381
127.0.0.1:6379>
提示a 这个变量写入,应该到100.6的机器上操作
在100.6服务器上执行命令
127.0.0.1:6381> set a b
OK
同时登陆它的从数据库100.9,可以看到数据在这里做了备份。
127.0.0.1:6384> keys *
1) "a"
127.0.0.1:6384> get a
(error) MOVED 15495 192.168.100.6:6381
127.0.0.1:6384>
redis-cli客户端命令提供了参数 -c ,它支持自动重定向,比较方便。
Cluster 故障恢复
当某个master节点出现故障时,对应的slave节点会成为新的master节点。如果有多个slave节点时,会通过选举,选出一个做为新的master节点。
但是一个至少负责一个插槽的主数据库下线且没有相应的从数据库可以进行故障恢复时,整个集群会进入下线状态无法继续工作。
需要将下面的配置,改成no 就不会出现这种情况了。
cluster-require-full-coverage no
集群配置项
(1) cluster-enabled yes 开启集群运行模式
(2) cluster-config-file nodes-6379.conf 集群配置文件
这里记录的内容和执行 cluster nodes 命令看到的是一样的。
这个文件程序自动添加和更新,不需要人工处理。
dd42566f143bdf4731fbaa22fb1160634b310a7a 192.168.100.5:6380@16380 master - 0 1623805285501 0 connected 5462-10922
第1列:结点的运行ID,它是集群中的唯一标识。
第2列:IP和端口号
第3列:角色 master 或者slave
最后一列:是分配的插槽起始和结束范围。
(3)cluster-node-timeout 15000
单位:毫秒
集群中的各结点,会对其它结点进行ping操作,
当超出 cluster-node-timeout 选项的时间,还没有反应,就疑似这个结点出了故障。
(4)cluster-replica-validity-factor 10
(5)cluster-migration-barrier 1
(6)cluster-require-full-coverage yes
说明:
当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群下线,状态不可用。
可以设置为no,将忽略这个影响。
这块有相关技术人员做了试验,可以看下链接:
https://www.qedev.com/bigdata/866.html
(7)cluster-replica-no-failover no
集群操作命令整理
集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键 。