自建redis(單機)升級到騰訊雲redis(分片式集群)的血的教訓
一、項目升級血案
公司項目進行系統升級,為方便以后的擴展,以及減少運維人員的壓力(公司只有一個運維),
從自建的redis升級到騰訊雲的redis。升級后celery服務啟動不起來,項目啟動報錯。
二、redis升級前后的版本
- 項目架構flask + celery + mongodb + redis
- celery使用redis是做backend和存儲result
- 自建redis版本是redis3.2.6,用的是docker起的單機版redis
- redis內存使用比較多大概8G左右,但並發不算太高
- 騰訊雲redis版本介紹
- 騰訊雲的redis有單機版、副本集、分片式集群3個類型,
- 考慮數據安全,選擇集群版,運維選擇了分片式集群版,因為他覺得價格差不多,分片式更高大上。
- 騰訊雲分片式redis集群
- 騰訊雲的分片式集群,對集群進行封裝,很多時候,可以想使用單機版redis一樣使用集群版
- flask里可以直接用python的redis模塊,直接連接集群版,
- 分片式集群主要為了提升redis內存的上限,內存300G以下都可以直接開通,以上需要申請。
- 分片式的方法就是把key不配在16324個槽點上,若干個槽點背平均分片在節點上,有N個節點,每個節點就是16324/N個槽點
- 因為keys分配在不同的節點Node上,所以不支持全局的事務,無法使用keys,subpub等功能
- 不支持功能詳情:單機版遷移內存版(集群架構)說明
- 騰訊雲redis分片式集群與自建redis集群的區別
- python連接不一樣
- 自建集群,需要使用redis-py-cluster庫進行連接,可以獲取各個節點的信息,單獨操作一個節點
參考文章ython 操作redis集群
- 騰訊雲的進行封裝,像使用單機版一樣連接,簡單方便,無法直接獲得單個節點信息,也無法直接操作單個節點,
- 使用不一樣
- 自建集群,無法分庫
- 騰訊雲,可以select(db),使用不同庫,進行數據隔離
三、celery起動不了的原因
- 啟動celery的服務報錯
- 報錯內容為,translation無法執行,就是無法使用redis里的事務
- 報錯原因
- celery官方文檔里說,只支持redis哨兵模式的集群,不支持分片式的集群
四、解決辦法
- 因為分片式集群購買了半年多,無法退款,只能自己再建一個單機版redis,專門給celery用
- 盡量減少使用keys,以及其他涉及跨節點找key的函數
- 實在無法避免的,也用自建單機版的redis
- 等騰訊雲服務到期后,從分片式集群換回副本集版本,一主一副本就是主從版,一主多副就是副本集
五、經驗教訓
- 不同版本之間升級時,一定要先進行測試,用同樣的環境完全跑一遍。之前測試時,仍然用的自建redis做的測試,
- 集群不是越高級越好,要根據自己項目的使用情況,根據不同版本的特點,選擇最合適的。
- 購買雲服務時,開發還是要參與的,運維自己買了,結果項目跑不起來,雲服務就浪費了。
- 對比過阿里雲的redis集群服務,文檔比騰訊雲的豐富一點,但使用和騰訊雲差不多,都是同樣的限制。
六、網上案例
- 一場Celery不支持Redis集群引發的血案子
- django使用reids集群做cache,安裝django-cluster-redis