多机数据库
一: 数据库复制
1: 旧版复制
1.1 介绍:包含同步和命令传播两个操作
1.2 流程:
1.2.1 同步
从服务器向主服务器发送sync命令
收到sync命令的主服务器执行bgsave,在后台生成一个rdb文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
当主服务器的bgsave命令执行完毕时,主服务器将bgsave命令生成的rdb文件发送给服务器,从服务器接受并载入这个rdb文件,将自己的数据库状态更新至主服务器执行bgsave命令时的数据库状态。
主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令。
![](https://img.haomeiwen.com/i9950809/d61c50b6afcad4bd.png)
1.2.2 命令传播
为维持主从服务器一致性,主服务器将命令发送给从服务器
![](https://img.haomeiwen.com/i9950809/a7eb3773cb2d2bce.png)
1.3 缺陷
从服务器断线重连时,依然需要发送rdb文件和缓存的命令。实际上只需要返回从断线开始到重新连接的命令缓存。
sync命令是一个非常浪费资源的操作。
2: 新版复制
2.1 介绍
使用psync命令代替sync命令来执行复制时的同步操作。psync具有完整重同步和副本重同步两种模式
完成重同步的执行步骤和sync命令一本一样。
部分重同步用于断线后重复制情况:服务器重连到主服务器时,如条件允许,主服务器将连接断开期间执行的写命令发送给从服务器,
2.2 概念
2.2.1 主服务器的复制偏移量和从服务器的复制偏移量
主服务器每次向从服务器发送n个字节的数据,就将自己的复制偏移量增加n
从服务器每次收到主服务器发送的n个字节数据时,就将自己的复制偏移量增加n
如果主从服务器的复制偏移量相等,则主从服务器一致。
2.2.2 主服务器的复制积压缓冲区
固定大小的先进先出队列,默认大小1m
主服务器将数据发送给从服务器时,会将数据插入队列。
从服务器掉线后重连,发送自己的偏移量给主服务器,如果缓冲区中有该偏移量,主服务器执行部分重同步操作
如果缓冲区中没有该偏移量,主服务器执行完整重同步操作。
2.2.3 服务器的运行ID
不论主从服务器,都有自己的id。
主从服务器初次复制时,主服务器将自己的id发送给从服务器;
从服务器断线重连上一个主服务器时,发送自己保存的主服务器ID,主服务器检查自己的id是否等于从服务器发来的ID,如果相等,继续判断;如果不等,进行完整重同步操作
2.3 psync 命令流程
![](https://img.haomeiwen.com/i9950809/70fc949818b2431a.png)
3: 复制的实现
通过向从服务器发送slaveof命令,可以让一个从服务器去复制一个主服务器
slaveof 127.0.0.1 6379
3.1 步骤
3.1.1 :设置主服务器的地址和端口
3.1.2:建立套接字连接
![](https://img.haomeiwen.com/i9950809/44aaf83657ba36af.png)
3.1.3:发送ping命令,检查套接字连接是否正常。
![](https://img.haomeiwen.com/i9950809/eb37a5ed56c64870.png)
![](https://img.haomeiwen.com/i9950809/35aef9030756c488.png)
3.1.4 身份验证
3.1.5 发送端口信息
![](https://img.haomeiwen.com/i9950809/8dd203af3315be87.png)
3.1.6同步
从服务器向主服务器发送psync命令,执行同步操作
注意:执行同步步骤前,主服务器是从服务器的客户端,执行同步后,主从互为客户端。
3.1.7 命令传播
同步完成之后,主服务器不断向从服务器传播自己的写操作。
4: 心跳检测
命令传播阶段,从服务器默认会每秒一次,向主服务器发送命令replconf ack <replication_offset>
4.1 作用
4.1.1 检测主从服务器的网络连接状态。超过1秒,说明主从服务器之间的连接出现了故障。
4.1.2 辅助实现min-slaves选项
min-slaves-to-write 和 min-slaves-max-lag两个选项,如过配置是如下所示:
![](https://img.haomeiwen.com/i9950809/f8e618be53d4f76d.png)
当从服务器数量小于三个,或从服务器的延迟值都大于等于10秒时,主服务器将拒绝执行写命令。
4.1.3 检测命令丢失
根据复制偏移量,检查命令丢失。
二: sentinel 哨兵
1: 介绍
监视,处理
2: 包含内容
获取主服务器信息
获取从服务器信息
向主服务器和从服务器发送信息
接受来自主服务器和从服务器的频道信息
检测主观下限状态
检查客观下线状态
选取主sentinel
故障转移:更换主服务器
3: 图示
![](https://img.haomeiwen.com/i9950809/07ace96611e58d6c.png)
![](https://img.haomeiwen.com/i9950809/d34feb33bdc3578d.png)
![](https://img.haomeiwen.com/i9950809/61e0abbfb96640d4.png)
四:特性
sentinel只是一个运行在特殊模式下的redis服务器,它使用了和普通模式不同的命令表
sentinel会读取用于指定的配置文件,为每个要被监视的主服务器创建响应的实力结构,并创建联想主服务器的命令连接和订阅连接
sentinal通过向主服务器发送info来获得主服务器树下所有从服务器的地址信息,并为这些从服务器创刊相应的实例结构。以及命令连接和订阅连接
sentinal一般情况下,每10秒向监视对象发送info。
对于多个sentinal监视同一个服务器,sentinal会以2秒一次的频率向对方宣告自己的存在
每个sentinal会从_sentinal:hello 频道中接受其他sentinel发送的信息,并创建实例结构和命令连接
sentinal10秒间隔,向监视对象发送ping命令,判断是否在线。如果不在线,判断为主观下限。
sentinal收集到足够多的主观下线投票之后,会将主服务器判断为客观下线,并发起一次针对主服务的故障转移操作。
三 集群
1: 介绍
redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。
包含:节点、槽纸牌、命令执行、重新分片、转向、故障转移、消息等
2: 节点
![](https://img.haomeiwen.com/i9950809/19acf7be8df9f712.png)
参考:《redis设计与实现》