Redis 備份、災難復原及高可用實戰的範例分析
一、Redis簡單介紹
Redis是一個高效能的key-value非關聯式資料庫,由於其具有高效能的特性,支援高可用、持久化、多種資料結構、叢集等,使其脫穎而出,成為常用的非關聯式資料庫。
此外,Redis的使用場景也比較多。
會話快取(Session Cache)
Redis快取會話有非常好的優勢,因為Redis提供持久化,在需要長時間維持會話的應用程式場景中,如購物車場景這樣的場景中能提供很好的長會話支持,能為使用者提供很好的購物體驗。
全頁快取
在WordPress中,Pantheon提供了一個不錯的外掛wp-redis,這個外掛程式能以最快的速度載入你曾經瀏覽過的頁面。
佇列
Redis支援list和set操作,因此它很適合用作訊息佇列平台。我們常透過Reids的佇列功能做購買限制。例如到假日或推廣期間,進行一些活動,對用戶購買行為進行限制,限制今天只能購買幾次商品或一段時間內只能購買一次。也比較適合適用。
排名
Redis在記憶體中對數字進行遞增或遞減的操作實現得非常好。所以我們在很多排名的場景中會應用Redis來進行,例如小說網站對小說進行排名,根據排名,將排名前幾名的小說推薦給用戶。
發布/訂閱
Redis提供發布和訂閱功能,發布和訂閱的場景很多,例如我們可以基於發布和訂閱的腳本觸發器,實現用Redis的發布和訂閱功能建立起來的聊天系統。
此外還有很多其它場景,Redis都表現的不錯。
二、Redis使用中單點故障問題
Redis在各個公司都得以應用,其多種優良特性和豐富的應用場景是其存在的原因。那麼隨之而來的問題和風險就來了。 Redis雖然應用場景豐富,但部分公司在實踐Redis應用程式的時候還是相對保守使用單節點部署,那為日後的維護帶來了安全風險。
我曾在2015年處理過一起因單點故障導致的業務中斷問題。當Redis最初被部署時,它使用的是單節點部署而不是分散式部署,並且沒有考慮容災方面的問題。
當時我們透過Redis伺服器做用戶購買優惠商品的行為控制,但後來由於未知原因Redis節點的伺服器宕機了,導致我們無法對用戶購買行為進行控制,造成了用戶能夠在一段時間內多次購買優惠商品的行為。
這種宕機事故可以說已經對公司造成了不可挽回的損失了,安全風險問題非常嚴重,作為當時運維這個系統的我來說有必要對這個問題進行修復和在架構上的改進。因此,我開始研究和學習在非分散式應用中解決Redis單點故障的方法。
三、非分散式場景下Redis應用程式的備份與容災
Redis主從複製現在應該是很普遍了。常用的主從複製架構有下列兩種架構方案。
常用Redis主從複製
方案一
一般情況下,這種結構最為常見,即一個主節點和兩個從節點。客戶端寫資料的時候是寫Master節點,讀的時候,是讀取兩個Slave,這樣實現讀的擴展,減輕了Master節點讀負載。
方案二
這種架構同樣是一個Master和兩個Slave。 Master和Slave1使用keepalived來實現VIP遷移的方式有所不同。 Client連線Master的時候是透過VIP進行連線的。避免了方案一IP更改的情況。
Redis主從複製優點與不足
優點
實現了對master資料的備份,一旦master出現故障,slave節點可以提升為新的master,頂替舊的master繼續提供服務
實作讀取擴充。使用主從複製架構, 一般都是為了實現讀取擴充。 Master主要實作寫入功能, Slave實作讀取的功能
不足
#架構方案一
當Master故障時,Client就與Master端斷開連接,無法實現寫入功能,同時Slave也無法從Master進行複製。
此時需要經過以下操作(假設提升Slave1為Master):
在Slave1上執slaveof no one指令提升Slave1為新的Master節點。
在Slave1上配置為可寫,這是因為大多數情況下,都會將slave配置只讀。
告訴Client端(也就是連接Redis的程式)新的Master節點的連接位址。
配置Slave2從新的Master進行資料複製。
架構方案二
當master故障後,Client可以連接到Slave1上進行資料操作,但是Slave1就變成一個單點,就出現了經常要避免的單點故障(single point of failure)。
之後需要經過以下操作:
#在Slave1上執行slaveof no one指令提升Slave1為新的Master節點
在Slave1上配置為可寫,這是因為大多數情況下,都會將Slave配置只讀
配置Slave2從新的Master進行資料複製
要注意的是,所有架構方案都需要手動介入才能進行故障轉移(failover)。需要人工幹預就增加了維運工作量,同時也對業務造成了巨大影響。這時候可以使用Redis的高可用方案-Sentinel
##四、Redis Sentinel介紹
Redis Sentinel為Redis提供了高可用方案。從實務方面來說,使用Redis Sentinel可以創造一個無需人為幹預就可以預防某些故障的Redis環境。 Redis Sentinel採用分散式架構,執行多個程序進行協同合作。執行多個Sentinel進程合作,當多個Sentinel同一給定的master無法再繼續提供服務,就會執行故障偵測,這會降低誤報的可能性。五、Redis Sentinel功能
Redis Sentinel在Redis高可用方案中主要作用有下列功能:監控
##Sentinel會不斷的檢查master和slave是否像預期那樣正常運行
#通知
透過API,Sentinel能夠通知系統管理員、程式監控的Redis實例出現了故障自動故障轉移
如果master不像預想中那樣正常運行,Sentinel可以啟動故障轉移過程,其中的一個slave會提成為master,其它slave會重新配置來使用新的master,使用Redis服務的應用程序,當連接時,也會被通知使用新的地址。
設定提供者
Sentinel可以做為客戶端服務發現的認證來源:客戶端連結Sentinel來取得目前負責給定服務的Redis master位址。如果發生故障轉移,Sentinel會報告新的位址。
- 六、Redis Sentinel架構
- #2、Redis Sentinel實作原理
以上是Redis 備份、災難復原及高可用實戰的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信
