zk的數據遷移,一方面可以使用集羣過半數仍然可用的這個特性,另一方面也可以通過直接拷貝元數據文件到新集羣;
但是有特殊的場景,第一種就不是最佳的選擇,例如公司在用的zookeeper集羣,因爲歷史原因導致集羣使用場景複雜,連接數負載很高,尤其在節假日業務活動期間,有可能非預期的將集羣連接數並打滿,負載過高致使整個集羣崩潰,所以需要使用第二種來進行數據的遷移;
新的備份集羣需要從頭搭建,但是搭建好時需要注意兩點:
-
在新集羣沒有啓動時數據目錄不存在;
-
原始集羣的元數據文件放到新集羣數據目錄下面時,爲了能夠加載遷移數據需要重啓新集羣;
所以我們先啓動集羣,讓數據目錄進行加載,然後再stop掉集羣,刪掉備份集羣中數據目錄下的所有文件,包括:事務日誌、快照、兩個epoch文件。
手動方式(使用minos工具)
集羣管理工具和自己手動操作集羣在底層命令的執行上都是一樣的,這裏可以不必糾結。這篇文章對zookeeper集羣的操作命令都是通過minos開源工具來進行集羣操作,有興趣的朋友也可以瞭解一下,地址爲:https://github.com/XiaoMi/minos.git
1、新集羣啓動(假定備份集羣爲:backuptst)
新備份集羣服務器節點名爲:
-
server01
-
server02
-
server03
-
server04
-
server05
準備好新集羣的所有服務器並進行部署和啓動,這樣一來zookeeper服務進程啓動時會自動創建數據目錄。
zookeeper集羣部署和啓動這裏就不會重點陳述了,我就還是直接使用的minos工具,在寫好集羣配置文件後,下列命令會一鍵完成新集羣的部署和啓動的操作。
./deploy bootstrap zookeeper backuptst
2、新集羣集羣停止
爲將數據遷移到集羣中各個節點作準備。
./deploy stop zookeeper backuptst
3、進入新集羣中各個節點上刪除數據目錄下的元數據文件
注意:如果集羣中的epoch當前的記錄文件不刪掉的話,會造成集羣無法正常啓動。原因是節點在啓動時會識別epoch文件中記錄的當前的epoch值,然後load磁盤元數據時會與事務zxid進行對比;而我們後面遷移原始數據中的epoch和當前新集羣的不匹配,則集羣重啓時無法正常啓動。故需要將新的備份集羣中,各個節點的epoch文件刪除,遷移數據時順便也直接將原始集羣的兩個epoch拿到該數據目錄下即可。
cd 自己的zookeeper集羣數據目錄路徑/version-2/
rm -f *
4、拷貝原始集羣中,leader節點下數據目錄的元數據文件到備份集羣中
拷貝原始集羣中的leader節點,在一定程度上是因爲考慮leader的數據相對其他節點來說最全。
-
確定原始集羣的leader節點ip。
-
備份該節點下對應的數據目錄下的文件:
-
最新的log事務日誌文件;
-
最新的snapshot文件;
-
acceptedEpoch文件;
-
currentEpoch文件;
-
5、將備份數據分發到新集羣中的各個節點對應的數據目錄下
將上面的四個文件依次分發到新集羣的各個節點下面對應的數據目錄中。
例:
我這裏事先將原始集羣leader數據目錄中的上述四個文件提前拷貝到本地的zk_meta_dir的目錄中,四個文件如下:
ls /zk_meta_dir/
log.25bcc3ab96
snapshot.25bcc3ab95
acceptedEpoch
currentEpoch
開始向新備份集羣各個節點分發該四個文件:
scp /zk_meta_dir/* work@server01:/home/work/zookeeper/backuptst/zookeeper/version-2/
scp /zk_meta_dir/* work@server02:/home/work/zookeeper/backuptst/zookeeper/version-2/
scp /zk_meta_dir/* work@server03:/home/work/zookeeper/backuptst/zookeeper/version-2/
scp /zk_meta_dir/* work@server04:/home/work/zookeeper/backuptst/zookeeper/version-2/
scp /zk_meta_dir/* work@server05:/home/work/zookeeper/backuptst/zookeeper/version-2/
6、重新啓動新集羣
./deploy start zookeeper backuptst
到這裏,可以通過zkCli.sh命令登陸一臺zookeeper進行查看數據是否恢復,或者通過mntr四字命令輸出集羣信息,對比原始集羣的數據信息也可以進行檢查。