Redis Ha Topology

2020 It邦幫忙鐵人賽 系列文章

由於我比較熟悉 GCP / GKE 的服務,這篇的操作過程都會以 GCP 平台作為範例,不過操作過程大體上是跨平台通用的。

寫文章真的是體力活,覺得我的文章還有參考價值,請左邊幫我點讚按個喜歡,右上角幫我按個追縱,底下歡迎留言討論。給我一點繼續走下去的動力。

對我的文章有興趣,歡迎到我的網站上 https://chechia.net 閱讀其他技術文章,有任何謬誤也請各方大德直接聯繫我,感激不盡。

Exausted Cat Face


摘要

  • Redis Sentinel Topology

Topology

  • Masters: M1, M2, M3, …, Mn.
  • Slaves: R1, R2, R3, …, Rn (R stands for replica).
  • Sentinels: S1, S2, S3, …, Sn.
  • Clients: C1, C2, C3, …, Cn.
  • 每個方格代表一台機器或是 VM

2 Sentinels

DON’T DO THIS

+----+         +----+
| M1 |---------| R1 |
| S1 |         | S2 |
+----+         +----+

Configuration: quorum = 1

這個設定下,如果 M1 掛了需要 failover,很有可能 S1 跟著機器一起掛了,S2 會沒有辦法取得多數來執行 failover,整個系統掛掉

3 VM

       +----+
       | M1 |
       | S1 |
       +----+
          |
+----+    |    +----+
| R2 |----+----| R3 |
| S2 |         | S3 |
+----+         +----+

Configuration: quorum = 2

這是最基本的蛋又兼顧安全設定的設置

如果 M1 死了 S1 跟著機器故障,S2 與 S3 還可以取得多數,順利 failover 到 R2 或是 R3。

寫入資料遺失

         +----+
         | M1 |
         | S1 | <- C1 (writes will be lost)
         +----+
            |
            /
            /
+------+    |    +----+
| [M2] |----+----| R3 |
| S2   |         | S3 |
+------+         +----+
  • failover 之前,M1 是 master,Client 的寫入往 M1 寫
  • M1 網路故障,M2 failover 後成為新的 master,可是 Client 往 M1 寫入的資料並無法 sync 回 M2
  • 等網路修復後,M1 回覆後會變成 R1 變成 slave,由 M2 去 sync R1,變成 R1 在 master 時收到的寫入資料遺失

為了避免這種情形,做額外的設定

  • min-slaves-to-write 1
  • min-slaves-max-lag 10

當 master 發現自己再也無法 sync 到足夠的 slave,表示 master 可能被孤立,這時主動拒絕客戶端的寫入請求。客戶端被拒絕後,會再向 sentinel 取得有效的 master,重新執行寫入請求,確保資料寫到有效的 master 上。

Sentinel 放在 Client 端

            +----+         +----+
            | M1 |----+----| R1 |
            |    |    |    |    |
            +----+    |    +----+
                      |
         +------------+------------+
         |            |            |
         |            |            |
      +----+        +----+      +----+
      | C1 |        | C2 |      | C3 |
      | S1 |        | S2 |      | S3 |
      +----+        +----+      +----+

有些情形,redis 這端只有兩台可用機器,這種情形可以考慮把 sentinel 放在客戶端的機器上

  • 仍然維持了獨立的 3 sentinels 的穩定
  • sentinel 與 client 所觀察到的 redis 狀態是相同的
  • 如果 M1 死了,要 failover ,客戶端的 3 sentinel 可以正確地執行 failover,不受故障影響

客戶端又不足 3 個

            +----+         +----+
            | M1 |----+----| R1 |
            | S1 |    |    | S2 |
            +----+    |    +----+
                      |
               +------+-----+
               |            |  
               |            |
            +----+        +----+
            | C1 |        | C2 |
            | S3 |        | S4 |
            +----+        +----+

      Configuration: quorum = 3

            +----+         +----+
            | M1 |----+----| R1 |
            | S1 |    |    | S2 |
            +----+    |    +----+
                      |
                      |        
                      |        
                   +----+      
                   | C1 |      
                   | S3 |      
                   +----+      

      Configuration: quorum = 2
  • 跟上個例子類似,但又額外確保 3 sentinels
  • 如果 M1 死了,剩下的 sentinel 可以正確 failover
Che-Chia Chang
Che-Chia Chang
Site Reliability Engineer

My research interests include Site Reliability Engineering, DevOps, Container and Kubernetes.