1. 程式人生 > 其它 >Redis應用-1.主從複製

Redis應用-1.主從複製

目錄

1.主從複製

1.1 主從複製簡介

網際網路“三高”架構 
    高併發 
    高效能 
    高可用 

你的“Redis”是否高可用 ?

單機redis的風險與問題 
問題1.機器故障 
    現象:硬碟故障、系統崩潰 
    本質:資料丟失,很可能對業務造成災難性打擊 
    結論:基本上會放棄使用redis

問題2.容量瓶頸 
    現象:記憶體不足,從16G升級到64G,從64G升級到128G,無限升級記憶體 
    本質:窮,硬體條件跟不上 
    結論:放棄使用redis 

結論: 
為了避免單點Redis伺服器故障,準備多臺伺服器,互相連通。將資料複製多個副本儲存在不同的伺服器上,連線在一起,並保證資料是同步的。即使有其中一臺伺服器宕機,其他伺服器依然可以繼續提供服務,實現Redis的高可用,同時實現資料冗餘備份。 

**多臺伺服器連線方案 **

提供資料方:master 
主伺服器,主節點,主庫 
主客戶端 

接收資料方:slave 
從伺服器,從節點,從庫 
從客戶端 
 
需要解決的問題: 
資料同步 
 
核心工作: 
master的資料複製到slave中 
 

主從複製

主從複製即 將master中的資料即時、有效的複製到slave中 
 
特徵:一個master可以擁有多個slave,一個slave只對應一個master 
 
職責: 
master: 
    寫資料 
    執行寫操作時,將出現變化的資料自動同步到slave 
    讀資料(可忽略) 
slave: 
    讀資料 
    寫資料(禁止) 

高可用叢集

主從複製的作用

讀寫分離:master寫、slave讀,提高伺服器的讀寫負載能力 
負載均衡:基於主從結構,配合讀寫分離,由slave分擔master負載,並根據需求的變化,改變slave的數量,通過多個		從節點分擔資料讀取負載,大大提高Redis伺服器併發量與資料吞吐量 
故障恢復:當master出現問題時,由slave提供服務,實現快速的故障恢復 
資料冗餘:實現資料熱備份,是持久化之外的一種資料冗餘方式 
高可用基石:基於主從複製,構建哨兵模式與叢集,實現Redis的高可用方案 

1.2 主從複製工作流程

主從複製過程大體可以分為3個階段 
    建立連線階段(即準備階段) 
    資料同步階段 
    命令傳播階段 

階段一:建立連線階段

建立slave到master的連線,使master能夠識別slave,並儲存slave埠號  

建立連線階段工作流程

步驟1:設定master的地址和埠,slave端儲存master資訊 
步驟2:建立socket連線 
步驟3:傳送ping命令(定時器任務) 
步驟4:身份驗證 
步驟5:傳送slave埠資訊 ,master儲存slave的埠
至此,主從連線成功! 

狀態: 
slave: 
      儲存master的地址與埠 
master: 
      儲存slave的埠 
總體: 
      master與slave之間建立了連線的socket 

主從連線(slave連線master)

方式一:客戶端傳送命令

slaveof  <masterip>  <masterport> 

方式二:啟動伺服器引數

redis-server  -slaveof  <masterip>  <masterport>

方式三:伺服器conf配置

slaveof  <masterip>  <masterport>
	slave系統資訊: 										master系統資訊: 
master_link_down_since_seconds 						slave_listening_port(多個) 
	masterhost 
	masterport 

主從斷開連線(瞭解)

slave客戶端傳送命令

slaveof  no  one

說明:

slave斷開連線後,不會刪除已有資料,只是不再接受master傳送的資料 

授權訪問

master客戶端傳送命令設定密碼:									
 requirepass  <password> 										
master配置檔案設定密碼: 										
config  set  requirepass  <password>							 
config  get  requirepass 
啟動伺服器設定密碼:
redis-server  –a  <password>

主設定密碼,從怎麼訪問?

slave客戶端傳送命令設定密碼:
auth  <password> 
slave配置檔案設定密碼:
masterauth  <password> 

階段二:資料同步階段工作流程

在slave初次連線master後,複製master中的所有資料到slave 
將slave的資料庫狀態更新成master當前的資料庫狀態 

資料同步階段工作流程

步驟1:請求同步資料 
步驟2:建立RDB同步資料 
步驟3:恢復RDB同步資料 
步驟4:請求部分同步資料 
步驟5:恢復部分同步資料 
至此,資料同步工作完成! 
 
狀態: 
slave: 
      具有master端全部資料,包含RDB過程接收的資料 
master: 
      儲存slave當前資料同步的位置 
總體: 
      master、slave之間完成了資料克隆 
過程:
slave傳送psync2同步指令,master執行bgsave,此時master建立了命令緩衝區,將basave過程中的命令放在緩衝區,生成的 RDB檔案傳送給slave。然後將緩衝區中命令再發送給slave恢復。

資料同步階段master說明

1.如果master資料量巨大,資料同步階段應避開流量高峰期,避免造成master阻塞,影響業務正常執行 
2.複製緩衝區大小設定不合理,會導致資料溢位。如進行全量複製週期太長,進行部分複製時發現數據已經存在丟失的情況,必須進行第二次全量複製,致使slave陷入死迴圈狀態。 

master設定同步資料塊大小(命令緩衝區)

repl-backlog-size  1mb(預設)  
3.master單機記憶體佔用主機記憶體的比例不應過大,建議使用50%-70%的記憶體,留下30%-50%的記憶體用於執行bgsave命令和建立複製緩衝區 

資料同步階段slave說明

1.為避免slave進行全量複製、增量複製時伺服器響應阻塞或資料不同步,建議關閉此期間的對外服務 
(關閉寫資料功能)
slave-serve-stale-data  yes|no 

2.資料同步階段,master傳送給slave資訊可以理解master是slave的一個客戶端,主動向slave傳送命令
3.多個slave同時對master請求資料同步,master傳送的RDB檔案增多,會對頻寬造成巨大沖擊,如果master頻寬不足,因此資料同步需要根據業務需求,適量錯峰 
4.slave過多時,建議調整拓撲結構,由一主多從結構變為樹狀結構,中間的節點既是master,也是slave。注意使用樹狀結構時,由於層級深度,導致深度越高的slave與最頂層master間資料同步延遲較大,資料一致性變差,應謹慎選擇 

階段三:命令傳播階段

當master資料庫狀態被修改後,導致主從伺服器資料庫狀態不一致,此時需要讓主從資料同步到一致的狀態,同步的動作稱為命令傳播 
master將接收到的資料變更命令傳送給slave,slave接收命令後執行命令 

命令傳播階段的部分複製

命令傳播階段出現了斷網現象 
    網路閃斷閃連 			 忽略
    短時間網路中斷 		部分複製
    長時間網路中斷 		全量複製
部分複製的三個核心要素 
    伺服器的執行 id(run id) 
    主伺服器的複製積壓緩衝區 
    主從伺服器的複製偏移量 

伺服器執行ID(run id)

概念:
	伺服器執行ID是每一臺伺服器每次執行的身份識別碼,一臺伺服器多次執行可以生成多個執行id 
 
組成:
	執行id由40位字元組成,是一個隨機的十六進位制字元 
	例如:fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce 
 
作用:
	執行id被用於在伺服器間進行傳輸,識別身份 
	如果想兩次操作均對同一臺伺服器進行,必須每次操作攜帶對應的執行id,用於對方識別 
 
實現方式:
	執行id在每臺伺服器啟動時自動生成的,master在首次連線slave時,會將自己的執行ID傳送給slave,slave儲存此ID,通過 info Server 命令,可以檢視節點的run id 

複製緩衝區

概念:複製緩衝區,又名複製積壓緩衝區,是一個先進先出(FIFO)的佇列,用於儲存伺服器執行過的命令,每次傳播命令,master都會將傳播的命令記錄下來,並存儲在複製緩衝區 

複製緩衝區內部工作原理

組成 
    偏移量 
    位元組值 
    
工作原理 
    通過offset區分不同的slave當前資料傳播的差異 
    master記錄已傳送的資訊對應的offset 
    slave記錄已接收的資訊對應的offset 
概念:複製緩衝區,又名複製積壓緩衝區,是一個先進先出(FIFO)的佇列,用於儲存伺服器執行過的命
令,每次傳播命令,master都會將傳播的命令記錄下來,並存儲在複製緩衝區 

複製緩衝區預設資料儲存空間大小是1M,由於儲存空間大小是固定的,當入隊元素的數量大於佇列長度時,最先入隊的元素會被彈出,而新元素會被放入佇列 

由來:每臺伺服器啟動時,如果開啟有AOF或被連線成為master節點,即建立複製緩衝區 

作用:用於儲存master收到的所有指令(僅影響資料變更的指令,例如set,select(切換資料庫))

資料來源:當master接收到主客戶端的指令時,除了將指令執行,會將該指令儲存到緩衝區中

主從伺服器複製偏移量(offset)

概念:一個數字,描述複製緩衝區中的指令位元組位置 
 
分類: 
    master複製偏移量:記錄傳送給所有slave的指令位元組對應的位置(多個) 
    slave複製偏移量:記錄slave接收master傳送過來的指令位元組對應的位置(一個) 
    
資料來源: 
    master端:傳送一次記錄一次 
    slave端:接收一次記錄一次 

作用:同步資訊,比對master與slave的差異,當slave斷線後,恢復資料使用 

資料同步+命令傳播階段工作流程(重點)

心跳機制

進入命令傳播階段候,master與slave間需要進行資訊交換,使用心跳機制進行維護,實現雙方連線保持線上

master心跳: 
    指令:PING 
    週期:由repl-ping-slave-period決定,預設10秒 
    作用:判斷slave是否線上 
    查詢:INFO replication     獲取slave最後一次連線時間間隔,lag項維持在0或1視為正常 

slave心跳任務:
    指令:REPLCONF ACK {offset} 
    週期:1秒 
    作用1:彙報slave自己的複製偏移量,獲取最新的資料變更指令 
    作用2:判斷master是否線上 

心跳階段注意事項

當slave多數掉線,或延遲過高時,master為保障資料穩定性,將拒絕所有資訊同步操作 
 min-slaves-to-write  2   // 設定最小的slave寫數量,小於它,就不在寫資料
 min-slaves-max-lag   8   // 設定slave連線時長,大於它,就不在寫資料
 
slave數量少於2個,或者所有slave的延遲都大於等於10秒時,強制關閉master寫功能,停止資料同步
slave數量由slave傳送 REPLCONF ACK命令做確認 
slave延遲由slave傳送 REPLCONF ACK命令做確認 

主從複製工作流程(完整)

1.3 主從複製常見問題

(1)頻繁的全量複製

伴隨著系統的執行,master的資料量會越來越大,一旦master重啟,runid將發生變化,會導致全部slave的全量複製操作
內部優化調整方案: 
1.master內部建立master_replid變數,使用runid相同的策略生成,長度41位,併發送給所有slave 
2.在master關閉時執行命令 shutdown save,進行RDB持久化,將runid與offset儲存到RDB檔案中 
    repl-id  repl-offset    
    通過redis-check-rdb命令可以檢視該資訊 
3.master重啟後加載RDB檔案,恢復資料 
重啟後,將RDB檔案中儲存的repl-id與repl-offset載入到記憶體中 
    master_repl_id = repl    master_repl_offset = repl-offset 
    通過info命令可以檢視該資訊 

作用: 
    本機儲存上次runid,重啟後恢復該值,使所有slave認為還是之前的master 

(2)頻繁的全量複製

問題現象
	網路環境不佳,出現網路中斷,slave不提供服務
問題原因
	複製緩衝區過小,斷網後slave的offset越界,觸發全量複製 
最終結果
	slave反覆進行全量複製 

解決方案
	修改複製緩衝區大小 
	repl-backlog-size 

建議設定如下:
    1.測算從master到slave的重連平均時長second 
    2.獲取master平均每秒產生寫命令資料總量write_size_per_second 
    3.最優複製緩衝區空間 = 2 * second * write_size_per_second 

(1)頻繁的網路中斷

問題現象 
	master的CPU佔用過高 或 slave頻繁斷開連線 
問題原因 
	slave每1秒傳送REPLCONF ACK命令到master 
	當slave接到了慢查詢時(keys * ,hgetall等),會大量佔用CPU效能 
	master每1秒呼叫複製定時函式replicationCron(),比對slave發現長時間沒有進行響應 
最終結果 
	master各種資源(輸出緩衝區、頻寬、連線等)被嚴重佔用 
	
解決方案 
	通過設定合理的超時時間,確認是否釋放slave 
 	repl-timeout
	該引數定義了超時時間的閾值(預設60秒),超過該值,釋放slave   

(2)頻繁的網路中斷

問題現象 
	slave與master連線斷開 
問題原因 
	master傳送ping指令頻度較低 
	master設定超時時間較短 
	ping指令在網路中存在丟包 
	
解決方案 
	提高ping指令傳送的頻度 
 	repl-ping-slave-period 
 	超時時間repl-time的時間至少是ping指令頻度的5到10倍,否則slave很容易判定超時 

資料不一致

問題現象 
	多個slave獲取相同資料不同步 
問題原因 
	網路資訊不同步,資料傳送有延遲 
	
解決方案 
	優化主從間的網路環境,通常放置在同一個機房部署,如使用阿里雲等雲伺服器時要注意此現象 
	監控主從節點延遲(通過offset)判斷,如果slave延遲過大,暫時遮蔽程式對該slave的資料訪問 
 	slave-serve-stale-data  yes|no 
 	
	開啟後僅響應info、slaveof等少數命令(慎用,除非對資料一致性要求很高)