ZooKeeper Ensemble을 Vagrant로 구축했습니다.

지난번 ZooKeeper는 Standalone으로 제작되었습니다.
다음은 ZooKeeper도 중복 구성을 허용하도록 ZooKeeper Ensemble을 구축합니다.
ZooKeeper의 버전은 3.4.14입니다.
Vagrant 사용법은 Vagrant 입문을 참조하십시오.

ZooKeeper Ensemble



ZooKeeper의 가용성을 높이기 위해 여러 대의 Ensemble 구성을 사용합니다.
ZooKeeper에서는 Ensemble의 과반수가 동작하고 있는 것이 서비스의 계속 조건이기 때문에, 홀수대로 구축하는 것이 베스트인 것 같습니다.



4대의 머신으로 ZooKeeper Ensemble을 구축한 경우, 1대의 머신이 다운해도 나머지 3대에서 과반수가 되므로 서비스를 계속할 수 있습니다만,
2대의 머신이 다운하면 나머지 2대에서 과반수가 되지 않기 때문에 서비스를 계속할 수 없게 되어 버립니다.
즉 1/4, 25%의 다운을 허용합니다.



5대의 머신으로 ZooKeeper Ensemble을 구축한 경우, 2대의 머신이 다운해도 나머지 3대에서 과반수가 되므로 서비스를 계속할 수 있습니다만,
3대의 머신이 다운되면 나머지 2대에서 과반수가 되지 않기 때문에 서비스를 계속할 수 없게 되어 버립니다.
즉 2/5, 40%의 다운을 허용합니다.



6대의 머신으로 ZooKeeper Ensemble을 구축한 경우, 2대의 머신이 다운해도 나머지 4대에서 과반수가 되므로 서비스를 계속할 수 있습니다만,
3대의 머신이 다운되면 나머지 3대에서 과반수가 되지 않기 때문에 서비스를 계속할 수 없게 되어 버립니다.
즉 2/6, 33%의 다운을 허용합니다.



이것으로부터 홀수대로 구축하는 편이 머신을 유효 활용할 수 있다고 말할 수 있을 것 같습니다.

구성



여전히 쉘에서 어떻게 해야 합니다.
D:\vagrant\zkcluster
┣Vagrantfile
┗create_zkcluster.sh

Vagrantfile


  • OS는 CentOS 7을 사용합니다.
  • VM간에 통신 할 수 있도록 hosts 또는 no_proxy를 설정합니다.
  • 원하는 수의 ZooKeeper를 만들 수 있습니다.
  • # ZooKeeper数
    zk_cnt = 3
    
    Vagrant.configure("2") do |config|
      config.vm.box = "centos/7"
    
      #--- Proxy設定 ---#
      no_proxy_address = "localhost,127.0.0.1"
      (1..zk_cnt).each do |i|
        no_proxy_address += ",zk#{i},192.168.33.1#{i}"
      end
      config.proxy.enabled  = true
      config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
      config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
      config.proxy.no_proxy = no_proxy_address
      #--- /Proxy設定 ---#
    
      #--- ZooKeeper Ensemble 構築 ---#
      (1..zk_cnt).each do |i|
        config.vm.define "zk#{i}" do | zk |
          zk.vm.hostname = "zk#{i}"
          zk.vm.network "private_network", ip: "192.168.33.4#{i}", virtualbox__intnet: "solrcloud"
          zk.vm.provision :hosts, :sync_hosts => true
          zk.vm.provision :shell, path: "./create_zkensemble.sh", args: "#{i} #{zk_cnt}"
        end
      end
      #--- /ZooKeeper Ensemble 構築 ---#
    
    end
    

    c레테 _↑엔세 mbぇ. sh



    ZooKeeper에서 Ensemble을 구성하려면 다음 설정이 필요합니다.
  • zoo.cfg에서 Ensemble을 구성하는 서버의 정보는 "server.id = host : port : port"형식으로 설명됩니다.
  • dataDir 아래에 id (1 ~ 255의 숫자)가있는 파일 myid를 준비합니다.
  • # Java をインストールする
    yum install -y java-1.8.0-openjdk
    
    # ZooKeeper を構築する
    cd /var/tmp
    yum install -y wget
    wget http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
    tar xvf zookeeper-3.4.14.tar.gz
    cp -ar zookeeper-3.4.14 /opt/
    ln -s /opt/zookeeper-3.4.14 /opt/zookeeper
    
    # ZooKeeper 用のユーザを作成する
    groupadd zookeeper
    useradd -g zookeeper -d /opt/zookeeper -s /sbin/nologin zookeeper
    chown -R zookeeper.zookeeper /opt/zookeeper/*
    
    # ZooKeeperの設定ファイルを用意する
    cd /opt/zookeeper/conf
    cp zoo_sample.cfg zoo.cfg
    
    # dataDir を tmp から var に変更する
    mkdir /var/lib/zookeeper
    chown zookeeper.zookeeper /var/lib/zookeeper
    cd /opt/zookeeper/conf
    sed -i -e 's#dataDir=.*$#dataDir=/var/lib/zookeeper#' zoo.cfg
    
    # ZooKeeper アンサンブルの設定を追記する
    # $1 : ZooKeeper のノードID
    # $2 : ZooKeeper アンサンブルの構成ノード数
    echo "#ZooKeeper Ensemble" >> /opt/zookeeper/conf/zoo.cfg
    for i in `seq 1 $2`
    do
      if [ $i = $1 ] ; then
      # ノードIDが自分のものと一致する場合は 0.0.0.0 とする.
        echo "server.${i}=0.0.0.0:2888:3888" >> /opt/zookeeper/conf/zoo.cfg
      else
        echo "server.${i}=192.168.33.1${i}:2888:3888" >> /opt/zookeeper/conf/zoo.cfg
      fi
    done
    # dataDir にノードIDが記載された myid ファイルを用意する必要がある
    echo $1 | sudo tee /var/lib/zookeeper/myid
    
    # ZooKeeper を起動する
    cd /opt/zookeeper
    bin/zkServer.sh start
    
    # Port を開放する
    systemctl enable firewalld.service
    systemctl start firewalld.service
    firewall-cmd --zone=public --add-port=2181/tcp --add-port=2888/tcp --add-port=3888/tcp --permanent
    firewall-cmd --reload
    
    # 終了ステータスが 0 でない場合に Vagrant が異常終了とみなし VM が連続生成されないことがあるので明示する
    exit 0
    

    ZooKeeper Ensemble 구축


    > pwd
    D:\vagrant\zkensemble
    > vagrant up
    

    동작 확인



    ZooKeeper의 상태를 살펴 보겠습니다.
    > vagrant ssh zk1 -c "sudo /opt/zookeeper/bin/zkServer.sh status"
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    > vagrant ssh zk2 -c "sudo /opt/zookeeper/bin/zkServer.sh status"
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: leader
    > vagrant ssh zk3 -c "sudo /opt/zookeeper/bin/zkServer.sh status"
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    

    leader와 follower가 자동으로 선출되었습니다.

    가용성



    이제 리더를 중지합니다.
    > vagrant zk2 halt
    

    다시 ZooKeeper의 상태를 확인하십시오.
    > vagrant ssh zk1 -c "sudo /opt/zookeeper/bin/zkServer.sh status"
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    > vagrant ssh zk3 -c "sudo /opt/zookeeper/bin/zkServer.sh status"
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: leader
    

    무사 leader가 선출되었습니다.
    이러한 방식으로 Ensemble 구성을 사용하면 ZooKeeper 자체의 가용성이 향상됩니다.

    좋은 웹페이지 즐겨찾기