99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

pika增量同步

2018-09-27 10:04 更新

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

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

pika增量同步

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

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

pika增量同步

主要模塊的功能:

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

主要的工作過程:

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

BinLogReceiverModule的工作過程:

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號