Redis集群
1 概念
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1N。Redis集群通过分区( partition )来提供一定程度的可用性 ( availability ) :即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
2 Redis集群搭建
(1)清空rdb等持久化文件
(2)创建redis6379.conf、redis6380.conf、redis6381.conf、redis6389.conf、redis6390.conf、redis6391.conf六个配置文件,并进行配置修改
以6379为例,在基础配置上再添加几个集群配置
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
同理,配置其他五个文件,只不过把6379改为对应的id
(3)启动6个redis服务
检查开启状态
查看nodes-xxxx.conf文件正确生成
(4)将6个节点合成一个集群
首先进入redis安装目录中的src目录下,此处我的redis安装在/opt下
使用redis-cli --cluster create --cluster-replicas 1 192.168.33.11:6379 192.168.33.11:6380 192.168.33.11:6381 192.168.33.11:6389 192.168.33.11:6390 192.168.33.11:6391
–replicas 1表示采用最简单的方式配置集群,一台主机,一台从机,正好三组
之后会询问是否接受这种分配方式,yes即可
如果出现一些问题,可以使用redis-cli --cluster fix 192.168.33.11:6379 这个命令来修复出问题的节点
redis-cli --cluster check 192.168.33.11:6379可以检查节点出现了什么问题
(5)连接集群
通过redis-cli -c -p 6379连接,-c表示采用集群策略连接,设置数据会自动切换到相应的主机,因为redis集群采用无中心连接方式,所以用任何一个节点进行连接都可以,即命令中的6379可以换成其他的端口号,如6380
(6)查看节点信息
通过 cluster nodes可以查看集群内节点信息
3 什么是slots
一个Redis集群包含16384 个插槽(hash slot),数据库中的每个键都属于这16384个插槽的其中一个。
集群使用公式CRC16(key) % 16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。集群中的每个节点负责处理一部分插槽
向集群内插入k1 v1,经过计算,数据应该插入在12706这个插槽中,但是6379这个节点维护的是0-5460的插槽,12706并不在这个范围内,查找到在6381维护的范围内,所以直接插入到6381维护的插槽中,此时自动切换到6381节点
可以使用cluster keyslot [key]来计算该key在哪个插槽
使用cluster countkeysinslot [slot]可以查看该插槽内键的数量
cluster getkeysinslot [slot] [count] 返回count个slot插槽中的键
4 故障恢复
如果主机宕机,从机会代替原主机成为主机,如果原主机再次连接,会成为从机。
如果某一段插槽的主从都宕机,而配置文件中cluster-require-full-coverage配置为yes,那么整个集群都挂掉,而如果是no,那么该插槽数据全部不能使用,也不能存储