x-pipe icon indicating copy to clipboard operation
x-pipe copied to clipboard

云厂商支持情况确认

Open callmedba opened this issue 2 years ago • 7 comments

我们的Redis分布在阿里云和腾讯云,有标准主从版,也有集群版。有2.8,3.0,4.0,5.0等各个版本。云厂商的跨Reids间同步工具DTS不支持低版本Redis。

请问当前x-pipe对各个云厂商的Redis产品支持的如何呢?能否借助x-pipe实现云Redis5.0版本同步到云Redis2.8版本呢 ?目的是用来做大版本升级后的异常回滚

在Wiki中看到答疑说需要部署哨兵,这个哨兵是必须要部署的一个组件吗?

谢谢

callmedba avatar Jan 11 '23 10:01 callmedba

首先几个基础的问题:

  1. Redis 不支持高版本向低版本同步
  2. Redis Cluster 和 多组Redis Master-Slave构成的集群是不存在同步的可能性的。
  3. Sentinel是用于Master-Slave架构下,主从切换的,你用云厂商的Redis通常自带哨兵。

阿里云的实现是Tair,是支持Redis原生同步协议的,腾讯云的你要问下他们客服,是否支持Redis原生通信。

我建议是你把背景写的更详细一些,比如为什么有多个版本,不同云厂商你是怎么用的,同步是为了解决什么问题?这些其实和x-pipe关系不大,倒是和解决你的问题比较有关。

@callmedba

NickNYU avatar Jan 12 '23 03:01 NickNYU

@NickNYU 我们情况是这样的: 公司业务至今存在有十多年了,这十多年间先后购买了不同版本的Redis,属于历史问题。大部分业务线都在阿里云,小部分在腾讯云。

我们目前规划是统一所有的Redis版本为5.0,把低于5.0的版本都升级到5.0版本。云厂商的低版本Redis是支持升级到5.0版本的,但升级后是不支持再回滚到原低版本的。

我们评估用x-pipe,主要是期望:在低版本Redis升级到5.0版本后,当业务发现异常且短时间内不能解决时,通过x-pipe把高版本的Redis的全量+增量数据同步至另一个新的低版本的Redis,进而达到Redis版本回滚的目的。

我们用的云厂商Redis是高可用版本的,但其自带的哨兵是没有提供访问地址的,上面想确认的是哨兵对x-pipe来说是不是必须要有的组件呢

谢谢 ~

callmedba avatar Jan 12 '23 08:01 callmedba

@callmedba 哨兵不是必须的,但是如果云厂商有哨兵的话,会导致切换以后,备机房的Redis会从keeper(x-pipe同步组件)的slave,切换成master,从而无法同步数据。

  1. 关于回滚这个话题,感觉你可能只能双写高低版本两个集群,才有回滚的可能性,但是双写无法保证单次业务写入两个集群的事务性,理论上集群之间数据有可能不一致,你可以通过业务上的数据巡检等方式做数据补偿。

NickNYU avatar Jan 12 '23 11:01 NickNYU

好的 了解了 多谢 ~

对于双写可能涉及业务上的改造,可能还会带来更多的不确定性,以及升级周期的延长,目前暂不考虑

需要进行高版本升级的Redis数量近100个,但最终需要实施版本回滚的Redis数量可能很少,甚至个位数

目前偏向于选择一个类似x-pipe的组件,在异常情况出现时,短时间内把高版本Redis数据同步至低版本中,业务侧可以接受Redis部分数据在短时间内的不一致,借助云厂商5.0版本Redis提供的写日志API,在业务回滚至低版本Redis后进行事后补偿

callmedba avatar Jan 13 '23 01:01 callmedba

@callmedba 那可能不太行,问题的本质在于full sync的RDB文件无法向下兼容 比如Redis 5.0的RDB version是10,Redis 2.X的RDB version是8,所以,如果用Redis version2.X作为slave 去同步Redis version 5.x的master,就会导致同步连接无法建立。

解决方案是你找一个Redis RDB的解析、转换工具,而且还需要改造xpipe,让xpipe的keeper拉取完RDB之后,可以完成从高版本到低版本的转换,才可以redis 5.x 同步给 redis 2.x。

NickNYU avatar Jan 13 '23 07:01 NickNYU

嗯 是的 感谢大佬指点 @NickNYU

callmedba avatar Jan 13 '23 08:01 callmedba

@NickNYU 实际上x-pipe应该也可以做到高版本的rdb转低版本的rdb, 但可能有些类型的key不支持,比如module stream类型不能转换成2.8版本的rdb

做法是在解析rdb时判断目标redis版本,再根据解析的结果生成一个低版本的dump格式,再restore到目标端

更多信息参见DumpRdbValueVisitor.java#L227

leonchen83 avatar Jan 13 '23 08:01 leonchen83