詳解Redis主從復(fù)制實踐
復(fù)制簡介
Redis 作為一門非關(guān)系型數(shù)據(jù)庫,其復(fù)制功能和關(guān)系型數(shù)據(jù)庫(MySQL)來說,功能其實都是差不多,無外乎就是實現(xiàn)的原理不同。Redis 的復(fù)制功能也是相對于其他的內(nèi)存性數(shù)據(jù)庫(memcached)所具備特有的功能。
Redis 復(fù)制功能主要的作用,是集群、分片功能實現(xiàn)的基礎(chǔ);同時也是 Redis 實現(xiàn)高可用的一種策略,例如解決單機(jī)并發(fā)問題、數(shù)據(jù)安全性等等問題。
服務(wù)介紹
在本文環(huán)境演示中,有一臺主機(jī),啟動了兩個 Redis 示例。

實現(xiàn)方式
Redis 復(fù)制實現(xiàn)方式分為下面三種方式:
1. 服務(wù)啟動時配置
該方式通過在啟動 Redis 服務(wù)時,通過命令行參數(shù),進(jìn)行啟動主從復(fù)制功能。該方式的弊端是不能實現(xiàn)配置持久化,當(dāng)服務(wù)停掉之后,啟動服務(wù)時,需要添加相同的命令參數(shù)。
1.1 master 服務(wù)器事先在 redis.confg 增加 requirepass 項。
requirepass 6379
1.2 啟動從服務(wù)器。
redis-server --port 6380 --replicaof 192.168.2.102 6379
2. 命令行配置
該方式通過使用 redis-cli 進(jìn)入操作行界面,進(jìn)行配置。該方式的弊端是不能實現(xiàn)配置持久化,當(dāng)服務(wù)停掉之后,啟動服務(wù)需要執(zhí)行同樣的命令。
2.1 master 服務(wù)器執(zhí)行。
127.0.0.1:6379> config set requirepass 6379 OK
2.2 從服務(wù)器執(zhí)行。
127.0.0.1:6380> replicaof 192.168.2.102 6379 OK 127.0.0.1:6380> config set masterauth 6379 OK
3. 配置文件配置
該方式是通過 redis.conf 配置文件進(jìn)行設(shè)置,能夠?qū)崿F(xiàn)配置的持久化,是一種推薦使用的方式。
3.1 配置主服務(wù)器,redis.config。
requirepass 6379
3.2 配置從服務(wù)器,redis.config。
masterauth 6379 replicaof 192.168.2.102 6379
4.配置說明
1.masterauth:設(shè)置 redis.confi 連接密碼,如果設(shè)置了該值。其他客戶端在連接該服務(wù)器時,需要添加密碼才可以訪問。
2.requirepass:設(shè)置主服務(wù)器的連接密碼,和 1 中 masterauth 一致。
3.replicaof:從服務(wù)器連接到服務(wù)器的 IP 地址+端口號。
效果測試
1.主服務(wù)器添加數(shù)據(jù)

2.從服務(wù)器獲取數(shù)據(jù)

實現(xiàn)原理

// uml圖
@startuml
從服務(wù)器->主服務(wù)器: 1.保存配置
從服務(wù)器->主服務(wù)器: 2.建立socket連接
從服務(wù)器->主服務(wù)器: 3.發(fā)送ping命令
從服務(wù)器->主服務(wù)器: 4.權(quán)限驗證
從服務(wù)器->主服務(wù)器: 5.同步數(shù)據(jù)
從服務(wù)器->主服務(wù)器: 6.持續(xù)復(fù)制數(shù)據(jù)
@enduml
主從復(fù)制主要實現(xiàn)的一個流程如上圖:
1.第一步,從服務(wù)器保存主服務(wù)器的配置信息,保存之后待從服務(wù)器內(nèi)部的定時器執(zhí)行時,就會觸發(fā)復(fù)制的流程。
2.第二步,從服務(wù)器首先會與主服務(wù)器建立一個socket套字節(jié)連接,用作主從通信使用。后面主服務(wù)器發(fā)送數(shù)據(jù)給從服務(wù)器也是通過該套字節(jié)進(jìn)行。
3.第三步,socket套字節(jié)連接成功之后,接著發(fā)送鑒權(quán)ping命令,正常的情況下,主服務(wù)器會發(fā)送對應(yīng)的響應(yīng)。ping命令的作用是為了,保證socket套字節(jié)是否可以用,同時也是為了驗證主服務(wù)器是否接受操作命令。
4.第四步,接著就是鑒權(quán)驗證,判斷從節(jié)點配置的主節(jié)點連接密碼是否正確。
5.第五步,鑒權(quán)成功之后,就可以開始復(fù)制數(shù)據(jù)了。主服務(wù)器此時會進(jìn)行全量復(fù)制,將主服務(wù)的數(shù)據(jù)全部發(fā)給從服務(wù)器,從服務(wù)器保存主服務(wù)器發(fā)送的數(shù)據(jù)。
6.接下來就是持續(xù)復(fù)制操作。主服務(wù)器會進(jìn)行異步復(fù)制,一邊將寫的數(shù)據(jù)寫入自身,同時會將新的寫命令發(fā)送給從服務(wù)器。
實現(xiàn)策略
Redis主從復(fù)制主要分為三種弄策略方式,不同的策略方式都是針對不同的場景下進(jìn)行使用。三種場景方式分別如下:
1.全量復(fù)制
全量復(fù)制用在主從復(fù)制剛建立時或者從切主服務(wù)器時,從服務(wù)器沒有主服務(wù)器的數(shù)據(jù),主服務(wù)器會將自身的數(shù)據(jù)通過rdb文件方式發(fā)送給從服務(wù)器,從服務(wù)器會清空自身數(shù)據(jù),接著將主服務(wù)器發(fā)送的數(shù)據(jù)加載到自身中。

// uml圖
@startuml
從服務(wù)器->主服務(wù)器: 1.psync ? -1
主服務(wù)器->從服務(wù)器: 2.fullsync runid offset
從服務(wù)器: 3.保存 runid offset
主服務(wù)器: 4.執(zhí)行bgsave生成rdb
主服務(wù)器->從服務(wù)器: 5.發(fā)送rdb
從服務(wù)器: 6.清空自身老數(shù)據(jù)
從服務(wù)器: 7.加載主服務(wù)器數(shù)據(jù)
@enduml
2.部分復(fù)制
部分復(fù)制用在一些異常情況下,例如主從延遲、從服務(wù)宕機(jī)之后重新啟動接收主服務(wù)器發(fā)送的部分?jǐn)?shù)據(jù)。
部分復(fù)制的實現(xiàn)主要依賴于復(fù)制緩存區(qū)、主服務(wù)的runid、主從服務(wù)器各自的復(fù)制偏移量(offset)。
復(fù)制緩存區(qū):主服務(wù)在接收寫命令時,會將命令寫入緩存區(qū),以便從服務(wù)器在異常情況下,減少數(shù)據(jù)的丟失。當(dāng)從服務(wù)器正常連接之后,主服務(wù)器會將緩存區(qū)內(nèi)的數(shù)據(jù)發(fā)送給從服務(wù)器。這里的緩存區(qū)是一個長隊列。
主服務(wù)器runid:主服務(wù)器會在每次服務(wù)啟動之后,會生成一個唯一的ID,作為自身標(biāo)識。從服務(wù)器會將該標(biāo)識保存起來,發(fā)送部分復(fù)制命令時,會使用該runid。
psync runid offset
主從復(fù)制各自偏移量:主從服務(wù)在建立復(fù)制之后,都會有自身的偏移量。從節(jié)點會每秒鐘發(fā)送自身復(fù)制的偏移量給從節(jié)點,主節(jié)點在發(fā)送寫命令之后,從節(jié)點也會增加自身的復(fù)制偏移量。主節(jié)點在每次進(jìn)行了寫命令之后,也會增加自身的偏移量。這里的偏移量是通過命令的字節(jié)長度累加計算。
3.異步復(fù)制
異步復(fù)制是針對主從建立復(fù)制關(guān)系之后,主從服務(wù)器持續(xù)保持復(fù)制關(guān)系。
場景問題
1.數(shù)據(jù)安全
// 從服務(wù)器只讀 replica-read-only yes // 從服務(wù)器連接密碼 masterauth
2.數(shù)據(jù)延遲
默認(rèn)的情況下主節(jié)點存在新數(shù)據(jù)不會立即發(fā)送給從服務(wù)器,如果開啟,則會理解發(fā)送給從服務(wù)器。默認(rèn)的時間拒絕與Linux內(nèi)核。
// 復(fù)制延遲 repl-disable-tcp-nodelay yes
3.主從節(jié)點連接狀態(tài)
主從節(jié)點一旦建立連接之后,會定時模擬成對方的客戶端,檢測對方的服務(wù)狀態(tài)。主節(jié)點可以通過設(shè)置repl-ping-replica-period配置參數(shù)進(jìn)行設(shè)置。默認(rèn)的頻率是10s。
從節(jié)點咋執(zhí)行replconf ack {offsetid}時,也會將自身的復(fù)制偏移量發(fā)送給主服務(wù)器,主服務(wù)根據(jù)偏移量進(jìn)行判斷數(shù)據(jù)延遲。存在數(shù)據(jù)延遲就會從復(fù)制積壓緩沖區(qū)的數(shù)據(jù)匯中,將對應(yīng)的數(shù)據(jù)補(bǔ)發(fā)給從節(jié)點。
以上就是詳解Redis主從復(fù)制實踐的詳細(xì)內(nèi)容,更多關(guān)于Redis主從復(fù)制實踐的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Win10配置redis服務(wù)實現(xiàn)過程詳解
這篇文章主要介紹了Win10配置redis服務(wù)實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07

