目录
第 15 章:复制
使用SLAVEOF命令让一个服务器去复制另一个服务器,被复制的是主服务器,进行复制的是从服务器;
复制的方法:
-
同步:
-
完整重同步(SYNC):适用于第一次进行数据库复制或者更改复制的主数据库,将数据库整体复制,较为花时间;
-
部分重同步(PSYNC):适用于从服务器断线之后重连的情况,只复制断开期间执行的命令;
-
-
命令传播:适用于主从服务器的数据库状态一致后,对主服务器执行的命令发送到从服务器;
部分重同步的实现:
-
复制偏移量:
-
主从服务器都维护一个复制偏移量,记录当前执行命令的字节数,在主服务器执行命令、从服务器复制的时候更改
-
可以记录从服务器相较于主服务器缺少的命令有多少
-
-
复制积压缓冲区:
-
默认为1M的固定长度先进先出队列;
-
在服务传播的时候,会记录传播的命令。这样如果主从服务器复制偏移量之差小于1M的情况下,只需要将缺少的命令从缓冲区复制到从服务器即可,不用完整重同步;
-
-
服务器运行ID:
-
每个服务器开启时都有一个随机的ID,从服务器会记录主服务器的ID。断线重连的时候会带上之前的主服务器ID,如果主服务器ID与接收到的ID一致,就可以确定发送方是从服务器,然后根据复制偏移量之差决定是否采用部分重同步。
-
复制的实现:
-
设置主服务器的地址和端口、建立套接字连接、发送PING命令、身份验证(masterauth密码验证)、发送端口信息、同步、命令传播
心跳检测:
-
在命令传播阶段,从服务器会以每秒一次的频率向主服务器发送命令;
-
检测主从服务器的网络连接状态:主从服务器可以通过发送和接收REPLCONF ACK命令来检查两者之间的网络连接是否正常:如果主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了;
-
辅助实现min-slaves配置选项
-
检测命令丢失
第 16 章:Sentinel
Sentinel(哨岗、哨兵)是Redis的高可用性( high availability)解决方案:
-
由一个或多个Sentinel 实例(instance)组成的Sentinel系统( system)可以监视任意多个主服务器以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
哨兵模式启动流程:
-
初始化服务器:sentinel 本质上还是一个特殊的redis服务器,所以需要先初始化服务器,但与普通的redis服务器有所区别,如sentinel 不需要使用RDB、AOF文件来还原数据库状态;
-
使用sentinel 专用代码:用sentinel 专用代码替换普通redis服务器的代码(所以redis的命令对哨兵可能是无效的),如sentinel 默认端口是26379;
-
初始化sentinel 状态:在应用了Sentinel的专用代码之后,接下来,服务器会初始化一个sentinel.c/sentinelState结构(后面简称“Sentinel状态”),这个结构保存了服务器中所有和Sentinel功能有关的状态(服务器的一般状态仍然由redis.h/redisServer结构保存);
-
初始化sentinel状态的master属性:
-
Sentinel状态中的masters字典记录了所有被Sentinel监视的主服务器的相关信息,其中字典的键是被监视主服务器的名字。而字典的值则是被监视主服务器对应
-