Redis 主从同步

所谓主从同步是指:将 master 节点数据同步到 slave 节点。这样做的好处有以下三点:

  • 减轻 master 节点的压力,每次读操作在 slave 节点执行,写操作在 master 节点执行
  • 可以将排序等耗费资源更大的操作放在 slave 节点去做,减轻 master 节点的压力
  • master 节点可以不用配置持久化 ,减轻压力,持久化配置到某一个 slave 节点就可以

当使用主从同步,并且 master 节点没有配置持久化时,一定要注意关闭 master 节点自动重启,否则一旦 master 节点挂掉并迅速重启,此时 master 节点数据为空,slave 节点主从同步后数据也为空,导致客户端所有读请求都无法正常处理

根据同步的程度不同,主从同步可分为以下两种:

  • 全量同步:master 节点同步所有数据到 slave 节点
  • 增量同步:master 节点同步增量数据到 slave 节点

一般 slave 节点第一次连接到 master 节点时进行全量同步,之后断后并重连后每次进行增量同步。具体执行策略是:每次先尝试执行增量同步,增量同步不行时进行全量同步

全量同步过程如下:

  1. slave 连接 master 节点,发送 SYNC 命令
  2. master 节点收到 SYNC 命令后,执行 BGSAVE 命令生成 rdb 文件
  3. BGSAVE 命令执行完毕后,master 节点给对应 slave 节点发送 rdb 快照
  4. slave 收到 rdb 文件后丢弃所有旧数据,重新加载新数据
  5. master 节点 rdb 发送完毕后,继续发送写缓冲池中的写命令(生成 rdb 文件期间的写命令)
  6. slave 节点 rdb 文件加载完毕后,开始接受客户端请求并执行 master 发送的写命令

增量同步类似上述步骤 6:master 节点收到命令后发送相同的命令至 slave 节点。此时 master 节点对每个 slave 节点维护同步标识,slave 每次同步会携带标识和上次同步的位置,之后从这个位置向后同步并更新标识即可

这里需要区分增量同步不步骤 6 的状态:步骤 6 是说 master 节点同步收到的新写命令至 slave 节点,而增量同步是说 slave 节点之前已经同步过,连接断开又重连后,无须全量同步,只需同步增量即可


Redis 主从同步的特点如下:

  • 一个 master 节点可以有多个 slave 节点,一个 slave 节点也可以有多个 slave 节点
  • 主从同步过程中 master 节点完全异步,同步期间可正常处理客户端命令
  • 主从同步过程中 slave 节点完全异步,同步期间通过旧数据响应客户端请求,可以通过配置 redis.conf 使 slave 节点同步期间不处理客户端请求,此时返回错误。同步完成后加载数据到内存是同步操作,此时客户端请求被阻塞
  • slave 节点默认不允许写数据,可以通过配置打开,这部分数据重启就会消失,一般用来记录临时数据
  • 多个 slave 节点同时连接同一个 master 节点并执行全量同步时,master 节点只维护一份写入缓冲区
  • redis 2.8 之后支持无磁盘同步,适合磁盘 IO 性能差,但网络环境好的场景
  • redis 2.8 之后可配置最小 slave 节点数,否则不执行写命令

主从同步的配置:

// slave 节点配置
slaveof IP PORT
// redis 5.0 之后 slaveof 替换为 replicaof
replicaof IP PORT
// 是否开启无磁盘同步
repl-diskless-sync
// 主从同步的延迟时间,方便更多 slave 节点连接,公用同一个写入缓冲池
repl-diskless-sync-delay
// 控制是否只读
slave-read-only

完整同步全过程:

  1. slave 节点和 master 节点建立 tcp 连接
  2. slave 节点发送 ping 命令判断 socket 状态是否正常,能否正常处理请求
  3. slave 节点发送 AUTH password 命令验证身份
  4. 验证无误后,slave 节点发送自身监听的端口号,master 将该端口号记录在对应 slave 连接的 slave_listening_port 属性中
  5. slave 节点发送 slave_announce_ip(如果配置),master 将该 IP 记录在对应 slave 连接的 slave_ip 属性中
  6. slave 节点发送 CAPA(capabilities)命令告诉 master 自己具备主从同步能力,master 将它记录在对应 slave 连接的 slave_capa 属性中
  7. slave 节点发送 PSYNC 命令, master 判断执行全量还是增量同步
  8. 完成同步后进入命令传播阶段,master 一直将自己执行的写命令发送给 slave,slave 自身执行保存数据一致

上述步骤 5 发送公网 ip,防止 master 节点返回时内网 ip,找不到对应的 slave 节点

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(从)同步Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis支持主从同步数据可以从服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。   本课程要讲解以下内容:1. Redis的基本使用2. Redis数据库数据类型3. Redis数据库数据管理4. Redis从复制5. Redis数据库的持久性6. Redis的高可靠性和集群7. Redis的优化和性能测试8. Redis服务器的维护和管理9. Redis服务器的常见问题排错 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值