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ǔ),具體如下:
在了解了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則不是)
上圖2是BinLogReceiverModule(在源代碼中沒有這個(gè)對(duì)象,這里是為了說明方便,抽象出來的)的組成,從圖2中可以看出BinlogReceiverModule由一個(gè)BinlogReceiverThread和多個(gè)BinlogBGWorker組成。
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ì)主要原因是:
更多建議: