Redis实例是否支持版本升级?如Redis4.0升级到Redis5.0?
不支持。Redis不同版本的底层架构不一样,在创建Redis实例时,确定Redis版本后,将不能修改,如Redis4.0的实例不能升级到Redis5.0。但DCS服务在发现Redis缺陷或者问题时,会主动通知客户修复问题。
如您的业务需要使用Redis高版本的功能特性,可重新创建高版本Redis实例,然后将原有Redis实例的数据迁移到高版本实例上。具体数据迁移操作,可参考使用DCS迁移数据。
在维护时间窗内对实例维护是否有业务中断?
在实例维护时间窗内,服务运维要对实例进行维护操作时,会提前和用户沟通确认;具体升级操作以及影响,服务运维人员会提前和用户确认,用户不用担心维护窗内,实例运行异常的问题。
DCS实例规格变更是否需要关闭或重启实例?
实例处于运行中的状态即可进行规格变更,不会涉及实例资源的重启操作。
DCS实例规格变更的业务影响
执行实例规格变更操作,建议在业务低峰期进行,在实例规格变更时,会有如下影响。
DCS实例类型变更明细
实例版本 支持的实例变更类型 变更须知及影响 Redis 3.0 单机实例变更为主备实例 连接会有秒级中断,大约1分钟左右的只读。 主备实例变更为Proxy集群实例 如果Redis 3.0主备实例数据存储在多DB上,或数据存储在非DB0上,不支持变更为Proxy集群;数据必须是只存储在DB0上的主备实例才支持变更为Proxy集群。
连接会中断,5~30分钟只读。Redis 4.0/5.0 主备实例或读写分离实例变更为Proxy集群实例 变更为proxy集群时,需要评估proxy集群的多DB使用限制和命令使用限制对业务的影响。具体请参考Proxy集群使用多DB限制,实例受限使用命令。
变更前实例的已用内存必须小于变更后最大内存的70%,否则将不允许变更。
如果变更前实例的已用内存超过总内存的90%,变更的过程中可能会导致部分key逐出。
变更完成后需要对实例重新创建告警规则。
如果原实例是主备实例,请确保应用中没有直接引用只读IP或只读域名。
请确保您的客户端应用具备重连机制和处理异常的能力,否则在变更规格后有可能需要重启客户端应用。
变更规格过程中会有秒级业务中断、大约1分钟只读,建议在业务低峰时进行变更。Proxy集群实例变更为主备实例或读写分离实例
除了上表中提到的实例外,其他实例类型目前不支持实例类型的变更,若您想实现跨实例类型的规格变更,可参考实例交换IP进行操作。
实例规格变更的影响
实例类型 | 规格变更类型 | 实例规格变更的影响 |
---|---|---|
单机、主备和读写分离实例 | 扩容/缩容 | Redis 4.0/5.0/6.0基础版实例,扩容期间连接会有秒级中断,大约1分钟的只读,缩容期间连接不会中断。 Redis 3.0实例,规格变更期间连接会有秒级中断,5~30分钟只读。 如果是扩容,只扩大实例的内存,不会提升CPU处理能力。 单机实例不支持持久化,变更规格不能保证数据可靠性。在实例变更后,需要确认数据完整性以及是否需要再次填充数据。如果有重要数据,建议先把数据用迁移工具迁移到其他实例备份。 主备和读写分离实例缩容前的备份记录,缩容后不能使用。如有需要请提前下载备份文件,或缩容后重新备份。 |
Proxy和Cluster集群实例 | 扩容/缩容 | 扩容/缩容分片数未减少时,连接不中断,但会占用CPU,导致性能有20%以内的下降。 扩容/缩容分片数减少时,删除节点会导致连接闪断,请确保您的客户端应用具备重连机制和处理异常的能力,否则在变更规格后可能需要重启客户端应用。 分片数增加时,会新增数据节点,数据自动负载均衡到新的数据节点。 分片数减少时,会删除节点。Cluster集群实例缩容前,请确保应用中没有直接引用这些删除的节点,否则可能导致业务访问异常。 缩容前,实例每个节点的已用内存要小于缩容后节点最大内存的70%,否则将不允许变更。l 实例规格变更期间,会进行数据迁移,访问时延会增大。Cluster集群请确保客户端能正常处理MOVED和ASK命令,否则会导致请求失败。 实例规格变更期间,如果有大批量数据写入导致节点内存写满,将会导致变更失败。 在实例规格变更前,请先使用缓存分析中的大key分析,确保实例中没有大key存在,否则在规格改变后,节点间进行数据迁移的过程中,单个key过大(≥512MB)会触发Redis内核对于单key的迁移限制,造成数据迁移超时失败,进而导致规格变更失败,key越大失败的概率越高。 Cluster集群实例扩容或缩容时,如果您使用的是Lettuce客户端,请确保开启集群拓扑自动刷新配置,否则在变更后需要重启客户端。开启集群拓扑自动刷新配置请参考Lettuce客户端连接Cluster集群实例中的示例。 实例规格变更前的备份记录,变更后不能使用。如有需要请提前下载备份文件,或变更后重新备份。 |
主备、读写分离和Cluster集群实例 | 副本数变更 | Cluster集群实例增加或删除副本时,如果您使用的是Lettuce客户端,请确保开启集群拓扑自动刷新配置,否则在变更后需要重启客户端。开启集群拓扑自动刷新配置请参考Lettuce客户端连接Cluster集群实例中的示例。 删除副本会导致连接中断,需确保您的客户端应用具备重连机制和处理异常的能力,否则在删除副本后需要重启客户端应用。增加副本不会连接中断。 当副本数已经为实例支持的最小副本数时,不支持删除副本。 |
Redis实例变更失败的原因
- 检查是否有其他任务在执行。
实例变更过程中,同时有其他任务在执行。例如实例正在重启的同时,执行删除或扩容操作,或者实例正在扩容的时候,执行删除操作。
遇到实例变更操作失败,可以稍后尝试,如果仍然存在问题,请技术支持。
- 执行实例变更规格,建议在业务低峰期操作。业务高峰期(如实例在内存利用率、CPU利用率达到90%以上或写入流量过大)变更规格可能会失败,若变更失败,请在业务低峰期再次尝试变更。
- 如果是主备变更为Proxy集群,请确认主备实例DB0以外的DB是否有数据,如果非DB0外的其他DB上有数据(如DB1有数据),会出现变更失败。
数据必须是只存储在DB0上的主备实例才支持变更为Proxy集群。
使用Lettuce连接Cluster集群实例时,规格变更的异常处理
问题现象
使用lettuce连接Cluster集群实例,实例执行规格变更后,分片数有变化时,部分槽位(Slot)会迁移到新分片上,当客户端连接到新分片时会出现以下异常问题:
图 异常现象
详情可参考Lettuce社区:Connection to X not allowed. This connection point is not known in the cluster view.
问题分析
Cluster集群规格变更原理:
客户端根据RESP2协议的内容,启动后从Cluster集群获取节点拓扑信息(Cluster Nodes),并将其拓扑关系维护在客户端的内存数据结构中。
对于数据访问,客户端会根据Key值按照CRC16算法进行Hash计算Slot信息,根据内存中保存的节点拓扑关系和Slot的对应信息进行请求自动路由。
在扩容/缩容过程中,当实例分片数发生变化时,存在节点拓扑关系和Slot对应信息的变化,需要客户端进行拓扑关系的自动更新,否则可能造成请求路由失败或者路由位置错误等,造成客户端访问报错。
例如,3分片Cluster集群实例扩容为6分片Cluster集群实例时,节点拓扑关系和Slot对应信息变化如下图所示:
Cluster集群实例扩容前
图 Cluster集群实例扩容后
解决方案
方案一(推荐方案):
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
// 每隔time毫秒周期性刷新
.enablePeriodicRefresh(Duration.ofMillis(time))
// MOVED重定向, ASK重定向, 重连, 未知节点(since 5.1), 槽位不在当前所有分片中(since 5.2),当出现这五种情况时会触发自适应刷新
.enableAllAdaptiveRefreshTriggers()
.build();
具体实现请参考Lettuce客户端连接Cluster集群实例。
说明Lettuce客户端连接Cluster集群实例,如果未开启拓扑刷新,规格变更后,需要重启客户端。
方案二:
关闭“验证集群节点成员资格开关”,关闭方式如下:
ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
.validateClusterNodeMembership(false)
.build();
原理:若validateClusterNodeMembership为true时,连接前检查当前连接地址是否在集群拓扑关系中(通过CLUSTER NODES获得),若不在则会出现上述异常问题。
说明关闭“验证集群节点成员资格开关”的影响:
缺少防止安全漏洞的检验;
若未开启集群自动刷新拓扑,当Cluster集群执行变更规格后,若分片数增加时,可能会产生MOVED重定向请求,这个重定向过程会增加集群的网络负担和单次请求耗时;若分片数因删除减少时,会出现无法连接已删除分片的异常情况。