描述Redis Syncer 同步引擎的创建和实现
RedisSyncer一款通过replication协议模拟slave来获取源Redis节点数据并写入目标Redis从而实现数据同步的Redis同步中间件。 该项目主要包括以下子项目: redis 同步服务引擎 redissyncer-server redissycner 客户端 redissyncer-cli redis 数据校验工具 redissycner-compare 基于docker-compse的一体化部署方案 redissyncer 本文主要介绍reidssyncer引擎(既redissyncer-server)的设计与实现,以及引擎运行的机制。 原生redis master slave 模式主要分为两个阶段,第一个阶段同步rdb镜像,也就是全量同步部分;全量同步完成后进入命令传播模式,每个执行成功的数据变更操作会同步给slave节点。redissyncer 的模拟了这一机制并将两部分拆解,既可以执行完整同步任务也可以单独执行全量或增量同步。 建立socket 发送auth user password (6.0新增user) OK 成功 其他 error send->ping 返回: ERR invalid password 密码错误 NOAUTH Authentication required.没有发送密码 operation not permitted 操作没权限 PONG 密码成功 作用: 检测主从节点之间的网络是否可用。 检查主从节点当前是否接受处理命令。 发送从节点端口信息 REPLCONF listening-port <port> -->OK 成功 -->其他 失败 发送从节点IP REPLCONF ip-address <IP> --> OK 成功 --> 其他 失败 发送EOF能力(capability) REPLCONF capa eof --> OK 成功 --> 失败 作用: 是否支持EOF风格的RDB传输,用于无盘复制,就是能够解析出RDB文件的EOF流格式。用于无盘复制的方式中。 redis4.0支持两种能力 EOF 和 PSYNC2 redis4.0之前版本仅支持EOF能力 发送PSYNC2能力 REPLCONF capa PSYNC2 --> OK 成功 --> 失败 作用: 告诉master支持PSYNC2命令 , master 会忽略它不支持的能力. PSYNC2则表示支持Redis4.0最新的PSYN复制操作。 发送PSYNC PSYNC {replid} {offset} --> FULLRESYNC {replid} {offset} 完整同步 --> CONTINUE 部分同步 --> -ERR 主服务器低于2.8,不支持psync,从服务器需要发送sync --> NOMASTERLINK 重试 --> LOADING 重试 --> 超过重试机制阈值宕掉任务 PSYNC ---> 启动heartbeat REPLCONF ACK <replication_offset> 心跳检测 在命令传播阶段,从服务器默认会以每秒一次的频率 发送REPLCONF ACK命令对于主从服务器有三个作用: 作用: 检测主从服务器的网络连接状态; 辅助实现min-slaves选项; 检测命令丢失。 REPLCONF GETACK ->REPLCONF ACK <replication_offset> RedisSyncer内部有断点续传、数据补偿、断线重连等机制来保证数据同步过程中稳定性和可用性,具体的机制如下。 断点续传机制 RedisSyncer的断点续传机制是基于Redis的replid和offset来实现的,RedisSyncer有两个版本的断点续传机制v1和v2。 v1版本: v1版本数据写入到目的端redis后,将offset持久化到本地,这样下次重启就从上次的offset拉取。但是由于该方案写目的端的操作和offset持久化不是一个原子的操作。如果中间发生中断会导致数据的不一致。 例如,先写入数据到目的端成功,后持久化offset还没成功就发生了宕机、重启等情况,那么再次断点续传拉取上一次的offset数据最后就不一致了。 v2版本: 在v2版本策略中RedisSyncer会将每一个pipeline批次中不存在事务的的命令通过multi和exec进行包装,并在事务尾部插入offset检查点。 当断点续传时需要从目标Redis的所以db库中查找checkpoint并找到所对应源节点当最大offset,再根据该offset进行断点续传。目前v2版本只支持目标为单机Redis的情况。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |