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的格式來進行存儲,具體如下:
在了解了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則不是)
上圖2是BinLogReceiverModule(在源代碼中沒有這個對象,這里是為了說明方便,抽象出來的)的組成,從圖2中可以看出BinlogReceiverModule由一個BinlogReceiverThread和多個BinlogBGWorker組成。
BinlogReceiverThread接收到一個同步命令后,它會給這個命令賦予一個唯一的序列號(這個序列號是遞增的),并把它分發(fā)給一個BinlogBGWorker;而各個BinlogBGWorker則會根據(jù)各個命令的所對應的序列號的順序來執(zhí)行各個命令,這樣也就保證了命令執(zhí)行的順序和主節(jié)點執(zhí)行的順序一致了 之所以這么設計主要原因是:
更多建議: