複数のetcdクラスタのデータを統合する方法
5171 ワード
複数のetcdクラスタのキー値が重複しない場合、データをマージできますか?データベースのように、古いライブラリからデータをエクスポートし、新しいライブラリに挿入すれば万事順調ですか?答えはできません.etcdは似たような機能を提供していません.バックアップ機能がありますが、複数のクラスタのバックアップデータは直接統合できません.ループを書いて、古いクラスタのデータを遍歴して、新しいクラスタを挿入するしかありませんか?これはあまりにも地味なのではないでしょうか.そこでネットでいろいろな資料を探し始めましたが、いつも無駄に帰ってきて、etcdの公式資料を正直に見るしかありません.カンフーは心を動かさず、ついにmake-mirrorのようなコマンドを見つけました.このコマンドはリアルタイムでクラスタのデータを他のクラスタにバックアップすることができます.私の考えと一致しているような気がしますが、データのマージに使えますか.次の実験を見てください.
コマンド構文は以下のとおりです.詳細はコマンドマニュアルを参照してください.
このうち
Windowsローカルにetcdクラスタを3セット構築し、名前はそれぞれcluster 1、cluster 2、cluster 3である.ここではcluster 1とcluster 2のデータをcluster 3に統合すると仮定し、実験の便利さのためにhttpアクセスのみを開放する.
クラスタ1を起動し、テストキー/cluster 1に書き込みます.混同を回避するために、クライアントアクセスポートは、例えばクラスタ1に対して12379であり、クラスタ通信ポートは12380である.
クラスタ2を起動し、テストキー/cluster 2に書き込みます.
クラスタ3を起動し、テストキー/cluster 3に書き込みます.
クラスタ1のデータをクラスタ3に同期する.
クラスタ2のデータをクラスタ3に同期する.
クラスタ3のデータを見ると、クラスタ1、クラスタ2のキー値がクラスタ3に同期していることがわかります.
クラスタ2のキー値を変更し、クラスタ3のキー値情報を表示すると、データがリアルタイムで同期されていることがわかります.
make-mirrorコマンドは、データをリアルタイムでバックアップし、災害を回避するだけでなく、複数のデータを1つのクラスタに統合することもできます. 問題が発生しました.最善の解決策は公式資料を読むことです.
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