redis实现高性能的主从架构原理

5 篇文章 0 订阅

主从架构,读写分离:当启动一个 slave 时,它会发送一个 PSYNC 命令给 master ,如果这是 slave 重新连接 master,那么master 仅仅会复制给 slave 部分缺少的数据; 否则如果是 slave 第一次连接 master,那么会触发一次 full resynchronization ,开始 full resynchronization 的时候,master 会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master 会将这个RDB发送给 slave ,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后 master 会将内存中缓存的写命令发送给 slave ,slave 也会同步这些数据。slave 如果跟 master 有网络故障,断开了连接,会自动重连。master 如果发现有多个slave 都来重新连接,仅仅会启动一个 rdb save 操作,用一份数据服务所有 slave node 。

redis config:

  • bind 192.168.1.127 # 绑定自己的ip才可以对外提供服务 开发端口 iptables -A INPUT -ptcp --dport 6379 -j ACCEPT
  • daemonize yes # 后台进程
  • pidfile ./redis_6379.pid # 设置redis的pid文件位置
  • port 6379 # 设置redis的监听端口号
  • dir ./ # 设置持久化文件的存储位置

从节点配置:

  • slaveof 192.168.1.127 6379 # 配置从节点服务
  • slave-read-only yes # 从节点只读(读写分离)

集群安全认证:

  • requirepass redis_pass # master node上启用安全认证
  • masterauth redis_pass # slave 配置 master 认证密码

redis replication(主从复制):
1)slave node 启动,仅仅保存 master node 的信息,包括 master node的 host 和 ip,但是复制流程没开始。
2)slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接
3)slave node 发送 ping 命令给 master node
4)口令认证,如果 master 设置了requirepass,那么 salve node 必须发送 masterauth 的口令过去进行认证
5)master node 第一次执行全量复制,将所有数据发给 slave node
6)master node 后续持续将写命令,异步复制给 slave node

  • redis 采用异步方式复制数据到 slave node,不过 redis 2.8 开始,slave 会周期性地确认自己每次复制的数据量
  • 一个 master node 是可以配置多个 slave node 的
  • slave node 也可以连接其他的 slave node
  • slave node 做复制的时候,是不会阻塞 master node 的正常工作的
  • slave node 在做复制的时候,不会阻塞对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候会暂停对外服务。
  • slave node 主要用来进行横向扩容,做读写分离,扩容的 slave node 可以提高读的吞吐量

断点续传:从 redis 2.8 开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。master 会在内存中存一个 backlog,master 和 slave 都会保存一个 replica offset还有一个 master id,offset 就是保存在 backlog中 的。如果 master 和 slave 网络连接断掉了,slave 会先和 master
匹配 master id,如果一致就从上次的 replica offset 开始继续复制。如果没有找到对应的 offset,那么就会执行一次 resynchronization(全量复制)。

数据同步相关的核心机制:

  • master 和 slave 都会维护一个 offset:master 和 slave 会在自身不断累加 offset,slave 每秒都会上报自己的 offset 给 master,同时 master 也会保存每个 slave 的 offset,以此确定 master 和 slave 的数据是否一致

  • backlog :master 有一个 backlog,默认是1MB大小,master 给slave 复制数据时,也会将数据在 backlog 中同步写一份,backlog 主要是用来做全量复制中断候的增量复制的

  • master run id :如果根据 host + ip 定位 master ,是不靠谱的,如果 master 重启或者数据出现了变化,那么slave 应该根据不同的 run id 区分,run id 不同就做全量复制,如果需要不更改 run id 重启 redis,可以使用 redis-cli debug reload 命令。(info server 命令查看 redis 服务信息)

  • psync :从节点使用 psync 从 master 进行复制,psync runid offset ,master node会根据自身的情况返回响应信息,可能是 FULLRESYNC
    runid offset 触发全量复制,可能是 CONTINUE 触发增量复制。

全量复制:

  • master 执行 bgsave,在本地生成一份rdb快照文件
  • master 将rdb快照文件发送给 salve ,如果rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败。
  • 对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s
  • master 在生成rdb时,会将所有新的写命令缓存在内存中,在 salve 保存了rdb之后,再将新的写命令复制给salve
  • client-output-buffer-limit slave 256MB 64MB 60 :如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败
  • slave 接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务
  • 如果 slave 开启了AOF,那么会立即执行 BGREWRITEAOF,重写AOF

增量复制:

  • 如果全量复制过程中,master-slave 网络连接断掉,那么 salve 重新连接 master 时,会触发增量复制
  • master 直接从自己的backlog中获取部分丢失的数据,发送给 slave ,默认backlog就是1MB
  • msater 就是根据 slave 发送的 psync 中的 offset 来从backlog中获取数据的

无磁盘化复制:

  • repl-diskless-sync no #在内存中直接创建 rdb,然后发送给 slave,不会在本地磁盘存取。
  • repl-diskless-sync-delay #等待一定时长再开始复制,因为要等更多slave重新连接过来

过期key处理:slave 不会过期 key,只会等待 master过 期 key。如果 master 过期了一个 key,或者通过LRU淘汰了一个 key,
那么会模拟一条 del 命令发送给 slave。

heartbeat :master 默认每隔10秒发送一次 heartbeat,salve 每隔1秒发送一个 heartbeat
异步复制: master 每次接收到写命令之后,现在内部写入数据,然后异步发送给slave

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值