1. 程式人生 > 資訊 >吉利汽車增持極氪 10% 股份,推動後者估值增長至 90 億美元

吉利汽車增持極氪 10% 股份,推動後者估值增長至 90 億美元

Redis 叢集

什麼是 Redis 叢集

Redis 叢集是 Redis 處理大資料而提供的分散式資料庫方案,叢集通過分片(sharding)的方式來儲存資料庫中的鍵值對。

Redis 叢集中的節點分為主節點(Master)和從節點(Slave),其中主節點用於處理槽,而從節點則用於複製主節點,並在主節點故障宕機下線時,切換為主節點繼續處理請求命令。

叢集節點(node)

一個 Redis 叢集通常由多個節點(node)組成,每個節點都是相互獨立的,要組建一個真正可工作的叢集,需要將節點連線起來,構成一個包含多個節點(node)的叢集。

  • 檢視節點

    命令:CLUSTER NODES

  • 連線節點

    命令:CLUSTER MEET

叢集槽(slot)指派

叢集中的整個資料庫被分為16384個槽(slot),資料庫中的每個鍵都屬於其中一個,叢集中的每個節點(node)可以處理 0 個或 16384 個。

Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽。redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點。

Redis 叢集沒有使用一致性hash, 而是引入了雜湊槽的概念,使用雜湊槽的好處就在於可以方便的新增或移除節點。

  • 檢視槽

    命令:CLUSTER INFO

  • 指派槽命令

    命令:CLUSTER ADDSLOTS

127.0.0.1:6379> CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000
故障檢測
  • 叢集中每個節點都會定期地向叢集中的其他節點進行心跳檢測,如果未收到響應則認為該節點疑似下線
  • 叢集中每個節點會通過相互發送訊息的方式來交換叢集中各個節點的狀態資訊
  • 如果在一個叢集中,半數以上負責處理槽位的主節點都將某個主節點認為疑似下線,那麼這個主節點將被最終標記已下線(FAIL),並且會向叢集廣播,所有收到訊息的其他主節點都會立刻將該主節點也標記為已下線
故障轉移

當一個從節點發現自己正在複製的主節點進入已下線狀態,從節點將開始對下線主節點進行故障轉移

  • 從下線主節點的所有從節點裡面,選中一個從節點
  • 被選中的從節點會執行 SLAVEOF no one 命令,成為新的主節點
  • 新的主節點會撤銷所有對已下線主節點的槽指派,並將這些槽全部指派給自己
  • 新的主節點向叢集廣播一條訊息,告訴其他主節點自己已經升級為主節點,接管了已下線的主節點負責處理的槽
  • 新的主節點開始接收和自己負責處理的槽相關的命令請求
選擇新主節點

新的主節點是通過選舉產生的

  • 當從節點發現自己正在複製的主節點進入已下線狀態時,從節點會向叢集廣播一條訊息,要求所有收到這條訊息、並且具有投票權的主節點向自己投票
  • 如果一個主節點具有投票權,並且這個主節點尚未投票給其他從節點,那麼主節點將向要求投票的從節點投票
  • 每個參與選舉的從節點都會接收到其他主節點的投票,從而獲得一定的票數
  • 當從節點票數超過半數時,這個從節點就會當選為新的主節點
  • 如果所有從節點沒有一個獲得半數以上的投票,那麼將再次進行投票,直到選出新的主節點為止

注:這個選舉新主節點的方法其實和哨兵機制中選擇領導者哨兵非常相似