5 分鐘完成 ZooKeeper 數據遷移

語言: CN / TW / HK

作者:草谷

前言

MSE 提供了託管版的 ZooKeeper,包含比開源 ZooKeeper 更強大更穩定的功能,能幫助您免去運維 ZooKeeper 集羣的煩惱,當我們需要從自建 ZooKeeper 遷移到 MSE ZooKeeper 上面時,往往依賴舊集羣的數據,MSE 提供了多種數據遷移的方案,其中主流的方案可以通過 MSE Sync 進行實時同步,這樣能夠達到平滑不停機的目的,本文將介紹另外一種數據遷移的方式,主要針對業務支持停機的場景,進行一個補充,操作相比更加簡單快速。

實現原理

1.png

在對 ZooKeeper 進行了若干次事務操作之後,ZooKeeper 會將內存數據全量寫入到本地磁盤中,生成一個 snapshot 開頭的快照文件,這個快照文件就包含了該集羣的全量數據。同時 ZooKeeper 在節點啟動的時候,會首先加載該快照文件進行一次數據初始化。

基於此原理,我們可以將任意要遷移集羣的快照文件,放到目標集羣的快照路徑中,然後重啟目標集羣就可以將遷移集羣的數據加載到自己的內存中了,這樣就完成了一次全量數據的遷移。

數據導入實踐

2.png

步驟一:獲取快照文件

“支持開源 ZooKeeper 3.4.x~3.8.x 的數據遷移導入到 MSE ZooKeeper”

我們先找到自建 ZooKeeper 的 Snap 緩存文件:

文件名為 “snapshot.xxx”格式的:是 ZooKeeper 某個時刻的全量數據,ZooKeeper 會定時寫到磁盤中的。

  • 文件路徑

snapshot.xxx 文件的存儲路徑:會配置在 ZooKeeper 的 zoo.cfg(zoo.cfg 默認放在 zookeeper 目錄的 conf 文件夾下)配置文件中,dataDir 項,例如:

dataDir=/home/admin/zookeeper/zkData

  • 獲取文件

snapshot.xxx 一般在目錄中會存在多個,拿最近時間生成那個即可:

3.png

步驟二 :準備 MSE 集羣

以下表格供參考,購買還需要參考 QPS/TPS 等維度的約束,例如讀寫數據較小,QPS/TPS 相應也能提高,具體以業務場景為準:

4.jpeg

步驟三:上傳快照文件

從註冊配置中心列表頁點擊你購買的實例,進入 ZooKeeper 的基礎信息頁:

5.png

從“節點管理”進入管理頁面:

6.png

點擊“數據導入”,上傳 Snapshot 文件,文件大小限制會根據你當前 ZooKeeper 配置自動提示,例如本次購買的 4C8G,提示最大不可超過 800M 大小:

7.png

上傳完了之後,3 個節點的集羣大概 5 分鐘左右,數據即可導入重啟完成。

結果驗證

數據導入完成之後,即可通過 endpoint 進行 MSE ZooKeeper 的訪問,獲取到遷移數據。

“mse-xxxx-p.zk.mse.aliyuncs.com” 為集羣的 endpoint:

``` CuratorFrameworkFactory.builder().connectString("mse-xxxx-p.zk.mse.aliyuncs.com:2181") .sessionTimeoutMs(10000).retryPolicy( retryPolicy). build().start();

ZooKeeper zk = new ZooKeeper("mse-xxxx-p.zk.mse.aliyuncs.com:2181", 30000, new Watcher() { @Override public void process(WatchedEvent event) {

                    System.out.println("ZooKeeper=====" + event);
                }
            });

```

購買 MSE Zookeeper 享受企業級服務

8.png

9.png