【Redis】15.Redis主从复制
主從復(fù)制簡(jiǎn)介
互聯(lián)網(wǎng)“三高”架構(gòu)
你的"Redis"是否高可用
單機(jī)redise風(fēng)險(xiǎn)與問(wèn)題
- 問(wèn)題1 機(jī)器故障
現(xiàn)象:硬件故障、系統(tǒng)崩潰
本質(zhì):數(shù)據(jù)丟失,很可能對(duì)業(yè)務(wù)造成災(zāi)難性打擊
結(jié)論:基本上會(huì)放棄使用redis - 問(wèn)題2 容量瓶頸
現(xiàn)象:內(nèi)存不足,從16G升級(jí)到64G,無(wú)限升級(jí)內(nèi)存
本質(zhì):窮,硬件條件跟不上
結(jié)論:放棄使用redis - 結(jié)論:
為了避免單點(diǎn)redis服務(wù)器故障,準(zhǔn)備多臺(tái)服務(wù)器,互相連通。將數(shù)據(jù)復(fù)制多個(gè)副本保存在不同的服務(wù)器上,連接在一起,并保證數(shù)據(jù)是否同步的,即使有其中一臺(tái)服務(wù)器宕機(jī),其他服務(wù)器依然可以繼續(xù)提供服務(wù),實(shí)現(xiàn)Redis的高可用,同時(shí)實(shí)現(xiàn)數(shù)據(jù)冗余備份。
多臺(tái)服務(wù)器連接方案
- 提供多數(shù)據(jù)方:master
主服務(wù)器,主節(jié)點(diǎn),主庫(kù)
主客戶端 - 接受數(shù)據(jù)方:slave
從服務(wù)器,從節(jié)點(diǎn),從庫(kù)
從客戶端 - 需要解決的問(wèn)題
數(shù)據(jù)同步 - 核心工作
master的數(shù)據(jù)復(fù)制到slave中
主從復(fù)制
主從復(fù)制即將master中的數(shù)據(jù)即時(shí),有效的復(fù)制到slave中
特征:一個(gè)master可以擁有多個(gè)slave,一個(gè)slave只對(duì)應(yīng)一個(gè)master
職責(zé):
- master:
寫數(shù)據(jù)
執(zhí)行寫操作時(shí),將出現(xiàn)變化的數(shù)據(jù)自動(dòng)同步到slave
讀數(shù)據(jù)(可忽略) - slave:
讀數(shù)據(jù)
寫數(shù)據(jù)(禁止)
高可用集群
主從復(fù)制的作用
- 讀寫分離:master寫,slave讀,提高服務(wù)器的讀寫負(fù)載能力
- 負(fù)載均衡:基于主從結(jié)構(gòu),配合讀寫分離,由slave分擔(dān)master負(fù)載,并根據(jù)需求的變化,改變slave的數(shù)量,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)數(shù)據(jù)讀取負(fù)載,大大提高Redis服務(wù)器并發(fā)量與數(shù)據(jù)吞吐量
- 故障恢復(fù):當(dāng)master出現(xiàn)問(wèn)題時(shí),由slave提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù)
- 數(shù)據(jù)冗余:實(shí)現(xiàn)數(shù)據(jù)熱備份,時(shí)持久化之外的一種數(shù)據(jù)冗余方式
- 高可用基石:基于主從復(fù)制,構(gòu)建哨兵模式與集群,實(shí)現(xiàn)Redis的高可用方案
主從復(fù)制工作流程
總述
- 主從復(fù)制過(guò)程大體可以分為3個(gè)階段
建立連接階段(即準(zhǔn)備階段)
數(shù)據(jù)同步階段
命令傳播階段
階段一:建立鏈接 - 建立slave到master的鏈接,使master能夠識(shí)別slave,并保存slave端口號(hào)
至此,主從鏈接成功!
狀態(tài):
slave:保存master的地址和端口
master:保存slave的端口
總體:之間創(chuàng)建了鏈接的socket
主從鏈接(slave鏈接master)
- 方式一:客戶端發(fā)送命令
slaveof< masterip>< masterport>
- 方式二:啟動(dòng)服務(wù)器參數(shù)
redis-server --slaveof < masterip>< masterport>
- 方式三:服務(wù)器配置(主流方式:通過(guò)配置文件配置)
slaveof < masterip>< masterport>
- slave信息系統(tǒng)
master_link_down_since_second
masterhost
masterport - master信息系統(tǒng)
slave_listening_port(多個(gè))
主從斷開鏈接
- 客戶端發(fā)送命令
slaveof no one
授權(quán)訪問(wèn)
階段二、數(shù)據(jù)同步階段工作流程
- 在slave初次鏈接master后,復(fù)制master中的所有數(shù)據(jù)到slave
- 將slave的數(shù)據(jù)庫(kù)狀態(tài)更新成master當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)
步驟1:請(qǐng)求同步
步驟2:創(chuàng)建RDB同步數(shù)據(jù)
步驟3:恢復(fù)RDB同步數(shù)據(jù)
步驟4:請(qǐng)求部分同步數(shù)據(jù)
步驟5:恢復(fù)部分同步數(shù)據(jù)
至此,數(shù)據(jù)同步工作完成
狀態(tài):
slave:具有master端全部數(shù)據(jù),包含RDB過(guò)程接收的數(shù)據(jù)
master:保存slave當(dāng)前數(shù)據(jù)同步的位置
總體:之間完成了數(shù)據(jù)克隆
數(shù)據(jù)同步階段master說(shuō)明
repl-backlog-size 1mb(默認(rèn)1mb)
數(shù)據(jù)同步階段slave說(shuō)明
slave-server-stale-data yes|no
階段三:命令傳播階段
- 當(dāng)master數(shù)據(jù)庫(kù)狀態(tài)被修改后,導(dǎo)致主從服務(wù)器數(shù)據(jù)庫(kù)狀態(tài)不一致,此時(shí)需要讓主從數(shù)據(jù)同步到一致的狀態(tài),同步的動(dòng)作成為命令傳播
- master將接受到的數(shù)據(jù)變更命令發(fā)送給slave,slave接受命令后執(zhí)行命令。
命令傳播階段的部分復(fù)制
- 命令傳播階段出現(xiàn)了斷網(wǎng)的現(xiàn)象
網(wǎng)絡(luò)閃斷閃連 忽略
短時(shí)間網(wǎng)絡(luò)中斷 部分復(fù)制
長(zhǎng)時(shí)間網(wǎng)絡(luò)中斷 全量復(fù)制 - 部分復(fù)制的三個(gè)要素
服務(wù)器的運(yùn)行id (run id)
主服務(wù)器的復(fù)制積壓緩沖區(qū)
主從服務(wù)器的復(fù)制偏移量
服務(wù)器運(yùn)行id
復(fù)制緩沖區(qū)
- 概念:復(fù)制緩沖區(qū),又名復(fù)制積壓緩沖區(qū),時(shí)一個(gè)先進(jìn)先出(FIFO)的隊(duì)列,用于存儲(chǔ)服務(wù)器執(zhí)行過(guò)的命令,每次傳播命令,master會(huì)將傳播的命令記錄下來(lái),并存儲(chǔ)在復(fù)制緩沖區(qū)
復(fù)制緩沖區(qū)默認(rèn)存儲(chǔ)空間大小是1M,由于存儲(chǔ)空間大小是固定的,當(dāng)入隊(duì)元素的數(shù)量大于隊(duì)列長(zhǎng)度時(shí),最先入隊(duì)的元素會(huì)被彈出,而新元素會(huì)被放入隊(duì)列 - 由來(lái):每臺(tái)服務(wù)器啟動(dòng)時(shí),如果開啟有AOF或被鏈接成為master節(jié)點(diǎn),即創(chuàng)建復(fù)制緩沖區(qū)。
- 作用:用來(lái)保存master收到的所有指令(僅影響數(shù)據(jù)變更的指令,例如set,select)
- 數(shù)據(jù)來(lái)源:
當(dāng)master接收到主客戶端的指令時(shí),除了將指令執(zhí)行,會(huì)將該指令存儲(chǔ)到緩沖區(qū)中。
master端:發(fā)送一次記錄一次
slaver端:接受一次記錄一次 - 組成
偏移量
字節(jié)值 - 工作原理
主從服務(wù)器復(fù)制偏移量(offset)
- 概念:一個(gè)數(shù)字,描述復(fù)制緩沖區(qū)中的指令字節(jié)位置
- 分類:
master復(fù)制偏移量:記錄發(fā)送給所有slave的指令字節(jié)對(duì)應(yīng)的位置(多個(gè))
slave復(fù)制偏移量:記錄slave接受master發(fā)送過(guò)來(lái)的指令字節(jié)對(duì)應(yīng)的位置(一個(gè)) - 數(shù)據(jù)來(lái)源:
master端:發(fā)送一次記錄一次
slave端:接收一次記錄一次 - 作用:同步信息,對(duì)比master與slave的差異,當(dāng)slave斷線后,恢復(fù)數(shù)據(jù)使用
數(shù)據(jù)同步+命令傳播階段工作流程
心跳機(jī)制
- 進(jìn)入命令傳播階段后,master與slave間需要進(jìn)行信息交換,使用心跳機(jī)制進(jìn)行維護(hù),實(shí)現(xiàn)雙方連接保持在線
- master心跳
指令:PING
周期:由repl-ping-slave-period決定,默認(rèn)10秒
作用:判斷slave是否在線
查詢: INFO replication 獲取slave最后一次鏈接時(shí)間間隔,lag項(xiàng)維持在0或1視為正常 - slave心跳指令
指令:REPLCONF ACK{offset}
周期:1秒
作用1:匯報(bào)slave自己的復(fù)制偏移量,獲取最新的數(shù)據(jù)變更指令
作用2:判斷master是否在線
心跳階段注意事項(xiàng) - 當(dāng)slave多數(shù)掉線,或延遲過(guò)高時(shí),master為保障數(shù)據(jù)穩(wěn)定性,將拒絕所有信息同步操作
min-slave-to-write 2
min-slave-max-lag 8
slave數(shù)量少于2個(gè)或者多有slave延遲都大于等于10秒時(shí),強(qiáng)制關(guān)閉master寫功能,停止數(shù)據(jù)同步
- slave數(shù)量由slave發(fā)送REPLCONF ACK命令做確認(rèn)
- slave延遲由slave發(fā)送REPLCONF ACK命令做queen
主從復(fù)制完整工作流程
主從復(fù)制常見問(wèn)題
頻繁的全量復(fù)制(1)
伴隨著系統(tǒng)的運(yùn)行,master的數(shù)據(jù)量會(huì)越來(lái)越大,一旦master重啟,runid將發(fā)生變化,會(huì)導(dǎo)致全部salve的全量復(fù)制操作
頻繁的全量復(fù)制(2)
- 問(wèn)題現(xiàn)象
網(wǎng)絡(luò)環(huán)境不佳,出現(xiàn)網(wǎng)絡(luò)中斷,slave不提供服務(wù) - 問(wèn)題原因
復(fù)制緩沖區(qū)過(guò)小,斷網(wǎng)后slave的offset越界,觸發(fā)全量復(fù)制 - 最終結(jié)果
slave反復(fù)進(jìn)行全量復(fù)制 - 解決方案
修改復(fù)制緩沖區(qū)大小
repl-backlog-size
- 建議設(shè)置如下
1.測(cè)算從master到slave的重連平均時(shí)長(zhǎng)second
2.獲取master平均每秒產(chǎn)生寫命令數(shù)據(jù)總量write_size_per_second
3.最優(yōu)復(fù)制緩沖區(qū)空間=2 * second * write_size_per_second
頻繁的網(wǎng)絡(luò)中斷(1)
- 問(wèn)題現(xiàn)象
master的CPU占用過(guò)高或slave頻繁斷開連接 - 問(wèn)題原因
slave每1秒發(fā)送REPLCONF ACK命令到master
當(dāng)slave連接了慢查詢時(shí)(keys * , hgetall等),會(huì)大量占用CPU性能
master每1秒調(diào)用復(fù)制定時(shí)函數(shù)replicationCron()輪尋時(shí),對(duì)比slave發(fā)現(xiàn)長(zhǎng)時(shí)間沒(méi)有進(jìn)行響應(yīng) - 最終結(jié)果
master各種資源(輸出緩沖區(qū)、寬帶、連接等)被嚴(yán)重占用 - 解決方案
通過(guò)設(shè)置合理的超時(shí)時(shí)間,確認(rèn)是否釋放slave
repl-timeout
該參數(shù)定義了超時(shí)時(shí)間的閾值(默認(rèn)60秒),超過(guò)該值,釋放slave
頻繁的網(wǎng)絡(luò)中斷(2)
- 問(wèn)題現(xiàn)象
slave與master連接斷開 - 問(wèn)題原因
master發(fā)送ping指令頻度較低
master設(shè)定超時(shí)時(shí)間較短
ping指令在網(wǎng)絡(luò)中存在丟包 - 解決方案
提高ping指令發(fā)送的頻度
repl-ping-slave-period
超時(shí)時(shí)間repl-time的時(shí)間至少是ping指令頻度的5-10倍,否則slave很容易判定超時(shí)
數(shù)據(jù)不一致
- 問(wèn)題現(xiàn)象
多個(gè)slave獲取相同數(shù)據(jù)不同步 - 問(wèn)題原因
網(wǎng)絡(luò)信息不同步,數(shù)據(jù)發(fā)送有延遲 - 解決方案
優(yōu)化主從間的網(wǎng)絡(luò)環(huán)境,通常防止在同一個(gè)機(jī)房部署,如使用阿里云等云服務(wù)器時(shí)要注意此現(xiàn)象
監(jiān)控主從節(jié)點(diǎn)延遲(通過(guò)offset)判斷,如果slave延遲過(guò)大,暫時(shí)屏蔽程序?qū)υ搒lave的數(shù)據(jù)訪問(wèn)
slave-server-stale-data yes|no
開啟后僅響應(yīng)info、slaveof等少數(shù)命令(慎用,除非對(duì)數(shù)據(jù)一致性要求很高)
總結(jié)
以上是生活随笔為你收集整理的【Redis】15.Redis主从复制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Redis】14.Redis高级数据类
- 下一篇: 【Redis】16.Redis哨兵