静的検出方式によるetcdクラスタの導入

18040 ワード

「etcd使用入門」では、etcdの基本的な知識点とインストールについて簡単に紹介します.今回は、etcdクラスタの導入方法について説明します.
etcdは、主に3つの形式で高可用性クラスタを構築します.
  • 静的発見:etcdクラスタにどのノードがあるかは予め知られており、起動時に--initial-clusterパラメータによって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プロファイルを変更します.ここの環境は/opt/etcd/config/etcd.confです.実際の状況に応じて変更してください.
  • etcd 1構成例
  • 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"
    
  • etcd 2構成例
  • 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"
    
  • etcd 3構成例
  • 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"
    

    上記の構成パラメータについて簡単に説明します.
  • 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の構成パラメータは、コマンドラインパラメータで設定することもできますが、コマンドラインが指定するパラメータの優先度が高く、環境変数に対応する値が存在する場合に上書きされます.
    次に、一般的な構成のパラメータと説明します.
    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
    
  • クラスタメンバーの表示
  • いずれかのノードで実行すると、クラスタのノードの状況が表示され、どちらがleaderノードであるかがわかります.
    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_STATEexistingとマークされており、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