上篇博文我們了解該如何實(shí)現(xiàn)Redis的持久化,這篇博文再get下Redis的主從復(fù)制的相關(guān)知識點(diǎn)茬故,理解主從復(fù)制的操作盖灸、原理以及完全重新同步和部分重新同步的區(qū)別,能優(yōu)化主從復(fù)制并且進(jìn)行故障診斷磺芭。
Redis的安裝和持久化
Redis的主從復(fù)制(replication)
Redis的主從復(fù)制是組成Redis高可用的一部分赁炎,也是必不可少的一部分,通過Redis提供的復(fù)制功能钾腺,將數(shù)據(jù)從Redis(master節(jié)點(diǎn))向另一個Redis(slave節(jié)點(diǎn))復(fù)制甘邀。
我們還是帶著問題去整理這個知識點(diǎn)
- Redis是高可用的一個組成部分,我們?yōu)槭裁葱枰猂edis的主從復(fù)制垮庐,他有哪些作用
- Redis該如何主從復(fù)制松邪,需要注意哪些問題
- Redis的主從復(fù)制原理和機(jī)制是怎么樣的
- Redis的主從復(fù)制該如何調(diào)優(yōu)
- Redis發(fā)生故障時該如何進(jìn)行故障診斷
準(zhǔn)備工作
主從復(fù)制,大多數(shù)是為了數(shù)據(jù)備份哨查、高并發(fā)和高可用逗抑,而要滿足高可用的要求,一般都是兩臺不同的服務(wù)器或者虛擬機(jī)節(jié)點(diǎn),以保證主節(jié)點(diǎn)服務(wù)器宕機(jī)或者其他不可知的原因?qū)е路?wù)不能使用邮府,則需要子節(jié)點(diǎn)的服務(wù)能替代主節(jié)點(diǎn)的服務(wù)器繼續(xù)對外提供服務(wù)荧关。所以我們先準(zhǔn)備兩臺虛擬機(jī),分別安裝redis服務(wù)褂傀,并且啟動服務(wù)忍啤,其次如果讀的QPS比較多的話,一般采用讀寫分離的模式來分離讀數(shù)據(jù)和寫數(shù)據(jù)(主寫從讀)仙辟,通過橫向擴(kuò)容從Redis的實(shí)例來擴(kuò)大讀QPS,而實(shí)現(xiàn)這一功能同波,主從復(fù)制必不可少
具體安裝可以參考上一篇的博文《Redis的安裝》
我們準(zhǔn)備一下兩臺虛擬機(jī),分別對外提供Redis服務(wù):
- 主節(jié)點(diǎn):192.168.56.105:7000
- 子節(jié)點(diǎn):192.168.56.106:7000
Redis主從復(fù)制
Redis復(fù)制的啟動
復(fù)制不僅提高了整個redis的容錯能力叠国,同時也可以對系統(tǒng)進(jìn)行橫向擴(kuò)容等未檩,開啟子節(jié)點(diǎn)復(fù)制父節(jié)點(diǎn)很容易,有三種方法可以進(jìn)行復(fù)制父節(jié)點(diǎn)數(shù)據(jù)
- redis.conf的配置文件中 添加
slaveof master_ip master_port
## redis 5.x 版本中
replicaof master_ip master_port
- 在啟動redis的時候粟焊,使用命令來啟動
redis-server --slaveof master_ip master_port
- 在客戶端cli中指定主節(jié)點(diǎn)
redis> slaveof master_ip master_port
Redis復(fù)制注意事項
- 將主節(jié)點(diǎn)中的
protected-mode
改為no
如果是保護(hù)模式開啟冤狡,則slave node中 使用 info replication 會發(fā)現(xiàn) master_link_status:down 從而導(dǎo)致復(fù)制不成功
- 如果master node中
開啟了授權(quán),則在slave node中需要給予主節(jié)點(diǎn)的密碼
masterauth
master node 中
requirepass passwd
slave node 中
masterauth passwd
- 在最新的版本中
slaveof
已經(jīng)替換為replicaof
项棠,但是slaveof
同樣可以使用悲雳,并且作用是相同的,至于為什么可以通用香追,我從技術(shù)領(lǐng)域角度來說合瓢,閑的無聊,找點(diǎn)事做翅阵。 - 個人建議在做主從復(fù)制時歪玲,一定要將master node做持久化操作迁央,原因是當(dāng)master node節(jié)點(diǎn)重啟服務(wù)時掷匠,如果不做持久化的話,到時會將數(shù)據(jù)清空岖圈,同時slave node的數(shù)據(jù)也會被清空讹语,導(dǎo)致不僅僅master數(shù)據(jù)丟失,slave node的數(shù)據(jù)也會丟失
- 如果想實(shí)現(xiàn)部分重新同步蜂科,那么在redis4.x版本之后顽决,需要將slave node也做持久化操作,至于原因會在下面的原理中給予解釋
Redis復(fù)制的驗(yàn)證
- 開啟rdis復(fù)制之后导匣,我們可以在客戶端中使用
info replication
命令來查看是否已經(jīng)開啟復(fù)制成功
## 主節(jié)點(diǎn)中 cli中執(zhí)行 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.56.106,port=7000,state=online,offset=28,lag=0
## master node中的節(jié)點(diǎn)id
master_replid:43db81ea472435516baa83e0164574bef8ac65f8
master_replid2:0000000000000000000000000000000000000000
## master node中的節(jié)點(diǎn)偏移量
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
## 子節(jié)點(diǎn)中 cli中執(zhí)行 info replication
# Replication
role:slave
master_host:192.168.56.105
master_port:7000
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:43db81ea472435516baa83e0164574bef8ac65f8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
出現(xiàn)如上所述的master node 中 connected_slaves:1
才菠,說明master node存在一個連接的slave node節(jié)點(diǎn),并且slave0
是關(guān)于第一個子節(jié)點(diǎn)的配置信息贡定。在slave node節(jié)點(diǎn)中role
表明這個是子節(jié)點(diǎn)赋访,并且master_host
顯示master node的IP信息,master_link_status
表明是否連接上,up表示連接中蚓耽,down表示連接失敗渠牲,此處連接失敗,可能是master node中protected-mode
為yes導(dǎo)致签杈。
Redis主從復(fù)制的原理和核心機(jī)制
Redis主從復(fù)制的原理:
- slave node啟動時,會向master node發(fā)送 sync命令鼎兽。相當(dāng)于向master node注冊slave node的相關(guān)節(jié)點(diǎn)信息答姥,讓master node知道他存在一個子節(jié)點(diǎn)
- slave node剛啟動時踢涌,會發(fā)送
master_repl_offset
給master node睁壁,由master node決定是走完全重新同步還是部分重新同步步驟潘明,如果master_repl_offset
與master node是中的backlog中能找到,則是部分重新同步,否則是完全重新同步。 - 是完全重新同步:master node會將緩存所有的寫入操作命令灯荧,同時fork一個子線程礁击,生成RDB快照,master node將RDB文件傳給slave node,slave node再將所有的命令同步到本地的內(nèi)存中逗载,如果此時slave node也做了持久化哆窿,則會將數(shù)據(jù)持久化到磁盤中
- 部分重新同步:不需要從master node中轉(zhuǎn)存數(shù)據(jù)文件,master node直接將偏移量之后的所有命令同步發(fā)送給slave node節(jié)點(diǎn)厉斟,在slave node節(jié)點(diǎn)來完成數(shù)據(jù)的更新
流程圖如下:
為了更深層次的理解Redis是如何進(jìn)行主從復(fù)制的挚躯,我們需要知道Redis復(fù)制的核心機(jī)制
- Redis采用異步方式復(fù)制數(shù)據(jù)到slave節(jié)點(diǎn)
- 一個master node 可以配置多個slave node
- slave node之間可以互聯(lián)互通,傳遞類似心跳的數(shù)據(jù)
- slave node在做復(fù)制的時候擦秽,不會阻塞master node的正常工作
- slave node在做復(fù)制的時候码荔,也不會block對自己的查詢操作食侮,它會用舊的數(shù)據(jù)集來提供服務(wù); 但是復(fù)制完成的時候,需要刪除舊數(shù)據(jù)集目胡,加載新數(shù)據(jù)集锯七,這個時候就會暫停對外服務(wù)了
- slave node主要用來進(jìn)行橫向擴(kuò)容,做讀寫分離誉己,擴(kuò)容的slave node可以提高讀的吞吐量
Redis主從復(fù)制調(diào)優(yōu)
根據(jù)上面的主從復(fù)制的原理眉尸,我們可以知道主從復(fù)制進(jìn)行的是完全重新同步還是部分重新同步的主要依據(jù)是slave提交給master的offset偏移量能否在master的replication backlog中查找到,如果能查找到則說明進(jìn)行部分重新同步操作巨双,如果查找不到則說明進(jìn)行完全重新同步操作
再次之前我們先了解下 replication backlog是什么噪猾?
replication backlog是master中的環(huán)形緩沖區(qū),該區(qū)域記錄的是最新所有的寫入命令筑累,是一個固定長度的列表!
知道上述原理袱蜡,我們可以通過控制backlog中的值的大小來控制是否進(jìn)行完全重新同步還是部分重新同步,在redis.conf配置文件中backlog的大小是通過 repl-backlog-size
來控制的慢宗,默認(rèn)是1mb
在實(shí)際生產(chǎn)中坪蚁,我們可以通過info replication中獲取 master_repl_offset
的大小來估算backlog的大小
Redis主從復(fù)制故障診斷
影響Redis主從復(fù)制故障的原因可能有:磁盤IO、網(wǎng)絡(luò)連接镜沽、數(shù)據(jù)集大小和長時間的阻塞等因素敏晤。
說起主從復(fù)制,我們需要先了解主從之間是怎么判斷彼此之間的通訊缅茉,master想要知道slave是否正常運(yùn)行嘴脾,則會向slave發(fā)送ping命令,我們可以通過repl-ping-replica-period
參數(shù)來調(diào)整這個間隔蔬墩,默認(rèn)間隔是10s
那么主從實(shí)例又是如何判斷彼此之間復(fù)制鏈接被斷開呢译打?
slave會向master發(fā)送REPLCONF ACK來報告他的復(fù)制偏移量,對Ping和REPLCONF ACK來說拇颅,都可以通過repl-timeout
來指定超時時間奏司,該值默認(rèn)時間是60s,如果兩次PING護(hù)著REPLCONF ACK之間的時間間隔比超時時間差蔬蕊,則可以認(rèn)為主從復(fù)制鏈接被斷開结澄。
master向slave進(jìn)行完全重新同步時哥谷,master會生成RDB快照文件岸夯,然后發(fā)送給slave,slave將RDB快照中的文件數(shù)據(jù)存儲到slave的內(nèi)存中,在這個步驟執(zhí)行的過程中们妥,如果master有新的數(shù)據(jù)寫入猜扮,則master會將這部分?jǐn)?shù)據(jù)寫入到從客戶端緩沖區(qū)(slave client buffer)中,在slaveRDB加載之后监婶,將該緩沖區(qū)的數(shù)據(jù)發(fā)送給slave實(shí)例旅赢。但是這個實(shí)例是有大小限制的齿桃,當(dāng)緩沖區(qū)的數(shù)據(jù)超過這個默認(rèn)值時,則會導(dǎo)致復(fù)制重新開始煮盼。
所以我們在復(fù)制故障診斷時短纵,需要注意參數(shù)repl-ping-replication-period
和repl-timeout
的值的控制,在生產(chǎn)環(huán)境中 repl-ping-replication-period
一定要比repl-timeout
小僵控,否則容易造成復(fù)制超時香到。