自建redis(單機)升級到騰訊雲redis(分片式集群)的血的教訓


自建redis(單機)升級到騰訊雲redis(分片式集群)的血的教訓

一、項目升級血案

公司項目進行系統升級,為方便以后的擴展,以及減少運維人員的壓力(公司只有一個運維),
從自建的redis升級到騰訊雲的redis。升級后celery服務啟動不起來,項目啟動報錯。

二、redis升級前后的版本

  1. 項目架構flask + celery + mongodb + redis
    • celery使用redis是做backend和存儲result
    • 自建redis版本是redis3.2.6,用的是docker起的單機版redis
    • redis內存使用比較多大概8G左右,但並發不算太高
  2. 騰訊雲redis版本介紹
    • 騰訊雲的redis有單機版、副本集、分片式集群3個類型,
    • 考慮數據安全,選擇集群版,運維選擇了分片式集群版,因為他覺得價格差不多,分片式更高大上。
  3. 騰訊雲分片式redis集群
    • 騰訊雲的分片式集群,對集群進行封裝,很多時候,可以想使用單機版redis一樣使用集群版
    • flask里可以直接用python的redis模塊,直接連接集群版,
    • 分片式集群主要為了提升redis內存的上限,內存300G以下都可以直接開通,以上需要申請。
    • 分片式的方法就是把key不配在16324個槽點上,若干個槽點背平均分片在節點上,有N個節點,每個節點就是16324/N個槽點
    • 因為keys分配在不同的節點Node上,所以不支持全局的事務,無法使用keys,subpub等功能
    • 不支持功能詳情:單機版遷移內存版(集群架構)說明
  4. 騰訊雲redis分片式集群與自建redis集群的區別
    • python連接不一樣
      • 自建集群,需要使用redis-py-cluster庫進行連接,可以獲取各個節點的信息,單獨操作一個節點
        參考文章ython 操作redis集群
      • 騰訊雲的進行封裝,像使用單機版一樣連接,簡單方便,無法直接獲得單個節點信息,也無法直接操作單個節點,
    • 使用不一樣
      • 自建集群,無法分庫
      • 騰訊雲,可以select(db),使用不同庫,進行數據隔離

三、celery起動不了的原因

  1. 啟動celery的服務報錯
    • 報錯內容為,translation無法執行,就是無法使用redis里的事務
  2. 報錯原因
    • celery官方文檔里說,只支持redis哨兵模式的集群,不支持分片式的集群

四、解決辦法

  1. 因為分片式集群購買了半年多,無法退款,只能自己再建一個單機版redis,專門給celery用
  2. 盡量減少使用keys,以及其他涉及跨節點找key的函數
  3. 實在無法避免的,也用自建單機版的redis
  4. 等騰訊雲服務到期后,從分片式集群換回副本集版本,一主一副本就是主從版,一主多副就是副本集

五、經驗教訓

  1. 不同版本之間升級時,一定要先進行測試,用同樣的環境完全跑一遍。之前測試時,仍然用的自建redis做的測試,
  2. 集群不是越高級越好,要根據自己項目的使用情況,根據不同版本的特點,選擇最合適的。
  3. 購買雲服務時,開發還是要參與的,運維自己買了,結果項目跑不起來,雲服務就浪費了。
  4. 對比過阿里雲的redis集群服務,文檔比騰訊雲的豐富一點,但使用和騰訊雲差不多,都是同樣的限制。

六、網上案例

  1. 一場Celery不支持Redis集群引發的血案子
  2. django使用reids集群做cache,安裝django-cluster-redis


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM