複数のetcdクラスタのデータを統合する方法

5171 ワード

複数のetcdクラスタのキー値が重複しない場合、データをマージできますか?データベースのように、古いライブラリからデータをエクスポートし、新しいライブラリに挿入すれば万事順調ですか?答えはできません.etcdは似たような機能を提供していません.バックアップ機能がありますが、複数のクラスタのバックアップデータは直接統合できません.ループを書いて、古いクラスタのデータを遍歴して、新しいクラスタを挿入するしかありませんか?これはあまりにも地味なのではないでしょうか.そこでネットでいろいろな資料を探し始めましたが、いつも無駄に帰ってきて、etcdの公式資料を正直に見るしかありません.カンフーは心を動かさず、ついにmake-mirrorのようなコマンドを見つけました.このコマンドはリアルタイムでクラスタのデータを他のクラスタにバックアップすることができます.私の考えと一致しているような気がしますが、データのマージに使えますか.次の実験を見てください.

make-mirrorの概要


コマンド構文は以下のとおりです.詳細はコマンドマニュアルを参照してください.
ETCDCTL_API=3 etcdctl make-mirror [options]  [flags]

このうち[options]は、主にソースクラスタと宛先クラスタの証明書情報、およびソースクラスタのクライアントアドレスなどを構成する.は、宛先クラスタのクライアントアドレスである.このコマンドは一方向であり、宛先クラスタの変化はソースクラスタに影響しません.

テスト環境の準備


Windowsローカルにetcdクラスタを3セット構築し、名前はそれぞれcluster 1、cluster 2、cluster 3である.ここではcluster 1とcluster 2のデータをcluster 3に統合すると仮定し、実験の便利さのためにhttpアクセスのみを開放する.
クラスタ1を起動し、テストキー/cluster 1に書き込みます.混同を回避するために、クライアントアクセスポートは、例えばクラスタ1に対して12379であり、クラスタ通信ポートは12380である.
$ nohup etcd -name cluster1                    \
--data-dir /tmp/cluster1/data/                 \
--listen-client-urls http://localhost:12379    \
--advertise-client-urls http://localhost:12379 \
--listen-peer-urls http://localhost:12380      \
--initial-cluster-state new &

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:12379 put /cluster1 "this is cluster1"
OK

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:12379 get --prefix /
/cluster1
this is cluster1

クラスタ2を起動し、テストキー/cluster 2に書き込みます.
$ nohup etcd -name cluster2                    \
--data-dir /tmp/cluster2/data/                 \
--listen-client-urls http://localhost:22379    \
--advertise-client-urls http://localhost:22379 \
--listen-peer-urls http://localhost:22380      \
--initial-cluster-state new &

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:22379 put /cluster2 "this is cluster2"
OK

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:22379 get --prefix /
/cluster2
this is cluster2

クラスタ3を起動し、テストキー/cluster 3に書き込みます.
$ nohup etcd -name cluster3                    \
--data-dir /tmp/cluster3/data/                 \
--listen-client-urls http://localhost:32379    \
--advertise-client-urls http://localhost:32379 \
--listen-peer-urls http://localhost:32380      \
--initial-cluster-state new &

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:32379 put /cluster3 "this is cluster3"
OK

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:32379 get --prefix /
/cluster3
this is cluster3

データ同期の開始


クラスタ1のデータをクラスタ3に同期する.
$ ETCDCTL_API=3 nohup etcdctl make-mirror --endpoints=http://localhost:12379 http://localhost:32379 &

クラスタ2のデータをクラスタ3に同期する.
$ ETCDCTL_API=3 nohup etcdctl make-mirror --endpoints=http://localhost:22379 http://localhost:32379 &

クラスタ3のデータを見ると、クラスタ1、クラスタ2のキー値がクラスタ3に同期していることがわかります.
$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:32379 get --prefix /
/cluster1
this is cluster1
/cluster2
this is cluster2
/cluster3
this is cluster3

クラスタ2のキー値を変更し、クラスタ3のキー値情報を表示すると、データがリアルタイムで同期されていることがわかります.
$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:22379 put /cluster2 "renew cluster2"  #  2 
OK

$ ETCDCTL_API=3 etcdctl --endpoints=http://localhost:32379 get --prefix /
/cluster1
this is cluster1
/cluster2
renew cluster2      #  
/cluster3
this is cluster3

まとめ

  • make-mirrorコマンドは、データをリアルタイムでバックアップし、災害を回避するだけでなく、複数のデータを1つのクラスタに統合することもできます.
  • 問題が発生しました.最善の解決策は公式資料を読むことです.

  • リファレンス

  • make-mirrorコマンドマニュアル