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社區:.
問題分析
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重定向請求,這個重定向過程會增加集群的網絡負擔和單次請求耗時;若分片數因刪除減少時,會出現無法連接已刪除分片的異常情況。