本文用于记录苦啃《Redis设计与实现》后,个人认为有价值的笔记,核心内容均围绕标题展开。既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~
复制
redis中可以通过SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器。
旧版复制功能的实现
复制功能分为,同步、命令传播:
同步
命令传播
保证主服务器被修改后,从服务器可以重新回到一致窗台。
旧版复制的缺陷
新版复制功能的实现
用PSYNC命令代替SYNC命令,PSYNC具有完整重同步和部分冲同步两种模式。
部分重同步的实现
复制偏移量
执行复制的双方——主从服务器会分别维护一个复制偏移量(主服务器向从服务器传播N个字节,偏移量+N;从服务器收到N个字节数据,自己的复制偏移量就+N)。
偏移量是否一致就可以判定主从服务器是否处于一致状态。
复制积压缓冲区
复制积压缓冲区是一个主服务器维护的一个固定长度和先进先出的队列,默认1MB。主服务器进行命令传播的时候,不仅会给从服务器,还会将命令写入复制积压缓冲区.
服务器运行ID
每台redis服务器,不管主从,都有自己的运行ID。
主从初次复制,主会把自己的ID传送给从,从会保存。当从断线重新连接上一个主服务器时,会向当前连接的主服务器发送之前保存的ID:
PSYNC命令的实现
复制的实现
步骤1:设置主服务器的地址和端口
步骤2:建立套接字连接
步骤3:发送PING命令
步骤4:身份验证
步骤5:发送端口信息
从服务器向主服务器发送监听端口,主服务器随后会将其记录在从服务器对应的客户端状态的slave_listening_port属性中。
步骤6:同步
步骤7:命令传播
心跳检测
检测主从服务器的网络连接状态
主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了。
辅助实现min-slaves选项
检测命令丢失