加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

描述Redis Syncer 同步引擎的创建和实现

发布时间:2023-10-28 10:50:27 所属栏目:安全 来源:
导读:RedisSyncer一款通过replication协议模拟slave来获取源Redis节点数据并写入目标Redis从而实现数据同步的Redis同步中间件。 该项目主要包括以下子项目:redis 同步服务引擎 redissyncer-serverredissycner 客户端 red

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的情况。 

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章