0%

Redis 服务集群

Redis系列:

复制

在 Redis 中,用户可以通过执行 SLAVEOF 命令或者设置 slaveof 选项,让一个服务器去复制另一个服务器,被复制的叫主服务器(master),对主服务器进行复制的叫从服务器(slave)。

命令是在从服务器上执行的。

旧版复制功能

对于初次复制,旧版复制功能能够很好完成,但是对于短线后的复制来说,其效率非常低。主要是这种复制对于短线后的从服务器来说,会把主服务器的所有 RDB 文件发送给从服务器。
SYNC 命令是一个非常耗费资源的操作。每次执行命令,主从服务器需要执行下面操作:

  • 主服务器需要执行 BGSAVE 命令来生成 RDB 文件,这个操作会耗费主服务器大量的 CPU、内存和磁盘I/O资源
  • 主服务器需要将自己生成的 RDB 文件发送给从服务器,这个发送会耗费注册服务器大量的网络资源,并对主服务器响应命令请求的时间产生影响
  • 接收到 RDB 文件的从服务器需要载入主服务器发来的 RDB 文件,并在载入期间,从服务器会因为阻塞而没办法处理请求

新版复制功能

PSYNC 代替 SYNC 命令来执行复制的同步操作。PSYNC <runid> <offset>:其中 runid 是上一次复制的主服务器的运行ID,而 offset则是从服务器当前的复制偏移量,接收到这个命令的主服务器会通过这两个参数来判断应该对从服务器执行哪种同步操作。

  • 完整同步:处理初次复制情况
  • 部分重同步:处理短线后重复制情况。

复制偏移量

执行复制的双方会分别维护一个复制偏移量。通过对比主从服务器复制偏移量,可以清楚只掉注册服务器是否处于一致状态。

  • 主服务器每次向从服务器传播 N 个字节的数据时,就将自己的复制偏移量的值加上 N。
  • 从服务器每次收到主服务器传播来的 N 个字节的数据时,就将自己的复制偏移量的值加上 N。

复制原理

复制大约分为6个步骤:

  • 保存主节点(master)信息:执行 slaveof 后从节点值保存主节点的地址信息变直接返回了,这是建立复制流程还没有开始,在从节点执行 info replication 可以查看一些信息。
  • 从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的猪节点后,会尝试与该节点简历网络连接。
  • 发送 ping 命令。连接简历成功后从节点发送 ping 请求进行首次通信,ping 请求主要目的:检测主从之间网络套接字是否可用;检测主从节点当前是否可接受处理命令。
  • 权限验证。如果主节点设置了 requirepass 参数,则需要密码验证,从节点必须配置 masterauth 参数保证与主节点的相同的密码才能通过验证;如果验证失败复制将终止,从节点重新发起复制流程。
  • 同步数据。主从复制连接正常通信后,对首次简历的复制场景,主节点会把持有数据全部发送给从节点,这部分操作是耗时最长的步骤。
  • 命令持续复制。当主节点吧当前的数据同步给从节点,便完成了复制的建立流程。接下来主节点会持续的吧写命令发送给从节点,保证主从数据的一致性。

Sentinel

Redis 的主从复制模式下,一旦节点由于故障不能提供服务,就需要人工的把从节点晋升为主节点,同时通知应用方更新胡节点,这种方式在多应用场景是不能接收的。Redis 提供了 Redis sentinel 来解决这个问题。

集群

Redis Cluster 是 Redis 的分布式解决方案,有效的解决了 Redis 分布式方面的需求。

客官,赏一杯coffee嘛~~~~