redis——新版復制
sync雖然解決了數(shù)據(jù)同步問題,但是在數(shù)據(jù)量比較大情況下,從庫斷線從來依然采用全量復制機制,無論是從數(shù)據(jù)恢復、寬帶占用來說,sync所帶來的問題還是很多的。于是Redis從2.8開始,引入新的命令psync。

psync有兩種模式:完整重同步和部分重同步。
部分重同步主要依賴三個方面來實現(xiàn),依次介紹。
offset(復制偏移量):
主庫和從庫分別各自維護一個復制偏移量(可以使用info replication查看),用于標識自己復制的情況:
在主庫中代表主節(jié)點向從節(jié)點傳遞的字節(jié)數(shù),在從庫中代表從庫同步的字節(jié)數(shù)。
每當主庫向從節(jié)點發(fā)送N個字節(jié)數(shù)據(jù)時,主節(jié)點的offset增加N
從庫每收到主節(jié)點傳來的N個字節(jié)數(shù)據(jù)時,從庫的offset增加N。
因此offset總是不斷增大,這也是判斷主從數(shù)據(jù)是否同步的標志,若主從的offset相同則表示數(shù)據(jù)同步量,不通則表示數(shù)據(jù)不同步。
replication backlog buffer(復制積壓緩沖區(qū)):
復制積壓緩沖區(qū)是一個固定長度的FIFO隊列,大小由配置參數(shù)repl-backlog-size指定,默認大小1MB。
需要注意的是該緩沖區(qū)由master維護并且有且只有一個,所有slave共享此緩沖區(qū),其作用在于備份最近主庫發(fā)送給從庫的數(shù)據(jù)。
在主從命令傳播階段,主節(jié)點除了將寫命令發(fā)送給從節(jié)點外,還會發(fā)送一份到復制積壓緩沖區(qū),作為寫命令的備份。
除了存儲最近的寫命令,復制積壓緩沖區(qū)中還存儲了每個字節(jié)相應的復制偏移量,由于復制積壓緩沖區(qū)固定大小先進先出的隊列,所以它總是保存的是最近Redis執(zhí)行的命令。
所以,重連服務器后,從服務器會發(fā)送自己的復制偏移量offset給主服務器,
如果offset偏移量之后的數(shù)據(jù)仍然存在于復制擠壓緩沖區(qū),就執(zhí)行部分重同步操作。
相反,執(zhí)行完整重同步操作。
run_id(服務器運行的唯一ID)
每個redis實例在啟動時候,都會隨機生成一個長度為40的唯一字符串來標識當前運行的redis節(jié)點,查看此id可通過命令info server查看。
當主從復制在初次復制時,主節(jié)點將自己的runid發(fā)送給從節(jié)點,從節(jié)點將這個runid保存起來,當斷線重連時,從節(jié)點會將這個runid發(fā)送給主節(jié)點。主節(jié)點根據(jù)runid判斷能否進行部分復制:
如果從節(jié)點保存的runid與主節(jié)點現(xiàn)在的runid相同,說明主從節(jié)點之前同步過,主節(jié)點會更具offset偏移量之后的數(shù)據(jù)判斷是否執(zhí)行部分復制,如果offset偏移量之后的數(shù)據(jù)仍然都在復制積壓緩沖區(qū)里,則執(zhí)行部分復制,否則執(zhí)行全量復制;
如果從節(jié)點保存的runid與主節(jié)點現(xiàn)在的runid不同,說明從節(jié)點在斷線前同步的redis節(jié)點并不是當前的主節(jié)點,只能進行全量復制;
psync流程:
復制
客戶端向服務器端發(fā)送:SLAVEOF
1、設置主服務器的地址和端口
存到masterhost和mastterport兩個屬性里之后,向客戶端發(fā)送ok,然后開始復制工作。
2、建立套接字鏈接
從服務器根據(jù)命令設置的地址和端口,創(chuàng)建鏈接,并且為這個套接字創(chuàng)建一個專門處理復制工作的文件事件處理器。
主服務器也會為套接字創(chuàng)建相應的客戶端狀態(tài),并且把從服務器當作一個客戶端來對待。
3、發(fā)送ping命令(檢查)
檢查套接字狀態(tài)是否正常
檢查主服務器是否能正確處理請求。(如果不能,就重連)
4、身份認證
5、發(fā)送端口信息
從服務器向主服務器發(fā)送信息,主服務器記錄。
6、同步
從服務器向主服務器發(fā)送psync命令。(主服務器也成為從服務器的客戶端,因為主服務器會發(fā)送寫命令給從服務器)
7、命令傳播
完成同步后,進入傳播階段,主服務器一直發(fā)送寫命令,從服務器一直接受,保證和主服務器一致。
心跳檢測
默認一秒一次,從服務器向主服務器發(fā)送命令:REPLCONF ACK
三個作用:
檢測網(wǎng)絡連接狀態(tài):如果主服務器一秒沒收到命令,就說明出問題了
輔助實現(xiàn)min-slaves配置:min-slaves-to-write 3? ?min-slaves-max-log 10:當從服務器小于3個或延遲都大于10,主服務器拒絕寫命令。
檢測命令丟失:如果命令丟失,主服務器會發(fā)現(xiàn)偏移量不一樣,然后它就會根據(jù)偏移量,去積壓緩沖區(qū)找到缺少的數(shù)據(jù)并發(fā)給從服務器。
Redis
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。