1. zk集群數據遷移和恢復
zk集群數據遷移和恢復
一、zk數據遷移,有如下兩種方案:
1、利用zk集群超過半數仍然可用的特性,比如集群中有5個節點,可以將其中1~2個節點割裂出去,再添加1個新的節點,組成新的集群,以此實現數據遷移;
2、直接拷貝集群的元數據文件到新集群;
但第1種方案並不是最佳選擇,例如zk集群連接數負載高,如果此時再減少節點數,則會導致集群負載變得更高,甚至集群崩潰。故採用第2種方案,通過拷貝元數據的方式來實現集群數據遷移和恢復。
二、zk數據遷移和恢復的實現思路
1、搭建好新的zk集群,並且啟動集群(此時集群還沒有數據);
2、停止新集群所有節點的zk進程;
3、刪除新集群所有節點數據目錄下的文件,包括:事務日誌、快照、epoch文件
4、將老集群leader節點的事務日誌、快照、epoch文件拷貝到新集群所有節點對應的數據目錄下;
5、重新啟動新集群;
三、注意事項:
如果新集群的兩個epoch文件不刪掉的話,會造成新集群無法啟動;原因是:如果只是拷貝了老集群的快照、事務日誌到新集群,新集群的節讓渣點在啟動時會碧滑寬識別epoch文件中記錄的當前epoch值,然後將這個epoch值和從老集群拷貝過來的元數據中的事務ID(zxid)進行比較,發現並不匹配,就會造成新集群無法正常啟動。故需要將新集群中各個節點的epoch文件刪除,將老集群的epoch文件、快照文件、事務日誌文件一並拷貝到新集群的各個節點。
四、zk數據遷移和恢復的具體操作步驟:
1、搭建新集群:
1)、rpm -ivh jdk-8u20-linux-x64.rpm
2)、cd /data/ && tar -zxvf zk_server.tgz ###解壓到/data或者/data1
3)、cd /data/ && mv zk_server zk.1 ###myid為1的節點,家目錄為/data/zk.1、myid為2的節點,家目錄為/data/zk.2
4)、解壓之後,可以看到3個目錄:
cd /data/zk.1 && ls -l
zk_data ###保存zk快照數據的主目錄
zk_log ###保存zk事務日誌的主目錄
zookeeper ###程序路徑,包含配置文件
5)、cd /data/zk.1/zk_data && echo 1 > myid ###配置節點myid,myid為1的節點配置成1,myid為2的節點配置成2,myid為3的節點配置3
6)、cd /data/zk.1/zookeeper/conf && cp -ar zoo.cfg.template zoo.cfg
7)、vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval = 48
dataDir=/data/zk.1/zk_data ###myid為2則配置為/data/zk.2/zk_data
dataLogDir=/data/zk.1/zk_log ###myid為2則配置為/data/zk.2/zk_log
server.1=節點1的IP:8880:7770 #節點1的配置
server.2=節點2的IP:8880:7770 #節點2的配置
server.3=節點3的IP:8880:7770 #節點3的悔亮配置
8)、其餘2個節點的安裝部署方法也是一樣
9)、依次啟動3個節點,並檢查狀態
啟動:
cd /data/zk.1/zookeeper/bin/ && nohup sh zkServer.sh start > zookeeper.out &
檢查節點狀態:
cd /data/zk.1/zookeeper/bin/ && ./zkServer.sh status
連接本地節點,查看數據:
cd /data/zk.1/zookeeper/bin/ && ./zkCli.sh -server 127.0.0.1:2181
2、停止新集群所有節點的zk進程:
cd /data/zk.1/zookeeper/bin/ && sh zkServer.sh stop
cd /data/zk.2/zookeeper/bin/ && sh zkServer.sh stop
cd /data/zk.3/zookeeper/bin/ && sh zkServer.sh stop
3、刪除新集群所有節點數據目錄下的文件,包括:事務日誌、快照、epoch文件(以節點1為例):
cd /data/zk.1/zk_data/version-2 && rm -f snapshot.* && rm -f acceptedEpoch && rm -f currentEpoch
cd /data/zk.1/zk_log/version-2 && rm -f log.*
4、將老集群leader節點的事務日誌、快照、epoch文件拷貝到新集群所有節點對應的數據目錄下(以leader節點的數據為准):
1)、備份老集群leader節點的數據目錄下的文件(拷貝到本地的新建的zk_meta_dir目錄)
最新的log事務日誌文件 ###不是所有的log文件,而是最新的log文件
最新的snapshot文件 ###不是所有的snapshot文件,而是最新的snapshot文件
acceptedEpoch文件
currentEpoch文件
2)、將leader節點zk_meta_dir目錄的log文件、snapshot文件、Epoch文件分發到新集群每個節點對應的目錄,例如節點1的/data/zk.1/zk_data/version-2、/data/zk.1/zk_log/version-2
5、重新啟動新集群:
以節點1為例:
cd /data/zk.1/zookeeper/bin/ && nohup sh zkServer.sh start > zookeeper.out &
2. 不小心把zk的子節點和數據刪除了 怎麼恢復啊,求大神指點
沒有散銷刪除資料庫文件(*.mdb,*.ldb)的話重新附加一遍就可以了
要是刪除了頌答資料庫野掘慧文件的話,用數據恢復軟體,Fanl Date或者DG把資料庫文件恢復出來再附加進去就可以了
3. 九、宕機恢復原理
1、Master負載並不很高,基本採用熱備的方式來實現Master高可用
2、RegionServer宕機的恢復主要原因有。
2.1、Full GC異常
2.2、HDFS異常
2.3、物理節點宕機
2.4、HBase Bug
3、RegionServer故障恢復原理
3.1、利用ZK臨時節點機制,RS在啟動會在ZK注冊成臨時節點,同時Master會Watch這個節點,一般情況下RegionServe會周期性的向ZK發送心跳,如果在超時時間內沒有收到心跳,臨時節點就會離線,這個消息馬上會通知給到Master,Master檢測到RS宕機
3.2、切分未持久化的HLog日誌,HLog包含多個Region的數據,為了能夠按照Region一個個進行數據恢復,首先需要對HLog按照Region進行分組。把同一個Region的日誌放一塊,便於一個個Region回放。
3.3、Master重新分配宕機RegionServer上的region,將這些Region重新分配到其他可用的RS上。
3.4、按照Region回放吵段HLog
3.5、完成修復,對外提供服務
4、HLog切分大有學問
4.1、0.96版本之前的切分策略:Master單機切分HLog
4.1.1、將待切分的日誌重命名,主要防止在某些情況下RS並沒有真正宕機,但是Master已經在進行故障恢復了,但是RS還在接受寫入請求導致數據不一致。重命名之後此時用戶的請求就會異常終止。
4.1.2、讀取HLog數據對數據按照Region分組。
4.1.3、切分完成之後Master會對每個Region HLog數據寫入各個Region對應的HDFS目錄。
4.1.4、Region對日誌按順序進行會回放。
缺點:如升孝譽果需要恢復的數據有幾十G 或者更大,Master單機切片的搞法可能需要數小時。
4.2、分布式切分HLog策略
4.2.1、Master將待切分的日誌路徑發布到ZK節點上,每個日誌為一個任務,每個任務都有對應的狀態,起始狀態為TASK_UNASSIGNED
4.2.2、RS啟動之後都注冊這個節點等待新任務,一旦Master發布任務,RS就會搶占該任務
4.2.3、搶占任務先看任務狀態,如果是TASK_UNASSIGNED,則說明沒有被搶占,然後嘗試去修改狀態為TASK_OWEND,慎隱如果修改成功,表名任務搶占成功。如果修改失敗說明被別的RS搶佔了。
4.2.4、RS搶占任務成功了之後,將任務分給相應的線程處理,如果處理成功則修改狀態為TASK_DONE;如果失敗,則狀態修改為TASK_ERR。
4.2.5、Master一直監聽ZK節點狀態的變更,如果狀態為TASK_ERR,則重新發布任務,如果成功則刪除對應的節點。
4.2.6、分布式切分舉例
1)假設Master當前發布了4個任務,即當前需要回放4個日誌文件HLog1(H1)、HLog2(H2)、HLog3(H3)、Hlog4(h4)
2)假設RS1搶佔了H1,H2;RS2搶佔了H3;RS3搶佔到了H4
3)以RS1為例,他會把H1,H2,分給2個HlogSpliter線程進行處理,HLogSpliter負責對日誌文件執行具體的切分,
具體切分步驟用4.1策略差不多
優點:通過多RS同時執行HLog切分,解決了Master單機切分帶來的耗時長的問題
缺點:假設一個宕機的RS上有200個Region,有90個Hlog,由於每個HLog都需要按Region分組,所以這種切分方法會產生90*200=18 000 個小文件。
4.4、分布式日誌回放策略
相比分布式切分HLog策略,流程上主要改動了兩點
1)、不是先切分在分配Region,而是先分配Region之後再進行Hlog切分,並且此時的Region是recovering狀態,可以對外提供寫服務
2)、切分HLog邏輯同4.2區別是分布式回放策略並沒有先寫入文件,而是直接回放。
這種設計大大減少小文件的IO消耗,解決4.2的短板。