redis主从复制原理

当启动一个slave node的时候,它会发一个PSYNC命令给master node。
如果这是slave node初次连接到master node ,那就会触发一次full resynchronization 全量复制。此时master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端client新接收到的所有命令缓存在内存中。RDB文件生成完毕后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后在从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。slave node如果跟master node有网络故障,断开了连接,会自动重连,连接之后master node仅会复制给slave部分缺少的数据
image.png

复制的完整流程

slave node启动时,会在自己本地保存master node的信息,包括master node的host和ip,但是复制流程没开始。slave node内部有一个定时任务,每秒检查是否有新的master node 要连接和复制,如果发现,就跟master node 建立socket网络连接,然后slave node 发送ping 命令给 master node 。如果master设置了requirepass,那么slave node 必须发送masterauth的口令过去进行认证。master node第一次执行全量复制,将所有数据发送给slave node。而在后续master node 持续将写命令,异步复制给save node。
image.png

redis主从架构的实现(命令方式)

  1. 创建两个redis的服务实例 主服务器(6666)从服务器(7777)
  2. 进入从服务器(7777)执行命令设置主服务器的ip、port
  • ./src/redis-cli -p 7777 命令:slaveof 127.0.0.1 6666
  • 检查是否配置成功 info replication
  1. 取消主从复制 进入从服务器(7777)

    slaveof no one

    redis主从架构的实现(配置文件方式)


    image.pngimage.png

  • 从服务器的配置 slaveof 主节点的ip、端口
  • slave-read-only yes 从节点设置为只读

上述摘自www.itlaoqi.com

redis哨兵原理

  • 哨兵至少需要3个实例,来保证自己的健壮性
  • 哨兵+redis主从的部署架构,是不会保证数据零丢失的,只能保证redis的高可用性
  • 对于哨兵+redis主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练

image.png
image.png
上述摘自中华石衫面试突击训练第一季(https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-sentinel.md

哨兵的实现

  • 准备3台redis服务器(实现一主两从)
  • 6666(主服务器) 7777(从服务器) 8888(从服务器)
  • 配置文件

image.pngimage.pngimage.png

  • sentinel对应的配置文件信息
  • 3台sentinel 26379 26380 26381

image.pngimage.pngimage.png
image.png