Redis主從復制

在分布式系統(tǒng)中為了解決單點問題,通常會把數(shù)據(jù)復制多個副本部署到 其他機器,滿足故障恢復和負載均衡等需求

1.配置

1)建立復制

參與復制的Redis實例劃分為主節(jié)點(master)和從節(jié)點(slave)。默認 情況下,Redis都是主節(jié)點。每個從節(jié)點只能有一個主節(jié)點,而主節(jié)點可以同時具有多個從節(jié)點。復制的數(shù)據(jù)流是單向的,只能由主節(jié)點復制到從節(jié)點

配置復制的方式有以下三種:

1)在配置文件中加入slaveof{masterHost}{masterPort}隨Redis啟動生效。

2)在redis-server啟動命令后加入--slaveof{masterHost}{masterPort}生效。

3)直接使用命令:slaveof{masterHost}{masterPort}生效。

slaveof命令在使用時,可以運行期動態(tài)配置,也可以提前寫 到配置文件中。例如本地啟動兩個端口為6379和6380的Redis節(jié)點,在 127.0.0.1:6380執(zhí)行如下命令:

127.0.0.1:6380>slaveof 127.0.0.1 6379

slaveof配置都是在從節(jié)點發(fā)起,這時6379作為主節(jié)點,6380作為從節(jié)點

用info replication命令查看復制相關狀態(tài)





2)斷開復制

slaveof命令不但可以建立復制,還可以在從節(jié)點執(zhí)行slaveof no one來斷 開與主節(jié)點復制關系

斷開復制主要流程:

1)斷開與主節(jié)點復制關系。

2)從節(jié)點晉升為主節(jié)點。

從節(jié)點斷開復制后并不會拋棄原有數(shù)據(jù),只是無法再獲取主節(jié)點上的數(shù)據(jù)變化

通過slaveof命令還可以實現(xiàn)切主操作,所謂切主是指把當前從節(jié)點對主 節(jié)點的復制切換到另一個主節(jié)點。執(zhí)行slaveof{newMasterIp} {newMasterPort}命令即可,例如把6380節(jié)點從原來的復制6379節(jié)點變?yōu)閺?制6381節(jié)點



切主操作流程如下:

1)斷開與舊主節(jié)點復制關系。

2)與新主節(jié)點建立復制關系。

3)刪除從節(jié)點當前所有數(shù)據(jù)。

4)對新主節(jié)點進行復制操作。

切主后從節(jié)點會清空之前所有的數(shù)據(jù),線上人工操作時小心slaveof在錯誤的節(jié)點上執(zhí)行或者指向錯誤的主節(jié)點

3)只讀

默認情況下,從節(jié)點使用slave-read-only=yes配置為只讀模式。由于復制只能從主節(jié)點到從節(jié)點,對于從節(jié)點的任何修改主節(jié)點都無法感知,修改從節(jié)點會造成主從數(shù)據(jù)不一致。因此建議線上不要修改從節(jié)點的只讀模式。

4)傳輸延遲

復制時的網(wǎng)絡延遲就成為需要考慮的 問題,Redis為我們提供了repl-disable-tcp-nodelay參數(shù)用于控制是否關閉 TCP_NODELAY,默認關閉

·當關閉時,主節(jié)點產(chǎn)生的命令數(shù)據(jù)無論大小都會及時地發(fā)送給從節(jié)點,這樣主從之間延遲會變小,但增加了網(wǎng)絡帶寬的消耗。適用于主從之間

的網(wǎng)絡環(huán)境良好的場景,如同機架或同機房部署。

·當開啟時,主節(jié)點會合并較小的TCP數(shù)據(jù)包從而節(jié)省帶寬。默認發(fā)送 時間間隔取決于Linux的內(nèi)核,一般默認為40毫秒。這種配置節(jié)省了帶寬但

增大主從之間的延遲。適用于主從網(wǎng)絡環(huán)境復雜或帶寬緊張的場景,如跨機房部署

提示

部署主從節(jié)點時需要考慮網(wǎng)絡延遲、帶寬使用率、防災級別等因素,如 要求低延遲時,建議同機架或同機房部署并關閉repl-disable-tcp-nodelay;如 果考慮高容災性,可以同城跨機房部署并開啟repl-disable-tcp-nodelay

5)拓撲

根據(jù)拓撲復雜性可以分為以下三種:一主一從、一主多從、樹狀主從結構

5.1)一主一從結構


.....當應用寫命令并發(fā)量較高且需要持久 化時,可以只在從節(jié)點上開啟AOF,這樣既保證數(shù)據(jù)安全性同時也避免了持久化對主節(jié)點的性能干擾

.....但需要注意的是,當主節(jié)點關閉持久化功能時,如果主節(jié)點脫機要避免自動重啟操作。因為主節(jié)點之前沒有開啟持久化功能自動重啟后數(shù)據(jù)集為空,這時從節(jié)點如果繼續(xù)復制主節(jié)點會導致從節(jié)點數(shù)據(jù)也被清空的情況,喪失了持久化的意義。安全的做法是在從節(jié)點上執(zhí)行 slaveof no one斷開與主節(jié)點的復制關系,再重啟主節(jié)點從而避免這一問題

5.2) 一主多從結構


一主多從結構(又稱為星形拓撲結構)使得應用端可以利用多個從節(jié)點 實現(xiàn)讀寫分離,對于讀占比較大的場景,可以把讀命令發(fā)送到

從節(jié)點來分擔主節(jié)點壓力,同時在日常開發(fā)中如果需要執(zhí)行一些比較耗時的 讀命令,如:keys、sort等,可以在其中一臺從節(jié)點上執(zhí)行,防止慢查詢對主節(jié)點造成阻塞從而影響線上服務的穩(wěn)定性。對于寫并發(fā)量較高的場景,多個從節(jié)點會導致主節(jié)點寫命令的多次發(fā)送從而過度消耗網(wǎng)絡帶寬,同時也加重了主節(jié)點的負載影響服務穩(wěn)定性


5.3) 樹狀主從結構


樹狀主從結構(又稱為樹狀拓撲結構)使得從節(jié)點不但可以復制主節(jié)點數(shù)據(jù),同時可以作為其他從節(jié)點的主節(jié)點繼續(xù)向下層復制。通過引入復制中 間層,可以有效降低主節(jié)點負載和需要傳送給從節(jié)點的數(shù)據(jù)量

數(shù)據(jù)寫入節(jié)點A后會同步到B和C節(jié)點,B節(jié)點再把數(shù)據(jù)同步到D和E節(jié)點,數(shù)據(jù)實現(xiàn)了一層一層的向下復制。當主節(jié)點需要掛載多個從節(jié)點時為了避免對主節(jié)點的性能干擾,可以采用樹狀主從結構降低主節(jié)點壓力

6)? 復制過程和原理

從圖中可以看出復制過程大致分為6個過程:

1)保存主節(jié)點(master)信息。

執(zhí)行slaveof后從節(jié)點只保存主節(jié)點的地址信息便直接返回,這時建立復 制流程還沒有開始,在從節(jié)點6380執(zhí)行info replication可以看到如下:

master_host:127.0.0.1?

master_port:6379?

master_link_status:down

2)從節(jié)點(slave)內(nèi)部通過每秒運行的定時任務維護復制相關邏輯, 當定時任務發(fā)現(xiàn)存在新的主節(jié)點后,會嘗試與該節(jié)點建立網(wǎng)絡連接

3)發(fā)送ping命令。

4)權限驗證。如果主節(jié)點設置了requirepass參數(shù),則需要密碼驗證, 從節(jié)點必須配置masterauth參數(shù)保證與主節(jié)點相同的密碼才能通過驗證;如果驗證失敗復制將終止,從節(jié)點重新發(fā)起復制流程

5)同步數(shù)據(jù)集。主從復制連接正常通信后,對于首次建立復制的場景,主節(jié)點會把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點

6)命令持續(xù)復制。當主節(jié)點把當前的數(shù)據(jù)同步給從節(jié)點后,便完成了復制的建立流程


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容