pika增量同步

2018-09-27 10:04 更新

Pika Binlog結(jié)構(gòu)

Pika的主從同步是使用Binlog來完成的,一主多從的結(jié)構(gòu)master節(jié)點(diǎn)也可以給多個(gè)slave復(fù)用一個(gè)Binlog,只不過不同的slave在binglog中有自己的偏移量而已,master執(zhí)行完一條寫命令就將命令追加到Binlog中,ReplicaSender將這條命令從Binlog中讀出來發(fā)送給slave,slave的ReplicaReceiver收到該命令,執(zhí)行,并追加到自己的Binlog中,由于主從偏移量一樣,所以一旦發(fā)生網(wǎng)絡(luò)或節(jié)點(diǎn)故障需要重連主從時(shí),slave僅需要將自己當(dāng)前的Binlog偏移量發(fā)送給master,master找到后從該偏移量開始同步后續(xù)命令,理論上將命令不做處理一條一條追加到文件中,如果這樣的記錄格式容錯(cuò)很差,如果讀文件中寫錯(cuò)一個(gè)字節(jié)則導(dǎo)致整個(gè)文件不可用,所以pika采用了類似leveldb log的格式來進(jìn)行存儲(chǔ),具體如下: 

pika增量同步

在了解了Binlog格式之后,首先給出一個(gè)解釋pika的主從同步的對(duì)象

上圖1是一個(gè)主從同步的一個(gè)過程(即根據(jù)主節(jié)點(diǎn)數(shù)據(jù)庫的操作日志,將主節(jié)點(diǎn)數(shù)據(jù)庫的改變過程順序的映射到從節(jié)點(diǎn)的數(shù)據(jù)庫上),從圖1中可以看出,每一個(gè)從節(jié)點(diǎn)在主節(jié)點(diǎn)下都有一個(gè)唯一對(duì)應(yīng)的BinlogSenderThread。 (為了說明方便,我們定一個(gè)“同步命令”的概念,即會(huì)改變數(shù)據(jù)庫的命令,如set,hset,lpush等,而get,hget,lindex則不是)

pika增量同步

主要模塊的功能:

  • WorkerThread:接受和處理用戶的命令;
  • BinlogSenderThread:負(fù)責(zé)順序地向?qū)?yīng)的從節(jié)點(diǎn)發(fā)送在需要同步的命令;
  • BinlogReceiverModule: 負(fù)責(zé)接受主節(jié)點(diǎn)發(fā)送過來的同步命令
  • Binglog:用于順序的記錄需要同步的命令

主要的工作過程:

  1. 當(dāng)WorkerThread接收到客戶端的命令,按照?qǐng)?zhí)行順序,添加到Binlog里;
  2. BinglogSenderThread判斷它所負(fù)責(zé)的從節(jié)點(diǎn)在主節(jié)點(diǎn)的Binlog里是否有需要同步的命令,若有則發(fā)送給從節(jié)點(diǎn);
  3. BinglogReceiverModule模塊則做以下三件事情:接收主節(jié)點(diǎn)的BinlogSenderThread發(fā)送過來的同步命令;把接收到的命令應(yīng)用到本地的數(shù)據(jù)上;把接收到的命令添加到本地Binlog里 至此,一條命令從主節(jié)點(diǎn)到從節(jié)點(diǎn)的同步過程完成

BinLogReceiverModule的工作過程:

上圖2是BinLogReceiverModule(在源代碼中沒有這個(gè)對(duì)象,這里是為了說明方便,抽象出來的)的組成,從圖2中可以看出BinlogReceiverModule由一個(gè)BinlogReceiverThread和多個(gè)BinlogBGWorker組成。

  • BinlogReceiverThread: 負(fù)責(zé)接受由主節(jié)點(diǎn)傳送過來的命令,并分發(fā)給各個(gè)BinlogBGWorker,若當(dāng)前的節(jié)點(diǎn)是只讀狀態(tài)(不能接受客戶端的同步命令),則在這個(gè)階段寫B(tài)inlog
  • BinlogBGWorker:負(fù)責(zé)執(zhí)行同步命令;若該節(jié)點(diǎn)不是只讀狀態(tài)(還能接受客戶端的同步命令),則在這個(gè)階段寫B(tài)inlog(在命令執(zhí)行之前寫)

BinlogReceiverThread接收到一個(gè)同步命令后,它會(huì)給這個(gè)命令賦予一個(gè)唯一的序列號(hào)(這個(gè)序列號(hào)是遞增的),并把它分發(fā)給一個(gè)BinlogBGWorker;而各個(gè)BinlogBGWorker則會(huì)根據(jù)各個(gè)命令的所對(duì)應(yīng)的序列號(hào)的順序來執(zhí)行各個(gè)命令,這樣也就保證了命令執(zhí)行的順序和主節(jié)點(diǎn)執(zhí)行的順序一致了 之所以這么設(shè)計(jì)主要原因是:

  1. 配備多個(gè)BinlogBGWorker是可以提高主從同步的效率,減少主從同步的滯后延遲;
  2. 讓BinlogBGWorker在執(zhí)行執(zhí)行之前寫B(tài)inlog可以提高命令執(zhí)行的并行度;
  3. 在當(dāng)前節(jié)點(diǎn)是非只讀狀態(tài),讓BinglogReceiverThread來寫B(tài)inlog,是為了讓Binglog里保存的命令順序和命令的執(zhí)行順序保持一致.
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)