目录
Redis 有三种集群模式,分别是:主从模式、哨兵模式、Cluster 模式。
Rdis 最开始使用主从模式做集群,若 master 宕机,需要手动配置 slave 转为 master
为了高可用后来提出来哨兵模式,该模式下有一个哨兵集群监视 master 和 slave,若 master 宕机可自动将 slave 转为 master
但哨兵模式有一个问题,就是内存有限,写性能上限为单点,不能扩容;所以 Redis 在 3.x 后,官方发布了 cluster 集群模式
集群模式 | 特性 | 缺点 | 代表产品 |
主从模式 | 通过主从模式可以提升读性能 | 故障时需要手工切换,内存瓶颈 | 主从 |
哨兵模式 | 仍然采用主从模式,增加了从自动转主功能 | 故障主从可自动切换,但是写性能仍有限,内存瓶颈 | 哨兵 |
代理模式 | 通过代理进行节点路由,达到水平扩展 | 某些原生命令不支持,代理降低部分性能, 某些不支持最新 Redis 功能 | Twemproxy、Codis |
集群模式 | 数据分布式存储、节点水平扩容、故障自动转移 | 需要轻量级客户端计算路由 | 最新集群 |
在主从复制中,Redis 数据库分为两种角色:主数据库(master)和从数据库(slave),从可以是多个
1. 主数据库可以进行读写操作,当读写操作导致数据变化时会自 动将数据同步给从数据库
2. 复制的数据流是单向的,只能由主节点复制到从节点。
3. 从数据库一般都是只读的,并且接收主数据库同步过来的数据
4. 一个 master 可以拥有多个 slave,但是一个 slave 只能对应一个 master
5. slave 挂了不影响其他 slave 的读和 master 的读和写,重新启动后会将数据从 master 同步过来
6. master 挂了以后,不影响 slave 的读,但 redis 不再提供写服务,master 恢复后 redis 将重新对外提供写服务
7. master 挂了以后,不会在 slave 节点中重新选一个 master
场景 | 实现方式 | 说明 |
第一次启动 | sync 复制 | 全量复制 |
正常运行 | 缓冲区复制 | 增量复制 |
第二次启动 | sync 复制 | 全量复制,短暂的停启会对主造成较影响 |
场景 | 实现方式 | 说明 |
第一次启动 | psync 复制 | 全量复制 |
正常运行 | 缓冲区复制 | 增量复制 |
第二次启动((Master 缓冲区未溢出) | 缓冲区复制 | 部分复制,短暂的停启不会对主造成影响 |
Redis>=2.8 第二次启动(Master | psync 复制 | 全量复制 |
无是哪种场景,Redis 的主从复制机制均采用异步复制,也称为乐观复制,因此不能完全保证主从数据的一致性。
总体思路: 先RDB 再 类AOF 发送补充指令
1. 当 slave 启动后或者断开重连后,会向 master 发送 sync 命令
2. master 节点收到 sync 命令后会开始在后台保存快照(即 RDB 持久化,主从复制时会触发 RDB),并将保存快照期间接收到的命令缓存起来
3. master 节点执行 RDB 持久化完后,向所有 slave 节点发送快照 RDB 文件,并在发送快照期间继续记录被执行的写命令
4. slave 节点收到快照文件后丢弃所有旧数据(会清空所有数据),载入收到的快照
5. master 节点快照发送完毕、slave 节点载入快照完毕后,master 节点开始向 slave 节点发送缓冲区中的写命令
6. master 节点完成对快照的载入,开始接收命令请求,并执行来自主数据库缓冲区的写命令。(从数据库初始化完成)
7. 后续 master 节点每执行一个写命令就会向 slave 节点发送相同的写命令,slave 节点接收并执行收到的写命令
总体思路:判断是否是第一次同步,以及缓存区是否溢出,来决定是不是全量同步。
1. 当 slave 启动后或者断开重连后,slave 根据自己是否保存 Master runid 来判断是否是第一次连接
2. 如果是第一次同步则向 Master 发送 psync -1 命令来进行全量同步;如果是重连接,则发送 PSYNC runid offset 命令(runid 是身份 ID,offset
是从节点同步命令的全局迁移量)
3. Master 接收到 PSYNC 命令后,首先判断 runid 是否和本机的 id 一致,同时会判断 offset 偏移量有没有超过复制积压缓冲区大小,如果没有那
么就给 Slave 发送 CONTINUE,此时 Slave 只需要等待 Master 传回失去连接期间丢失的命令。
4. 如果 runid 和本机 id 不一致或者 offset 偏差超过了复制积压缓冲区大小,那么就会返回 FULLRESYNC runid offset,Slave 将 runid 保存起来,
并进行全量同步
5. 后续过程中,主数据库会将每一个写命令传递给从数据库的同时,都会将写命令存放到复制积压队列,并记录当前积压队列中存放命令的全局
偏移量 offset。当 salve 重连接时,会从复制积压队列进行增量复制。
谁从谁配
在6380 的 redis.conf 中我们增加如下配置,代理 6380(从)追随 6379(主)
replicaof 192.168.128.167 6379
分别启动 192.168.128.167:6379,192.168.128.167:6380,连接 6380 端口,输入如下命令
replicaof 192.168.128.167 6379
一般这种模式需要回写配置,通过 config rewrite 命令,将内存中的配置重写写入 redis.conf
如果想断开,输入
replicaof no one,然后再执行 config rewrite
如果想切换新主节点
slaveof 新 ip 新 port
1. 断开与旧主节点主从关系。
2. 与新主节点建立主从关系。
3. 删除从节点当前所有数据。
4. 对新主节点进行复制操作。
在 6380 进程启动时加入参数
./redis-server ../conf/redis_6380.conf --replicaof 192.168.128.167 6379