redis主从复制

准备工作

在windows上安装服务,为了在一台主机上模拟主从复制、集群等环境

redis-server.exe --service-install redis.windows.conf --service-name redis6379 --loglevel verbose 安装服务

redis-server.exe --service-start --service-name redis6379 启动服务

redis-server.exe --service-stop --service-name redis6379 停止服务

redis-server.exe --service-uninstall --service-name redis6379 卸载服务

连接不同端口号的客户端redis-cli -p 6380

主从连接 从服务器命令slaveof 127.0.0.1 6379

断开主从连接 从服务器命令slaveof no one

设置密码 config set requirepass 123456

获取密码 config get requirepass

登录 auth 123456

主从复制过程

从服务器连接主服务器

slaveof 127.0.0.1 6379,在执行这一步命令时,执行了下面三个阶段

主从复制过程大体可以分为3个阶段

1.建立连接阶段

1)slave发送指令slaveof 127.0.0.1 6379

2)master接收到指令,响应slave

3)slave接收到master的响应,保存master的ip和端口,并建立socket连接

4)slave持续发送ping,来验证连接是否正常

5)slave验证身份auth password,master返回验证信息

6)验证成功后,slave发送ip和端口号,master保存,连接阶段结束

通过info命令查看状态

2.数据同步阶段

1)slave发送:psync或psync2 (根据redis版本判断)参考文章:https://blog.csdn.net/weixin_34378969/article/details/91464623

2)master创建RDB文件,在创建的同时将新命令写入缓冲区

3)master将RDB文件发给slave,slave接收后执行RDB同步数据。第二步和第三步为全量复制

4)slave告知masterRDB同步完成,请求进行缓冲区同步

5)master将缓冲区数据发给slave,slave开始同步缓冲区数据。第四步和第五步为增量复制

6)slave同步完成,告知master,数据同步阶段。

3. 命令传播阶段

重复数据同步过程

三个重要概念:

复制偏移量

执行主从复制的双方都会分别维护一个复制偏移量,master 每次向 slave 传播 N 个字节,自己的复制偏移量就增加 N;同理 slave 接收 N 个字节,自身的复制偏移量也增加 N。通过对比主从之间的复制偏移量就可以知道主从间的同步状态。

复制积压缓冲区

复制积压缓冲区是 master 维护的一个固定长度的 FIFO 队列,默认大小为 1MB。当 master 进行命令传播时,不仅将写命令发给 slave 还会同时写进复制积压缓冲区,因此 master 的复制积压缓冲区会保存一部分最近传播的写命令。当 slave 重连上 master 时会将自己的复制偏移量通过 PSYNC 命令发给 master,master 检查自己的复制积压缓冲区,如果发现这部分未同步的命令还在自己的复制积压缓冲区中的话就可以利用这些保存的命令进行部分同步,反之如果断线太久这部分命令已经不在复制缓冲区中了,那没办法只能进行全量同步。

runid

令人疑惑的是上述逻辑看似已经很圆满了,这个 run_id 是做什么用呢?其实这是因为 master 可能会在 slave 断线期间发生变更,例如可能超时失去联系或者宕机导致断线重连的是一个崭新的 master,不再是断线前复制的那个了。自然崭新的 master 没有之前维护的复制积压缓冲区,只能进行全量同步。因此每个 Redis server 都会有自己的运行 ID,由 40 个随机的十六进制字符组成。当 slave 初次复制 master 时,master 会将自己的运行 ID 发给 slave 进行保存,这样 slave

重连时再将这个运行 ID 发送给重连上的 master ,master 会接受这个 ID 并于自身的运行 ID 比较进而判断是否是同一个 master。

常见问题:

1.master重启会导致所有slave全量复制 解决办法:master将runid保存到rdb中,下次启动时恢复runid

2.网络问题,slave复制积压缓冲区溢出,频繁全量复制 。 解决方法:调大复制挤压缓冲区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值