redis的主從模式復(fù)制的具體步驟
在分布式系統(tǒng)中,希望使用多個服務(wù)器來部署redis,存在以下幾種redis的部署方式:
1.主從模式 2.主從模式+哨兵模式 3.集群模式
主從模式的優(yōu)點:可以實現(xiàn)讀寫分離,數(shù)據(jù)備份,還能提高讀并發(fā)。
讀取數(shù)據(jù)都在多個從節(jié)點中進行讀
多個從節(jié)點都是主節(jié)點的備份,如果主節(jié)點掛了,就可以根據(jù)從節(jié)點進行數(shù)據(jù)恢復(fù)。
因為服務(wù)器多了,不再像之前的單點服務(wù)器,在高并發(fā)場景下,也能進行讀取數(shù)據(jù)。
主從模式:
假如此時有3臺機器,分別部署了redis-server進程。之前一臺機器掛了,redis就掛了,但是現(xiàn)在3臺機器同時掛的概率就小了,redis也就不容易掛了。
此時就可以把其中一個節(jié)點作為“主節(jié)點”,另外兩個作為“從節(jié)點”。從節(jié)點就是主節(jié)點的一個備份,主節(jié)點這邊有什么數(shù)據(jù)修改,都會把這樣的修改同步到從節(jié)點上。(從節(jié)點就是主節(jié)點的副本)
注意:redis在主從模式中,是不允許修改從節(jié)點的,只能從從節(jié)點讀取數(shù)據(jù)。
主從模式的作用:主要針對“讀操作”進行 并發(fā)量和可用性的提高。
寫操作依賴主節(jié)點。但是主節(jié)點只有一個(如果有多個主節(jié)點,同步數(shù)據(jù)是很麻煩的),在業(yè)務(wù)場景中,讀操作往往就是比寫操作更頻繁。
主從數(shù)據(jù)的同步:
redis提供了psync命令,完成了數(shù)據(jù)同步的過程。
psync不需要咱們手動執(zhí)行,redis服務(wù)器會在建立好主從同步關(guān)系之后,自動進行psync。
從節(jié)點主動執(zhí)行psync,從主節(jié)點這邊拉取數(shù)據(jù)。
pysnc replicationid offset
replicationid 是主節(jié)點生成的,主節(jié)點每次重啟,生成的replicationid都是不同的,當(dāng)從節(jié)點和主節(jié)點建立復(fù)制關(guān)系的時候,就會從主節(jié)點這邊獲取到replicationid。
offset 偏移量,主節(jié)點和從節(jié)點都會維護 偏移量(整數(shù))
主節(jié)點的偏移量:主節(jié)點會收到修改操作的命令,這些命令都會占用幾個字節(jié),然后主節(jié)點就會把這些修改命令,字節(jié)數(shù)進行累加。
從節(jié)點的偏移量:描述了現(xiàn)在從節(jié)點的數(shù)據(jù)同步到什么位置了。
pysnc這里可以從主節(jié)點獲取全量數(shù)據(jù),也可以獲取一部分數(shù)據(jù)。
如果offset這里寫的是-1,就是獲取全量數(shù)據(jù)。
如果offset這里寫的是具體的數(shù)字,就是從當(dāng)前偏移量位置來進行獲取。
全量復(fù)制具體步驟:

1.從節(jié)點發(fā)送psync命令給主節(jié)點進行數(shù)據(jù)同步,因為是第一次進行復(fù)制,從節(jié)點沒有主節(jié)點的運行ID和復(fù)制偏移量,所以發(fā)送psync ?-1。
2.主節(jié)點根據(jù)命令,解析出要進行全量復(fù)制,回復(fù)+FULLRESYNC響應(yīng)。
3.從節(jié)點接收主節(jié)點的運行信息進行保存。
4.主節(jié)點執(zhí)行bgsave進行RDB文件的持久化。
5.主節(jié)點發(fā)送RDB文件給從節(jié)點。從節(jié)點保存RDB數(shù)據(jù)到本地硬盤。
6.主節(jié)點將在生成rdb到接收完成期間執(zhí)行的寫命令,在緩沖區(qū)中,等到從節(jié)點把RDB文件保存完之后,主節(jié)點再將緩沖區(qū)內(nèi)的數(shù)據(jù)補發(fā)給從節(jié)點。補發(fā)的數(shù)據(jù)扔然按照RDB的二進制格式追加寫入到已經(jīng)接收到的rdb文件中,保持主從一致性。
7.從節(jié)點清空自身原有的舊數(shù)據(jù)。
8.從節(jié)點加載RDB文件得到與主節(jié)點的一致的數(shù)據(jù)。
9.如果從節(jié)點加載了RDB文件之后,并且開啟了AOF持久化功能,它會進行bgrewriteaof操作,得到最近的AOF文件。
部分復(fù)制的具體步驟:

1.當(dāng)主從節(jié)點之間出現(xiàn)網(wǎng)絡(luò)中斷時,如果超過repi-timeout時間,主節(jié)點會認為從節(jié)點故障并終止復(fù)制連接。
2.主從連接中斷期間主節(jié)點依然響應(yīng)命令,但這些復(fù)制命令都因網(wǎng)絡(luò)中斷無法及時發(fā)送給從節(jié)點,所以暫時將這些命令滯留在復(fù)制積壓緩沖區(qū)中。
3.當(dāng)主從節(jié)點網(wǎng)絡(luò)恢復(fù)后,從節(jié)點再次連上主節(jié)點。
4.從節(jié)點將之前保存的replicationid和復(fù)制偏移量作為psync的參數(shù)發(fā)送給主節(jié)點。請求進行部分復(fù)制。
5.主節(jié)點接到psync請求后,進行必要的驗證,隨后根據(jù)offset去復(fù)制積壓緩沖區(qū)查找合適的數(shù)據(jù),并響應(yīng)+COUNTINUE給從節(jié)點。
6.主節(jié)點將需要從節(jié)點同步的數(shù)據(jù)發(fā)送給從節(jié)點,最終完成一致性。
實時復(fù)制:
從節(jié)點和主節(jié)點已經(jīng)同步好了數(shù)據(jù),但是主節(jié)點會源源不斷的進行收到新的修改數(shù)據(jù)的請求。
主節(jié)點上的數(shù)據(jù)就會隨之改變。也需要能夠同步到從節(jié)點。從節(jié)點和主節(jié)點會建立TCP的長連接。
然后主節(jié)點把自己收到的修改數(shù)據(jù)的請求,通過上述連接,發(fā)給從節(jié)點,從節(jié)點再根據(jù)這些請求,修改內(nèi)存中的數(shù)據(jù)。
主從復(fù)制的問題:當(dāng)主節(jié)點掛了,只剩下從節(jié)點的時候,雖然能夠提供讀取數(shù)據(jù)的操作,但是從節(jié)點不能自動升級成主節(jié)點。此時就需要程序員手動恢復(fù)主節(jié)點。
到此這篇關(guān)于redis的主從模式復(fù)制的具體步驟的文章就介紹到這了,更多相關(guān)redis主從模式復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

