Redis主從復制
一凯砍、什么是主從復制
主從復制是指用戶可以搭建多個服務器,其中幾個服務器當做主服務器筋现,提供寫功能唐础。其余的服務器當做從服務器,提供讀功能矾飞。每當主服務器收到寫請求時一膨,同時需要把數據發(fā)送給從服務器。保證主從服務器的數據保持最終一致性洒沦。利用這個機制豹绪,可以利用廉價的服務器搭建高可用,高并發(fā)集群微谓。主從復制是搭建高可用集群的必備利器森篷。
二、Redis怎么實現主從復制
2.1 slaveof
在Redis中可以使用slaveof命令讓一個Redis實例去復制另一個Redis實例的內容豺型。這里需要注意當A實例執(zhí)行該命令去復制B實例的內容后仲智,以前A實例的內容都將被B實例的內容覆蓋。同時在從服務器將被設置為只讀姻氨,向從服務器發(fā)送寫命令時钓辆,將被拒絕。(也可以在redis.conf中配置該命令,啟動時就發(fā)起主從同步)
2.2 主從復制的原理V1
當從服務器發(fā)起slaveof命令后前联,主從服務器之間通過TCP長連接進行通信功戚,主要是以下步驟:
第一次完整的主從同步就完成了。然后主從之間會維持TCP連接似嗤,每次master收到新的寫命令后啸臀,都會發(fā)給從服務器。
如果期間連接斷了烁落,當從服務器重新連上主服務器后乘粒,上述的步驟會重新來一遍∩怂可以發(fā)現這是很低效的灯萍,因為主服務器只需要把斷連期間的寫入命令發(fā)給從服務器就可以了,不需要重新生成RDB文件每聪。(生成RDB文件是一個耗時操作旦棉,設計磁盤的讀寫)。
注意:從服務器在加載RDB文件過程中是阻塞的药薯,無法處理客戶端的請求绑洛。
2.3 主從復制的原理V2
基于上述原因(特別是斷線時間特別短時),Redis推出了新的同步命令psync果善。
psync將同步過程分為了兩塊:1诊笤、完整同步系谐;2巾陕、部分同步。
完整同步也叫初次同步纪他,也就是第一次主從同步鄙煤。步驟跟v1上述是一致的。
部分同步主要用戶斷線重連后的同步茶袒,它可以將斷線期間的寫入命令發(fā)送給從服務器梯刚,而不需要整個RDB文件,極大的節(jié)約了資源薪寓。當從服務器重新連接了主服務器后亡资,會發(fā)送psync命令,然后主服務器回復continue命名向叉,并且發(fā)送缺少的寫入命令到從服務器锥腻。
2.3.1 部分同步原理
redis完成部分同步功能主要依賴于以下部分:
1、主服務器的復制偏移量
2母谎、從服務器的復制偏移量
3瘦黑、命令緩存區(qū)(FIFO隊列,默認大小1MB)
4、服務器運行Id
每次主服務器向從服務器傳遞N個字節(jié)命令后幸斥,就在把自己的偏移量+N匹摇。從服務器同理。同時主服務器還會將命令寫入到命令緩存區(qū)里甲葬。當從服務器重連是發(fā)生如下步驟:
每個Redis都有自己的唯一標識Id廊勃。在啟動時自動生成,由40個隨機的十六進制字符組成经窖。當發(fā)送第一次主從同步時供搀,master會將自己的id發(fā)送會從服務器,從服務器會將其保存起來钠至。斷線重連時葛虐,從服務器請求同步時還會將這個id發(fā)送給主服務器,主服務器判斷該id與自己的id是否一致棉钧,如果一致則繼續(xù)執(zhí)行部分同步的剩余步驟屿脐。否則執(zhí)行完整同步。
2.4 心跳檢測
主從服務器建立連接后宪卿,默認每隔1秒的诵,從服務器會想主服務器發(fā)送REPLCONF_ACK <offset>
報告自己的狀態(tài)。
主服務器可以從這個命令中檢測出幾個問題:
1佑钾、主從之間的網絡連接狀態(tài)
? 如果主服務器在規(guī)則時間內沒有收到從服務器的心跳命令西疤,就可以認為主從之間出現了問題。這個時候如果配置了
min-slaves-to-write 3
min-slaves-max-lag 10
//如果從服務器數小于3或者3個服務器的心跳檢測延遲值都大于等于10秒休溶,主服務器將拒絕寫命令
2代赁、檢測新的寫命令是否丟失
? 每次主服務器收到從服務器心跳命令里的offset時,都會與自己的offset進行比較兽掰,如果小于自己的芭碍。那么可以知道某次傳遞的寫命令在網絡上丟失或者從服務器加載失敗,這個時候主服務器會主動將這部分缺少的命令發(fā)送給從服務器(需要缺失命令還在緩存區(qū)孽尽,如果不在猜測應該是發(fā)起一次完整同步窖壕,未驗證過)。
3杉女、輔助實現min-slaves
2.5 備注
主從服務器建立套接字連接后瞻讽,從服務器首先會發(fā)起Ping命令檢測套接字的讀寫是否正常。收到主服務器的Pong命令后證明正常熏挎。然后在判斷主服務器是否需要身份認證速勇,發(fā)起密碼。然后進行復制流程婆瓜。