文:猿十叁
編輯:猿十叁
redis為了避免單點故障Redis是一種基于記憶體的鍵值資料庫,主從複制是實作Redis高可用性的一種重要機制。
Redis主從複制指的是将一個Redis伺服器(即主節點)上的資料内容複制到另一個或多個Redis伺服器(即從節點)上,形成主節點和若幹個從節點的拓撲結構,從節點可以處理讀請求并提供故障轉移。
主節點負責接收用戶端的寫操作并且将這些操作同步地發送給從節點,在每個從節點上複制本地副本以提高資料的可靠性和性能。當主節點發生當機等故障時,從節點可以自動切換為新的主節點,進而實作Redis的高可用性。
Redis主從複制是Redis提供的一種資料複制到一個或多個備用節點。這些備用節點充當Redis的從節點,它們自動接收并複制主節點的所有寫操作。
Redis主從複制的代碼實作
在做代碼示例之前,我們需要做一些前期準備工作。
我們需要使用Python Redis子產品redis-py來連接配接Redis并設定主節點,然後通過從機進行驗證複制。然後使用從節點讀取主節點的所有寫操作,以確定同步複制。
該程式使用Redis Python子產品redis-py實作Redis主從複制。在此示例中,主節點的寫操作被複制并同步到從節點,可以在從節點上讀取來自主節點的所有操作。
下面介紹一些Redis主從複制中的關鍵特點:
主節點将操作記錄在記憶體中,并将操作記錄發送到從節點進行同步。是以,在主節點與從節點之間存在一定的延遲。主節點可以同時向多個從節點發送操作記錄并同步資料。但是,随着從節點數量的增加,主節點的性能可能會受到影響。
當主節點失效時,可以将其中一台從節點更新為新的主節點以提供資料服務。當主節點發生故障時,可以使用從節點更新為主節點,繼續提供資料服務。
下面是一些相關的重要設定:
在Redis配置檔案中使用"appendonly yes"選項來開啟主節點的持久化存儲,以便在主節點故障時保留資料。
通過使用"replicaof"指令來指定從節點同步主節點的方式。通過設定主節點中從節點的優先級,可以為特定的從節點提供更高的資料複制優先級。
之前說了我們需要配置哪些東西,現在我們再來看看如何配置從主複制。
除了前面提到的基本代碼實作,還需要進一步說明如何設定Redis主從複制。在此示例中,我們使用redis-py子產品連接配接Redis并設定主節點和從節點,然後将從節點設定為複制主節點的方式。
在以上代碼中,我們首先建立主節點與從節點之間的連接配接。然後,我們設定了一個名為“key”的鍵值對,并将其存儲在主節點中。
接下來,我們配置從節點并使用replicaof指令将其設定為複制主節點的方式。實際上,這意味着主節點接收到寫操作後,從節點将自動複制該資料。
最後,我們在從節點上讀取傳輸的資料,以確定從節點正确地複制了主節點的資料。若輸出為“value”,則說明已成功地執行了Redis主從複制。
實際上,在實際生産環境中,配置Redis主從複制需要考慮各種因素,包括網絡延遲、主從節點的容錯政策、備份和資料同步等等。但以上示例程式可以解釋如何在Redis中實作主從複制過程的基本概念。
下面我們看第二個問題:從機切入問題
在Redis主從複制中,“從節點切入”是指管理者将哪些從節點設定為新的主節點。在這種情況下,管理者需要将從節點更新為新的主節點,并将所有其他從節點設定為複制新主節點。
下面是使用Python Redis子產品redis-py實作Redis從節點切入的示例。使用“slaveof no one”指令将從節點更新為新的主節點,并将所有其他從節點設定為複制新主節點。
首次連接配接後進行全量複制,後續跟随,master寫,slave跟。
在以上代碼中,我們設定了主節點和第一台從節點,并将“key”設定為“value”。然後我們将從節點更新為新的主節點,并使用replicaof指令将其設定為複制主節點的方式。最後我們将其他從節點設定為複制新主節點,并在新主節點上讀取“key”的值以確定資料已成功複制。
請注意,這隻是一個示例,實際進行Redis從節點切換可能需要更多的步驟。例如,您可能還需要調整節點的優先級,以確定部署的Redis叢集的高可用性。
在實操過程中,我們可能會碰到主機當機的問題,不過不用擔心,當Redis主節點當機時,Redis從節點可以自動更新為新的主節點,進而提供資料服務并保證Redis資料的可用性。當主節點當機時,存在三種情況:
- Redis從節點在主節點當機之前複制了最新資料,并在主節點當機之後自動更新為新的主節點。在這種情況下,Redis叢集可以自動繼續運作,不會出現資料損失。
- Redis從節點沒有複制最新的資料,并且無法更新為新的主節點。在這種情況下,Redis叢集将無法正常工作,需要在新主節點恢複之前維護。
- Redis從節點已過期并被重新啟動。在這種情況下,Redis叢集将無法自動更新并需要手動修複。
下面是使用Python Redis子產品redis-py實作Redis主節點當機時從節點更新的示例。在此示例中,如果主節點不可用,則從節點将更新為新的主節點,并從主節點複制最新的資料。
在以上代碼中,我們設定了主節點和從節點,并使用replicaof指令将從節點設定為複制主節點的方式。主節點将“key”設定為“value”。
然後我們模拟主節點當機并在從節點上查詢手續費風格主節點的狀态。如果主節點不可用,則從節點将更新為新的主節點,并使用noone()指令将其設定為非從節點狀slaveof_n态。
最後,我們在新松材線蟲主節點上讀取“key”以確定資料已成功複制,并且可以從新主節點中恢複資料。
請注意,在實際生産環境中,sRedis高可用性需要考慮更多的因素和政策,如持久化、資料同步、容錯恢複機制等。
我在myredis目錄下建立了3個檔案,并為每個檔案設定了如下内容:
- sentinel26379.conf:
Copy code
bind 0.0.0.0
daemonize yes
protected-mode no
開始模拟主節點當機
while True:
try:
# 嘗試使用主節點執行操作
master_conn.ping()
except redis.exceptions.ConnectionError:
# 如果主節點不可用,從節點将更新為新的主節點
print("Master node is down. Promoting slave to master.")
break
time.sleep(1)
# 将從節點更新為新的主節點
port 26379
logfile "./myredisentinel26379.log"
pidfile /var/run/redis-sentin0.0.0
daemonize yes
protected-mode el26379.pid
dir ./myredis
sentinel moitr mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 1234
- sentinel26380.conf:
Copy code
bind 0.0.0.0
daemonize yes
protected-mode no
port 26380
logfile "./redis/sentinel26380.log"
pidfile /var/rnedisntinel26380.pid
dir ./myred
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel autpasmymater234/yr/sentinel26380.log"
pidfile /var/ru/myred/sentinel26380.log"
pidfiler/ru
- sentinel26381.conf:
Copy code
bind 0.0.0.0
daemonize yes
protected-mode no
port 26381
logfile "./myredis/sentinel26381.log"
pidfile /var/run/redis-sentinel26381.pid
dir ./myredis
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 1234
這些配置檔案将監視名為“mymaster”的Redis主節點(IP位址為127.0.0.1和端口為6379),并指定了身份證密碼為“1234”。這些配置還設定了日志檔案路徑、pid檔案路徑以及端口号和綁定位址。我們需要将将這些檔案儲存在myredis目錄中,以便後續操作。
我們當時在配置檔案的時候加入了哨兵機制。
當一個哨兵在規定時間内沒有收到主機的恢複通知,他就會向其他哨兵發送指令,詢問他們有沒有收到主機恢複的消息。然後投票,如果票數達到了我們在配置檔案當中的法定票數,那麼這個時候主節點就會被該哨兵标記為客觀下線了。
哨兵可以在判斷主節點客觀下線後,從剩下的主節點中的選出一個作為新的主節點進行故障轉移,這是哨兵機制帶來的主要優點之一。哨兵還提供了高可用性解決方案,避免單點故障問題,自動化故障轉移操作,以及靈活性和可擴充性等優點。
然而,哨兵也存在一定的缺點。由于需要部署多台機器,并進行配置和管理,哨兵會增加系統複雜度和難度。另外,哨兵需要進行定期檢測和其他任務,可能對Redis叢集的讀寫性能造成一定的損失。
哨兵實作過程需要涉及到Raft選舉算法、主從架構、檢測、自動化故障等技術,需要具備一定的分布式系統開發和架構設計經驗,并且需要進行針對性的調優和性能測試,才能保證Redis叢集的高可靠性和高性能。
哨兵的優點:
高可用性:哨兵提供了高可用性解決方案,可以避免Redis單點故障的問題。
自動化故障轉移:哨兵可以自動檢測到故障節點,并進行自動化的故障轉移操作,提高了Redis叢集的可靠性和穩定性。
靈活性:哨兵可以根據需要配置不同的監控和故障轉移政策,以滿足不同的需求。
可擴充性:哨兵支援多個哨兵協同工作,可以擴充到多台機器上,提高了可靠性和可擴充性。
哨兵的缺點:
架構複雜:哨兵需要部署多台機器,并進行配置和管理,增加了系統各個雜度和難度。
性能損失:哨防會對Redis叢集的讀寫性能造成一定的損失,因為哨兵需要進行定期的心跳檢測和其他任務。
哨兵實作過程需要涉及到Raft選舉算法、主從架構、心跳檢測、自動化故障切換等技術,需要具備一定的布式系統開發和架構設計經驗,并且需要進行針對性的調優和性能測試,才能保證Redis叢集的高可靠性和高性能。