1、简介
在之前的文章里,通过主从复制和哨兵机制实现Redis 高可用架构,但是由于架构比较复杂,难以维护,引入集群架构模式,一个集群可以有多个 master ,一个master 可以有多个slave,集群支持故障转移机制,内置高可用支持,无需使用哨兵功能。
Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis先对key使用crc16算法算出一个结果然后用结果对16384求余数[ CRC16(key) % 16384],这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。
2、集群搭建
2.1、集群搭建
# 1、构建集群命令
redis-cli -a 密码 --cluster create --cluster-replicas 1 192.168.30.88:6381 192.168.30.88:6382 192.168.30.89:6383 192.168.30.8:6384 192.168.30.90:6385 192.168.30.90:6386
--cluster-replicas 1 # 表示为每个master创建一个slave节点(6个节点三主三从)
# 2、查看主从复制关系
info replication
# 3、集群信息
cluster info
# 4、查看集群节点
cluster nodes
# 5、优化路由(当保存key的时候,slot不在当前节点会报错,添加-c参数)
redis-cli -a 密码 -p 端口 -c
# 6、查看key对应slot
cluster keyslot k1
# 7、节点从属调整/手动故障转移
cluster failover
2.2、集群扩容操作
# 1、增加节点到集群
redis-cli -a 密码 --cluster add-node 新节点ip:端口 集群里master的ip:端口
# 新节点ip:端口 (作为master 新增节点,此时未分配槽位)
# 集群里master的ip:端口 (原来集群领路人,引导新节点添加到集群)
# 2、检查集群
redis-cli -a 密码 --cluster check 集群里master的ip:端口
# 3、重新分配槽位
redis-cli -a 密码 --cluster reshard 集群里master的ip:端口
# 4、为新增master节点添加slave
redis-cli -a 密码 --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
注:扩容分配槽位,是从原有槽位划分出来的,不是再重新分配。
2.3、集群缩容操作
# 1、检查集群,获取slave节点的id
redis-cli -a 密码 --cluster check 从机ip:端口
# 2、删除从节点
redis-cli -a 密码 --cluster del-node 从机ip:端口 从机节点ID
# 3、将删除的节点槽位给指定节点
redis-cli -a 111111 --cluster reshard 指定节点ip:端口
# 4、将主节点删除
redis-cli -a 密码 --cluster del-node ip:端口 主节点ID
3、Redis 集群各种情况解释
1)、当 master 节点宕机时,其 slave 节点会变成 master 节点,当 master 节点重启后,以 slave 身份回归;
2)、Redis 集群不是强一致性,在特定条件下可能会丢失一些写命令;
3)、master 节点提供读写,slave 只提供读。
4)、Redis 为什么采用16384个槽位:因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。在消息头中最占空间的是myslots[CLUSTER_SLOTS/8]。 当槽位为65536时,这块的大小是: 65536÷8÷1024=8kb ;当槽位为16384时,这块的大小是: 16384÷8÷1024=2kb 。
4、总结
本文详细介绍 Redis 集群含义,以及如何进行集群搭建、集群扩容、集群缩容进行详细操作说明,帮助大家快速完成集群搭建和 Redis 集群运维。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)