Replication會在Region Server初始化HLog的時候啟動森爽, 具體流程如下:
- 判斷replication是否打開
- 配置 sourceClassname和sinkClassname 看來可以配置寫到不同的系統(tǒng)中
- 如果source和sink用的是相同的class渠抹, 則復(fù)用一個replicationSourceHandler幽崩, 否則各自建一個replicationSourceHandler(如果不配置都是Replication這個類) -> initialize
- 初始化replication線程焦影, 具體線程如下:
replicationQueue: 存儲在zk上
zk上每個regionserver會有一個節(jié)點鳞绕, 里面有該rs上的所有hlog
即: /hbase/replication/rs/hostname.example.org,6020,1234/1
/hbase/replication/rs/hostname.example.org,6020,1234/2
每個hlog節(jié)點會記錄被備份到的最近位置
/hbase/replication/rs/hostname.example.org,6020,1234/1/23522342.23422 [VALUE: 254]
replicationPeers: 同樣存儲在zk上
根據(jù)用戶在創(chuàng)建時的peer_id創(chuàng)建的 /hbase/replication/peers/1 [Value: zk1.host.com,zk2.host.com,zk3.host.com:2181:/hbase], 存的信息是對應(yīng)的zk值以及hbase的znode
每個peer都有一個指示當(dāng)前狀態(tài)的znode
/hbase/replication/peers/1/peer-state [Value: ENABLED]
每個peer都有一個指示哪些表需要被replicate的znode
/hbase/replication/peers/1/tableCFs [Value: "table1; table2:cf1,cf3; table3:cfx,cfy"]
replicationTracker
主要是注冊了兩個watcher
OtherRegionServerWatcher:當(dāng)有別的機(jī)器掛的時候會通知
PeersWatcher:當(dāng)有peer被創(chuàng)建或者刪除的時候會通知
replicationSourceManager:
initialize的時候會把deadserver上的queue去grab到自己的node上饥努, 跟split HLog的邏輯相同
- 創(chuàng)建完ReplicationInstance以及相關(guān)線程之后氧急, 會馬上調(diào)用instantiateHLog(rootDir, logName)颗胡, 里面會調(diào)用getWALActionListeners, 這一步實際就是把replicationSourceHandler注冊到WALActionListeners中, 這樣在對HLog進(jìn)行操作時都會觸發(fā)listener操作吩坝。
之后在regionserver啟動服務(wù)線程的時候會啟動replicationSourceHandler
1. 啟動replicationManager
為每個peer創(chuàng)建ReplicationSource: 里面會創(chuàng)建ReplicationEndpoint, 相當(dāng)于拷貝時客戶端的角色
嘗試把deadserver上的replicationQueue 拿到自己這里進(jìn)行處理
2. 啟動replicationSink
創(chuàng)建一個對應(yīng)集群的HConnection
3. 啟動ReplicationStatisticsThread
周期性打印replication數(shù)據(jù)
到目前為止毒姨, 準(zhǔn)備工作都已經(jīng)就緒, 下面看下在寫入數(shù)據(jù)時是如何觸發(fā)replication的:
- replication 并不是每次寫入HLog都會觸發(fā)钉寝, 而是在每次LogRoll的時候:
preLogRoll -> 在zk上創(chuàng)建該log的znode
postLogRoll -> 把該log放入各個ReplicationSource的隊列中等待被處理
接著就是ReplicationSource真正處理Log的邏輯了
首先check一些設(shè)置是否正確
然后看下這個replicationLog是不是recover的弧呐, 如果是就會seek到上次的位置
終于開始處理log了闸迷, 會給log做一個snapshot
開始傳輸啦(沒有詳細(xì)看)
更新ReplicationPosition
先暫時寫到這, 目前replication log具體備份的細(xì)節(jié)沒有看俘枫, 還有故障再分配的細(xì)節(jié)也還沒看