Redis主从复制、哨兵与集群架构详解
一、主从复制架构
1、主从复制架构说明
主从复制架构只能用来解决数据的冗余备份,只有master节点可以接受客户端的请求并执行写入操作,而slave节点仅仅做数据的同步,客户端无法将数据写入到从节点中。因为主从复制架构无法保证主节点宕机时的自动故障转移即高可用。
2、主从复制架构原理图
3、主从复制架构的搭建
在从节点的配置文件中增加下面的配置,表示自己是同步的是指定主节点的数据。
此处展示的是Redis5.0.5版本的配置,使用的是replicaof
,而Redis4.0.10使用的配置是slaveof
。
需要先关闭主节点的防火墙,使用service firewalld stop
,不然从节点开启Redis服务的时候会报错。
二、哨兵架构
1、哨兵结构说明
哨兵架构是基于之前的主从复制架构的,sentinel机制是Redis的高可用解决方案:由一个或多个哨兵(sentinel)组成的sentinel系统可以监视任意多个主从架构,当被监视的主服务器宕机的时候,自动将该主服务下的某个从服务器升级为新的主服务器,即使之前的服务器恢复运行也只能当现在主服务器的从服务器了。哨兵架构可以简单地理解为带有自动故障转移功能的主从复制架构。但是这个架构无法解决单节点并发压力以及单节点内存和磁盘物理上限的问题。
2、哨兵架构原理图
3、哨兵架构的搭建
在/usr/redis
目录下整一个配置文件,命名为sentinel.conf,并在配置文件中写入下面配置,表示哨兵监视的是命名为myredis的主从架构,主节点IP是192.168.255.200,端口是6379,启用的哨兵数量是1个。因为在哨兵架构下面,SpringBoot直接连接的是哨兵节点,所以哨兵节点还需要开启远程连接权限,更改bind为0.0.0.0。
使用./redis-sentinel ../sentinel.conf
开启哨兵机制,开启sentinel之前必须保证主从架构是已经开启,并且从节点记得关闭防火墙!
接下来吧200的主节点干掉,可以看到哨兵架构进行了重新投片选举主节点,并且201成为了主节点,原先的200变成了从节点。
三、集群结构
1、集群架构说明
整个集群里面有很多的主节点,主节点下面可能有多个从节点,16384个哈希槽由集群中的所有主节点共同瓜分,且每个主节点至少有一个哈希槽(因为值是由哈希槽维护的),只有所有哈希槽都被分配了,整个集群才能正常工作。
当客户端进行连接的时候,并且要set值得时候,会对这个key进行CRC16计算,计算结果肯定在0-16383之间即哈希槽索引范围内,Cluster集群根据这个索引找到哈希槽所在得主节点,并把值放入其中。
CRC16算法特点:
- 对集群模式下的所有key进行CRC16计算时,结果始终在0-16383之间。
- 对同一个key进行多次的CRC16计算,结果不会改变。
- 不同key的CRC16计算结果可能相同。
2、集群架构原理图
所有Redis的主节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
- 节点的fail是通过集群中超过半数的节点检测失效时才生效。
- 客户端与Redis节点直连,不需要中间proxy层。客户端只需要连接集群中任何一个可用节点即可。
- Redis-cluster把所有的物理节点映射到[0-16383]的哈希槽(slot)上,整个集群负责维护节点->哈希槽->值。
3、集群架构的搭建
Redis4.0.10版本搭建:
先从源码中拷贝处redis-trib.rb
,接着执行下面的指令。
# --replicas x 表示一个主节点需要有x个从节点进行数据的备份
./redis-trib.rb create --replicas 1 192.168.255.200:6379 192.168.255.201:6379 192.168.255.202:6379 192.168.255.203:6379 192.168.255.204:6379 192.168.255.205:6379
Redis5.0.5版本搭建:
./redis-cli --cluster create 192.168.255.200:6379 192.168.255.201:6379 192.168.255.202:6379 192.168.255.203:6379 192.168.255.204:6379 192.168.255.205:6379 --cluster-replicas 1
将原来数据库中的数据全干掉。
结果报错说哈希槽没有分配完,对某个主节点执行./redis-cli --cluster fix 192.168.255.200:6379
即可。
可用./reis-cli --cluster check 192.168.255.201:6379
查看集群的状态,当结果如下图所示时,集群搭建成功。
添加主节点./redis-cli --cluster add-node 新节点 集群中的某个节点
如上图所示,Redis的集群搭建成功!