【原生Redis跨数据中心双向同步优化实践】本地业务客户端写入的数据依然遵循原生RESP协议 , 主节点执行完命令后 , 同步到从节点的写命令在同步前会进行协议扩展 , 增加头部id协议;非本地业务客户端(即来自其他数据中心同步)写入的数据均使用扩展的RESP协议 。
2、写命令实时写日志为了支持更长时间的断点续传 , 容忍长时间的机房级故障 , 本地业务客户端写入的写命令在进行协议扩展后 , 会顺序写入日志文件 , 同时生成对应的索引文件;为了减少日志文件大小 , 以及提高通过日志文件断点续传的效率 , 来自其他数据中心同步过来的数据不写入日志文件中 。
3、同步流程改造原生redis数据同步分为全量同步和部分同步 , 并且每个主节点有一个内存环形复制缓冲区;初次同步使用全量同步 , 断点续传时使用部分同步 , 即先尝试从主节点环形复制缓冲区中进行同步 , 同步成功的话则同步完缓冲区中的数据后即可进行增量数据同步 , 如果不成功 , 则仍然需要先进行全量同步再增量同步 。
由于全量同步需要生成一个子进程 , 并且在子进程中生成一个RDB文件 , 所以对主节点性能影响比较大 , 我们应该尽量减少全量同步的次数 。
为了减少全量同步的次数 , 我们对redis同步流程进行改造 , 当部分同步中无法使用环形复制缓冲区完成同步时 , 增加先尝试使用日志rlog进行同步 , 如果同步成功 , 则同步完日志中数据后即可进行增量同步 , 否则需要先进行全量同步 。
四、rLog日志设计分为索引文件与日志文件 , 均采用顺序写的方式 , 提高性能 , 经测试与原生redis开启aof持久化性能一致;但是rlog会定期删除 , 原生redis为了防止aof文件无限膨胀 , 会定期通过子进程执行aof文件重写 , 这个对主节点性能比较大 , 所以实质上rlog对redis的性能相对于aof会更小 。
索引文件和日志文件文件名均为文件中保存的第一条命令的id 。
索引文件与日志文件均先写内存缓冲区 , 然后批量写入操作系统缓冲区 , 并每秒定期刷新操作系统缓冲区真正落入磁盘文件中 。相比较于aof文件缓冲区 , 我们对rlog缓冲区进行了预分配优化 , 达到提升性能目的 。
1、索引文件格式索引文件格式如下所示 , 每条命令对应的索引数据包含三部分:
文章插图
- pos:该条命令第一个字节在对应的日志文件中相对于该日志文件起始位置的偏移
- len:该条命令的长度
- offset:该条命令第一个字节在主节点复制缓冲区中累积的偏移
默认拆分阈值分别为 , 当日志文件大小达到128M或者每隔一小时同时并且日志条目数大于10w时 , 写新的日志文件和索引文件 。
在每次循环处理中 , 当内存缓冲区的数据全部写入文件时 , 判断是否满足日志文件拆分条件 , 如果满足 , 加上一个日志文件拆分标志 , 下一次循环处理中 , 将内存缓冲区数据写入文件之前 , 先关闭当前的索引文件和日志 , 同时新建索引文件和日志文件 。
经验总结扩展阅读
- DNF装备怎么跨界在哪跨界
- 五 JPA - 原生SQL实现增删改查
- 中级会计职称考试能跨省报考吗
- 跨界歌王第4季何时播出?
- 原生之罪中的桦城是哪里?
- 跨界歌王邓伦在第几季?
- 跨年是什么意思?
- 跨服式聊天是什么意思?
- DNF怎么获得十周年史诗跨界石?
- 华夏金卡异地跨行取款手续费是多少?