静的検出方式によるetcdクラスタの導入
18040 ワード
「etcd使用入門」では、etcdの基本的な知識点とインストールについて簡単に紹介します.今回は、etcdクラスタの導入方法について説明します.
etcdは、主に3つの形式で高可用性クラスタを構築します.静的発見:etcdクラスタにどのノードがあるかは予め知られており、起動時に etcd動的発見:既存のetcdクラスタをデータインタラクションポイントとして使用し、新しいクラスタを拡張する際に既存のクラスタによるサービス発見を実現するメカニズム.例えば公式提供:discovery.etcd.io DNS動的検出:DNSクエリにより他のノードアドレス情報を取得する.
本稿では,静的発見によってetcdクラスタを導入する方法について説明するが,この方法も最も簡単である.
環境準備
クラスタノードは、通常、必要に応じて3,5,7,9ノードに配置されます.ここで偶数のノードを選択できますか?やめたほうがいい.理由は2つあります.偶数ノードクラスタが使用できないリスクはより高く、選択者の過程で大きな確率または等額の票があり、次の選挙をトリガーします. 偶数個のノードクラスタは、いくつかのネットワーク分割シーンで正常に動作しません.ネットワーク分割が発生すると,クラスタノードを半分割する.クラスタが動作しません.RAFTプロトコルに従って、クラスタ書き込み操作はほとんどのノードを同意させることができず、書き込みに失敗し、クラスタが正常に動作しない.
ここでは、3ノードのクラスタを配備します.以下はホスト情報3台、システム環境はUbuntu 16.04です.
ノード名
アドレス
etcd1
192.168.2.210
etcd2
192.168.2.211
etcd3
192.168.2.212
etcdのインストール
「etcd使用入門」では、インストール方法について説明しましたが、ここでは繰り返し説明しません.まだインストールされていない場合は、「etcd使用入門」を参照してください.
etcdクラスタの構成
etcdプロファイルを変更します.ここの環境は etcd 1構成例 etcd 2構成例 etcd 3構成例
上記の構成パラメータについて簡単に説明します. ETCD_NAME:ETCDのノード名 ETCD_DATA_DIR:ETCDのデータストアディレクトリ ETCD_SNAPSHOT_COUNTER:トランザクションのコミットを複数回すると、スナップショット がトリガーされます. ETCD_HEARTBEAT_INTERVAL:ETCDノード間の心拍数伝送の間隔、単位ミリ秒 ETCD_ELECTION_TIMEOUT:このノードが選挙に参加する最大タイムアウト時間、単位ミリ秒 ETCD_LISTEN_PEER_URLS:当該ノードが他のノードと通信する時に傍受するアドレスリスト.複数のアドレスはカンマで区切られ、そのフォーマットはscheme://IP:PORTここのschemeはhttp、https であってもよい ETCD_LISTEN_CLIENT_URLS:当該ノードがクライアントと通信するときに傍受するアドレスリスト ETCD_INITIAL_ADVERTISE_PEER_URLS:クラスタ全体におけるメンバノードの通信アドレスのリスト.このアドレスは、クラスタデータのアドレスを送信するために使用される.したがって、このアドレスはクラスタ内のすべてのメンバーに接続できる必要があります. ETCD_INITIAL_CLUSTER:クラスタ内のすべてのメンバーアドレスを設定し、そのフォーマットは:ETCD_NAME=ETCD_INITIAL_ADVERTISE_PEER_URLS、カンマで区切られた複数の場合 ETCD_ADVERTISE_CLIENT_URLS:クラスタ内の他のメンバにブロードキャストするクライアントアドレスリスト ETCD_INITIAL_CLUSTER_STATE:クラスタ状態を初期化し、newは新規 を示す ETCD_INITIAL_CLUSTER_TOKEN:初期化クラスタtoken 注意:すべてのETCD_MY_FLAGの構成パラメータは、コマンドラインパラメータで設定することもできますが、コマンドラインが指定するパラメータの優先度が高く、環境変数に対応する値が存在する場合に上書きされます.
次に、一般的な構成のパラメータと説明します.
テストetcdクラスタ
上に各クラスタノードを配置した後,各ノードでetcdをそれぞれ起動する.
起動が完了すると、以下に示すように、任意のノードで
ここに指定されたクラスタアドレスが表示されるのは、上の構成でIPがバインドされているためである.指定しないと次のエラーが発生します.
etcdクラスタ基本管理クラスタの健康状態を表示 クラスタメンバーの表示 いずれかのノードで実行すると、クラスタのノードの状況が表示され、どちらがleaderノードであるかがわかります.ノード を更新ノード を削除新しいノード を追加
注意:手順は重要です.そうしないと、クラスタIDが一致しません.
a.クラスタへのターゲットノードの追加
b.新規メンバーリストの表示
etcd 1ステータスはunstartedになりました
c.目標ノードデータをクリアする
ターゲットノードがクラスタから削除されると、メンバー情報が更新されます.新しいノードは新しいノードとしてクラスタに参加し、data-dirにデータがある場合、etcdが起動すると既存のデータが読み出され、古いmemberIDでクラスタに参加できないため、必ず新しいノードのdata-dirを空にします.
d.新規追加メンバーをターゲットノードで起動する
修正プロファイルには
etcdの起動
新しいノードが正常に追加されたかどうかを確認
リファレンスドキュメント
http://www.google.comhttp://t.cn/RX7JagChttp://cizixs.com/2016/08/02/intro-to-etcdhttp://zkread.com/article/1227544.html
etcdは、主に3つの形式で高可用性クラスタを構築します.
--initial-cluster
パラメータによってetcdの各ノードアドレスを直接指定する.本稿では,静的発見によってetcdクラスタを導入する方法について説明するが,この方法も最も簡単である.
環境準備
クラスタノードは、通常、必要に応じて3,5,7,9ノードに配置されます.ここで偶数のノードを選択できますか?やめたほうがいい.理由は2つあります.
ここでは、3ノードのクラスタを配備します.以下はホスト情報3台、システム環境はUbuntu 16.04です.
ノード名
アドレス
etcd1
192.168.2.210
etcd2
192.168.2.211
etcd3
192.168.2.212
etcdのインストール
「etcd使用入門」では、インストール方法について説明しましたが、ここでは繰り返し説明しません.まだインストールされていない場合は、「etcd使用入門」を参照してください.
etcdクラスタの構成
etcdプロファイルを変更します.ここの環境は
/opt/etcd/config/etcd.conf
です.実際の状況に応じて変更してください.1
2
3
4
5
6
7
8
9
10
11
12
#
$ vim /opt/etcd/config/etcd.conf
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://192.168.2.210:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.2.210:2379,http://192.168.2.210:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.2.210:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.2.210:2380,etcd2=http://192.168.2.211:2380,etcd3=http://192.168.2.212:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="hilinux-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.2.210:2379,http://192.168.2.210:4001"
1
2
3
4
5
6
7
8
9
10
11
12
#
$ vim /opt/etcd/config/etcd.conf
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
ETCD_LISTEN_PEER_URLS="http://192.168.2.211:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.2.211:2379,http://192.168.2.211:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.2.211:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.2.210:2380,etcd2=http://192.168.2.211:2380,etcd3=http://192.168.2.212:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="hilinux-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.2.211:2379,http://192.168.2.211:4001"
1
2
3
4
5
6
7
8
9
10
11
12
#
$ vim /opt/etcd/config/etcd.conf
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd3"
ETCD_LISTEN_PEER_URLS="http://192.168.2.212:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.2.212:2379,http://192.168.2.212:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.2.212:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.2.210:2380,etcd2=http://192.168.2.211:2380,etcd3=http://192.168.2.212:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="hilinux-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.2.212:2379,http://192.168.2.212:4001"
上記の構成パラメータについて簡単に説明します.
次に、一般的な構成のパラメータと説明します.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--name: , default, , hostname
--data-dir: , ${name}.etcd
--snapshot-count: (transaction) ,
--heartbeat-interval:leader followers。 100ms
--eletion-timeout: , follow , , 1000 ms
--listen-peer-urls: , http://ip:2380, , 。 , localhost!
--listen-client-urls: : http://ip:2379,http://127.0.0.1:2379, etcd
--advertise-client-urls: ,
--initial-advertise-peer-urls: ,
--initial-cluster: , node1=http://ip1:2380,node2=http://ip2:2380,…。 : node1 --name ; ip1:2380 --initial-advertise-peer-urls
--initial-cluster-state: , new; , existing
--initial-cluster-token: token, 。 , , , uuid; ,
--init bootstrap , 。
テストetcdクラスタ
上に各クラスタノードを配置した後,各ノードでetcdをそれぞれ起動する.
1
$ systemctl start etcd
起動が完了すると、以下に示すように、任意のノードで
etcdctl member list
を実行して、すべてのクラスタノード情報を列挙することができる.1
2
3
4
$ etcdctl --endpoints "http://192.168.2.210:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=true
a8589aa8629b731b: name=etcd1 peerURLs=http://192.168.2.210:2380 clientURLs=http://192.168.2.210:2379,http://192.168.2.210:4001 isLeader=false
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=false
ここに指定されたクラスタアドレスが表示されるのは、上の構成でIPがバインドされているためである.指定しないと次のエラーが発生します.
1
2
3
4
5
6
$ etcdctl member list
Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused
; error #1: dial tcp 127.0.0.1:2379: getsockopt: connection refused
error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused
error #1: dial tcp 127.0.0.1:2379: getsockopt: connection refused
etcdクラスタ基本管理
1
2
3
4
5
$ etcdctl --endpoints "http://192.168.2.210:2379" cluster-health
member a3ba19408fd4c829 is healthy: got healthy result from http://192.168.2.212:2379
member a8589aa8629b731b is healthy: got healthy result from http://192.168.2.210:2379
member e4a3e95f72ced4a7 is healthy: got healthy result from http://192.168.2.211:2379
cluster is healthy
1
2
3
4
$ etcdctl --endpoints "http://192.168.2.210:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=true
a8589aa8629b731b: name=etcd1 peerURLs=http://192.168.2.210:2380 clientURLs=http://192.168.2.210:2379,http://192.168.2.210:4001 isLeader=false
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=false
1
2
3
4
5
6
7
8
9
# IP(peerURLS), ID
$ etcdctl --endpoints "http://192.168.2.210:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=false
a8589aa8629b731b: name=etcd1 peerURLs=http://192.168.2.210:2380 clientURLs=http://192.168.2.210:2379,http://192.168.2.210:4001 isLeader=false
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=true
#
$ etcdctl --endpoints "http://192.168.2.210:2379" member update a8589aa8629b731b http://192.168.2.210:2380
Updated member with ID a8589aa8629b731b in cluster
1
2
3
4
5
6
7
8
9
10
11
$ etcdctl --endpoints "http://192.168.2.210:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=false
a8589aa8629b731b: name=etcd1 peerURLs=http://192.168.2.210:2380 clientURLs=http://192.168.2.210:2379,http://192.168.2.210:4001 isLeader=false
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=true
$ etcdctl --endpoints "http://192.168.2.210:2379" member remove a8589aa8629b731b
Removed member a8589aa8629b731b from cluster
$ etcdctl --endpoints "http://192.168.2.211:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=false
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=true
注意:手順は重要です.そうしないと、クラスタIDが一致しません.
a.クラスタへのターゲットノードの追加
1
2
3
4
5
6
7
$ etcdctl --endpoints "http://192.168.2.211:2379" member add etcd1 http://192.168.2.210:2380
Added member named etcd1 with ID baab0aae8b58c802 to cluster
ETCD_NAME="etcd1"
ETCD_INITIAL_CLUSTER="etcd3=http://192.168.2.212:2380,etcd1=http://192.168.2.210:2380,etcd2=http://192.168.2.211:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
b.新規メンバーリストの表示
etcd 1ステータスはunstartedになりました
1
2
3
4
$ etcdctl --endpoints "http://192.168.2.211:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=false
baab0aae8b58c802[unstarted]: peerURLs=http://192.168.2.210:2380
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=true
c.目標ノードデータをクリアする
ターゲットノードがクラスタから削除されると、メンバー情報が更新されます.新しいノードは新しいノードとしてクラスタに参加し、data-dirにデータがある場合、etcdが起動すると既存のデータが読み出され、古いmemberIDでクラスタに参加できないため、必ず新しいノードのdata-dirを空にします.
1
$ rm -rf /var/lib/etcd/etcd1
d.新規追加メンバーをターゲットノードで起動する
修正プロファイルには
ETCD_INITIAL_CLUSTER_STATE
がexisting
とマークされており、newであれば自動的に新しいmemberIDが生成されます.これは、前にノードを追加したときに生成されたIDと一致しないため、ログにノードIDの不一致が報告されます.1
2
$ vim /opt/etcd/config/etcd.conf
ETCD_INITIAL_CLUSTER_STATE="existing"
etcdの起動
1
$ systemctl start etcd
新しいノードが正常に追加されたかどうかを確認
1
2
3
4
$ etcdctl --endpoints "http://192.168.2.210:2379" member list
a3ba19408fd4c829: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=false
baab0aae8b58c802: name=etcd1 peerURLs=http://192.168.2.210:2380 clientURLs=http://192.168.2.210:2379,http://192.168.2.210:4001 isLeader=false
e4a3e95f72ced4a7: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=true
リファレンスドキュメント
http://www.google.comhttp://t.cn/RX7JagChttp://cizixs.com/2016/08/02/intro-to-etcdhttp://zkread.com/article/1227544.html