Ubuntu18.04にApacheZooKeeperクラスターをインストールして構成する方法
著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにWikimediaFoundationInc.を選択しました。
序章
Apache ZooKeeper は、復元力と信頼性の高い分散調整を可能にするオープンソースソフトウェアです。 分散システムで一般的に使用され、構成情報、ネーミングサービス、分散同期、クォーラム、および状態を管理します。 さらに、分散システムは、コンセンサス、リーダー選出、およびグループ管理を実装するためにZooKeeperに依存しています。
このガイドでは、Ubuntu18.04にApacheZooKeeper3.4.13をインストールして構成します。 復元力と高可用性を実現するために、ZooKeeperは、アンサンブルと呼ばれる一連のホスト上で複製することを目的としています。 最初に、シングルノードのZooKeeperサーバーのスタンドアロンインストールを作成し、次にマルチノードクラスターをセットアップするための詳細を追加します。 スタンドアロンインストールは、開発およびテスト環境で役立ちますが、クラスターは実稼働環境で最も実用的なソリューションです。
前提条件
このインストールおよび構成ガイドを開始する前に、次のものが必要です。
- スタンドアロンインストールには、 Ubuntu 18.04初期サーバーセットアップガイドに従ってセットアップされた最低4GBのRAMを備えた1台のUbuntu18.04サーバーが必要です。これには、sudo権限を持つ非rootユーザーとファイアウォールが含まれます。 マルチノードクラスターには、同じ手順に従ってセットアップする2つの追加サーバーが必要です。
- ZooKeeperではJavaを実行する必要があるため、OpenJDK8がサーバーにインストールされています。 これを行うには、 Ubuntu18.04ガイドで「apt」を使用してJavaをインストールする方法」の「OpenJDKの特定のバージョンをインストールする」の手順に従います。
ZooKeeperはデータをメモリに保持して高スループットと低遅延を実現するため、本番システムは8GBのRAMで最適に動作します。 RAMの量が少ないと、JVMスワッピングが発生し、ZooKeeperサーバーの遅延が発生する可能性があります。 ZooKeeperサーバーの待ち時間が長いと、クライアントセッションのタイムアウトなどの問題が発生し、システムの機能に悪影響を与える可能性があります。
ステップ1—ZooKeeperのユーザーを作成する
専用ユーザーは、ネットワーク経由でリクエストを処理し、リソースを消費するサービスを実行する必要があります。 この方法により、環境のセキュリティと管理性を向上させる分離と制御が作成されます。 このステップでは、ZooKeeperサービスを実行するために、このチュートリアルでzkという名前の非rootsudoユーザーを作成します。
まず、前提条件で作成したroot以外のsudoユーザーとしてログインします。
ssh sammy@your_server_ip
ZooKeeperサービスを実行するユーザーを作成します。
- sudo useradd zk -m
-m
フラグをuseradd
コマンドに渡すと、このユーザーのホームディレクトリが作成されます。 zkのホームディレクトリはデフォルトで/home/zk
になります。
bash
をzkユーザーのデフォルトシェルとして設定します。
- sudo usermod --shell /bin/bash zk
このユーザーのパスワードを設定します。
- sudo passwd zk
次に、zkユーザーをsudoグループに追加して、特権モードでコマンドを実行できるようにします。
- usermod -aG sudo zk
セキュリティの観点から、SSHアクセスをできるだけ少ないユーザーに許可することをお勧めします。 sammy としてリモートでログインし、su
を使用して目的のユーザーに切り替えると、システムにアクセスするための資格情報と実行中のプロセスの資格情報がある程度分離されます。 この手順では、zkユーザーとrootユーザーの両方のSSHアクセスを無効にします。
sshd_config
ファイルを開きます。
- sudo nano /etc/ssh/sshd_config
PermitRootLogin
行を見つけ、値をno
に設定して、rootユーザーのSSHアクセスを無効にします。
PermitRootLogin no
PermitRootLogin
値の下に、DenyUsers
行を追加し、SSHアクセスを無効にする必要があるユーザーとして値を設定します。
DenyUsers zk
ファイルを保存して終了し、SSHデーモンを再起動して変更を有効にします。
- sudo systemctl restart sshd
zkユーザーに切り替えます。
- su -l zk
-l
フラグは、ユーザーを切り替えた後にログインシェルを呼び出します。 ログインシェルは環境変数をリセットし、ユーザーにクリーンスタートを提供します。
プロンプトでパスワードを入力して、ユーザーを認証します。
zk ユーザーとして作成、構成、およびログインしたので、ZooKeeperデータを保存するためのディレクトリーを作成します。
ステップ2—ZooKeeperのデータディレクトリを作成する
ZooKeeperは、すべての構成データと状態データをディスクに保持するため、再起動後も存続できます。 このステップでは、ZooKeeperがデータの読み取りと書き込みに使用するデータディレクトリを作成します。 データディレクトリは、ローカルファイルシステムまたはリモートストレージドライブに作成できます。 このチュートリアルでは、ローカルファイルシステムにデータディレクトリを作成することに焦点を当てます。
ZooKeeperが使用するディレクトリを作成します。
- sudo mkdir -p /data/zookeeper
zkユーザーの所有権をディレクトリに付与します。
- sudo chown zk:zk /data/zookeeper
chown
は、/data/zookeeper
ディレクトリの所有権とグループを変更して、グループzkに属するユーザーzkがデータディレクトリを所有するようにします。
これで、データディレクトリが正常に作成および構成されました。 ZooKeeperの構成に進むときは、このパスを、ZooKeeperがファイルを保存するために使用するデータディレクトリとして指定します。
ステップ3—ZooKeeperバイナリのダウンロードと抽出
このステップでは、ZooKeeperバイナリを手動でダウンロードして/opt
ディレクトリに抽出します。 Advanced Packaging Tool apt
を使用してZooKeeperをダウンロードできますが、機能が異なる古いバージョンがインストールされる場合があります。 ZooKeeperを手動でインストールすると、使用するバージョンを完全に制御できます。
これらのファイルを手動でダウンロードしているので、/opt
ディレクトリに移動することから始めます。
- cd /opt
ローカルマシンから、Apacheダウンロードページに移動します。 このページは、最速のダウンロードのためにあなたに最も近いミラーを自動的に提供します。 提案されたミラーサイトへのリンクをクリックし、下にスクロールして zookeeper / をクリックして、利用可能なリリースを表示します。 インストールするZooKeeperのバージョンを選択します。 このチュートリアルでは、3.4.13の使用に焦点を当てます。 バージョンを選択したら、.tar.gz
で終わるバイナリファイルを右クリックして、リンクアドレスをコピーします。
サーバーから、コピーしたリンクとともにwget
コマンドを使用して、ZooKeeperバイナリをダウンロードします。
- sudo wget http://apache.osuosl.org/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
圧縮されたアーカイブからバイナリを抽出します。
- sudo tar -xvf zookeeper-3.4.13.tar.gz
.tar.gz
拡張機能は、TARパッケージとそれに続くGNU zip(gzip)圧縮の組み合わせを表します。 アーカイブを抽出するコマンドにフラグ-xvf
を渡したことがわかります。 フラグx
は抽出を表し、v
は抽出の進行状況を示す詳細モードを有効にし、f
は入力(この場合はzookeeper-3.4.13.tar.gz
)を次のように指定できるようにします。 STDINとは対照的です。
次に、実行可能ファイルを実行できるように、抽出されたバイナリのzkユーザー所有権を付与します。 次のように所有権を変更できます。
- sudo chown zk:zk -R zookeeper-3.4.13
次に、シンボリックリンクを構成して、ZooKeeperディレクトリが更新間で関連性を維持できるようにします。 シンボリックリンクを使用してディレクトリ名を短縮することもできます。これにより、構成ファイルの設定にかかる時間を短縮できます。
ln
コマンドを使用してシンボリックリンクを作成します。
- sudo ln -s zookeeper-3.4.13 zookeeper
そのリンクの所有権をzk:zk
に変更します。 リンク自体の所有権を変更するために-h
フラグを渡したことに注意してください。 -h
を指定しないと、前の手順で明示的に行ったリンクのターゲットの所有権が変更されます。
- sudo chown -h zk:zk zookeeper
シンボリックリンクが作成されると、構成内のディレクトリパスは関連性があり、将来のアップグレードでも変更されません。 これで、ZooKeeperを構成できます。
ステップ4—ZooKeeperを構成する
環境をセットアップしたので、ZooKeeperを構成する準備が整いました。
構成ファイルは/opt/zookeeper/conf
ディレクトリにあります。 このディレクトリには、ZooKeeperディストリビューションに付属するサンプル構成ファイルが含まれています。 zoo_sample.cfg
という名前のこのサンプルファイルには、最も一般的な構成パラメーター定義とこれらのパラメーターのサンプル値が含まれています。 一般的なパラメータのいくつかは次のとおりです。
tickTime
:ティックの長さをミリ秒単位で設定します。 ティックは、ZooKeeperが心拍間の長さを測定するために使用する時間単位です。 最小セッションタイムアウトはtickTimeの2倍です。dataDir
:インメモリデータベースのスナップショットと更新のトランザクションログを保存するために使用されるディレクトリを指定します。 トランザクションログ用に別のディレクトリを指定することを選択できます。clientPort
:クライアント接続をリッスンするために使用されるポート。maxClientCnxns
:クライアント接続の最大数を制限します。
/opt/zookeeper/conf
にzoo.cfg
という名前の構成ファイルを作成します。 nano
またはお気に入りのエディターを使用して、ファイルを作成して開くことができます。
- nano /opt/zookeeper/conf/zoo.cfg
次のプロパティと値のセットをそのファイルに追加します。
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
2000ミリ秒のtickTime
は、ハートビート間の推奨間隔です。 間隔を短くすると、システムのオーバーヘッドが発生する可能性がありますが、メリットは限られています。 dataDir
パラメーターは、前のセクションで作成したシンボリックリンクによって定義されたパスを指します。 従来、ZooKeeperはポート2181
を使用してクライアント接続をリッスンしていました。 ほとんどの場合、60の許可されたクライアント接続は、開発とテストに十分です。
ファイルを保存して、エディターを終了します。
これでZooKeeperが構成され、サーバーを起動する準備が整いました。
ステップ5— ZooKeeperを起動し、スタンドアロンインストールをテストする
ZooKeeperの実行に必要なすべてのコンポーネントを構成しました。 このステップでは、ZooKeeperサービスを開始し、サービスにローカルで接続して構成をテストします。
/opt/zookeeper
ディレクトリに戻ります。
- cd /opt/zookeeper
zkServer.sh
コマンドでZooKeeperを起動します。
- bin/zkServer.sh start
標準出力に次のように表示されます。
OutputZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
次のコマンドを使用して、ローカルのZooKeeperサーバーに接続します。
- bin/zkCli.sh -server 127.0.0.1:2181
CONNECTED
というラベルの付いたプロンプトが表示されます。 これにより、ローカルのスタンドアロンZooKeeperが正常にインストールされたことを確認できます。 エラーが発生した場合は、構成が正しいことを確認する必要があります。
OutputConnecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]
このプロンプトでhelp
と入力して、クライアントから実行できるコマンドのリストを取得します。 出力は次のようになります。
Output[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
いくつかのテストを行った後、プロンプトでquit
と入力して、クライアントセッションを閉じます。 クライアントセッションを閉じた後も、ZooKeeperサービスは実行を継続します。 次の手順でsystemd
サービスとして構成するため、ZooKeeperサービスをシャットダウンします。
- bin/zkServer.sh stop
これで、スタンドアロンのZooKeeperサービスがインストール、構成、およびテストされました。 この設定は、ZooKeeperに慣れるために役立ちますが、開発環境やテスト環境にも役立ちます。 構成が機能することがわかったので、ZooKeeperサービスの管理を簡素化するためにsystemd
を構成します。
ステップ6—Systemdユニットファイルの作成と使用
systemd 、システムおよびサービスマネージャーは、ユーザースペースをブートストラップし、ブート後にシステムプロセスを管理するために使用されるinitシステムです。 systemd
を使用して、ZooKeeperのステータスを開始および確認するためのデーモンを作成できます。
Systemd Essentials は、systemd
とその構成コンポーネントについてさらに学ぶための優れた入門リソースです。
エディタを使用して、/etc/systemd/system/
にzk.service
という名前の.service
ファイルを作成します。
- sudo nano /etc/systemd/system/zk.service
次の行をファイルに追加して、ZooKeeperサービスを定義します。
[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zk
Group=zk
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure
[Install]
WantedBy=default.target
ユニットファイル構成のService
セクションは、作業ディレクトリ、サービスを実行するユーザー、およびZooKeeperサービスを開始、停止、および再起動するための実行可能コマンドを指定します。 すべてのユニットファイル構成オプションの詳細については、Systemdユニットとユニットファイルについての記事を参照してください。
ファイルを保存して、エディターを終了します。
systemd
構成が整ったので、次のサービスを開始できます。
- sudo systemctl start zk
systemd
ファイルでサービスを正常に開始できることを確認したら、起動時にサービスを開始できるようにします。
- sudo systemctl enable zk
この出力は、シンボリックリンクの作成を確認します。
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/zk.service → /etc/systemd/system/zk.service.
以下を使用して、ZooKeeperサービスのステータスを確認します。
- sudo systemctl status zk
systemctl
を使用してZooKeeperサービスを停止します。
- sudo systemctl stop zk
最後に、デーモンを再起動するには、次のコマンドを使用します。
- sudo systemctl restart zk
systemd
メカニズムは、多くのLinuxディストリビューションで選択されるinitシステムになりつつあります。 ZooKeeperを管理するようにsystemd
を構成したので、この高速で柔軟なinitモデルを利用して、ZooKeeperサービスを開始、停止、および再起動できます。
ステップ7—マルチノードZooKeeperクラスターの構成
スタンドアロンのZooKeeperサーバーは開発とテストに役立ちますが、すべての本番環境にはレプリケートされたマルチノードクラスターが必要です。
アプリケーションとして連携して動作するZooKeeperクラスター内のノードは、クォーラムを形成します。 クォーラムとは、トランザクションがコミットされる前にトランザクションに同意する必要があるノードの最小数を指します。 クォーラムは、過半数を確立できるように、奇数のノードを必要とします。 ノードの数が偶数の場合、同点になる可能性があります。これは、ノードが過半数またはコンセンサスに到達しないことを意味します。
実稼働環境では、各ZooKeeperノードを別々のホストで実行する必要があります。 これにより、ホストハードウェアの障害や再起動によるサービスの中断を防ぎます。 これは、復元力があり可用性の高い分散システムを構築するための重要かつ必要なアーキテクチャ上の考慮事項です。
このチュートリアルでは、クォーラムに3つのノードをインストールして構成し、マルチノードのセットアップを示します。 3ノードクラスターを構成する前に、スタンドアロンのZooKeeperインストールと同じ構成で2つの追加サーバーを起動します。 2つの追加ノードが前提条件を満たしていることを確認してから、手順1〜6に従って、実行中のZooKeeperインスタンスをセットアップします。
新しいノードの手順1〜6を実行したら、各ノードのエディターでzoo.cfg
を開きます。
- sudo nano /opt/zookeeper/conf/zoo.cfg
クォーラム内のすべてのノードには、同じ構成ファイルが必要です。 3つのノードのそれぞれのzoo.cfg
ファイルで、initLimit
、syncLimit
、およびクォーラム内のサーバーの追加の構成パラメーターと値を、ファイル。
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=your_zookeeper_node_1:2888:3888
server.2=your_zookeeper_node_2:2888:3888
server.3=your_zookeeper_node_3:2888:3888
initLimit
は、初期同期フェーズにかかる時間を指定します。 これは、クォーラム内の各ノードがリーダーに接続する必要がある時間です。 syncLimit
は、要求を送信してから確認応答を受信するまでに経過できる時間を指定します。 これは、ノードがリーダーから同期しなくなる可能性がある最大時間です。 ZooKeeperノードは、フォロワーノードがリーダーノードに接続するため、およびリーダーの選出のために、それぞれ:2888
および:3888
のポートのペアを使用します。
各ノードでファイルを更新したら、エディターを保存して終了します。
マルチノード構成を完了するには、各サーバーでノードIDを指定します。 これを行うには、各ノードにmyid
ファイルを作成します。 各ファイルには、構成ファイルで割り当てられたサーバー番号に対応する番号が含まれます。
your_zookeeper_node_1 で、ノードIDを指定するmyid
ファイルを作成します。
- sudo nano /data/zookeeper/myid
your_zookeeper_node_1はserver.1
として識別されるため、1
と入力してノードIDを定義します。 値を追加すると、ファイルは次のようになります。
your_zookeeper_node_1 /data/zookeeper/myid1
残りのノードについても同じ手順に従います。 各ノードのmyid
ファイルは次のようになります。
your_zookeeper_node_1 /data/zookeeper/myid1
your_zookeeper_node_2 /data/zookeeper/myid][environment second2
your_zookeeper_node_3 /data/zookeeper/myid][environment third3
これで、3ノードのZooKeeperクラスターが構成されました。 次に、クラスターを実行してインストールをテストします。
ステップ8—マルチノードインストールの実行とテスト
各ノードがクラスターとして機能するように構成されたら、クォーラムを開始する準備が整います。 このステップでは、各ノードでクォーラムを開始し、ZooKeeperでサンプルデータを作成してクラスターをテストします。
クォーラムノードを開始するには、最初に各ノードの/opt/zookeeper
ディレクトリに移動します。
- cd /opt/zookeeper
次のコマンドで各ノードを起動します。
- java -cp zookeeper-3.4.13.jar:lib/log4j-1.2.17.jar:lib/slf4j-log4j12-1.7.25.jar:lib/slf4j-api-1.7.25.jar:conf org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.cfg
ノードが起動すると、いくつかの接続エラーが断続的に発生し、その後、ノードがクォーラムに参加してリーダーを選出する段階が続きます。 初期化の数秒後、インストールのテストを開始できます。
前提条件で構成した非rootユーザーとして、SSH経由でyour_zookeeper_node_3にログインします。
- ssh sammy@your_zookeeper_node_3
ログインしたら、zkユーザーに切り替えます。
- your_zookeeper_node_3 /data/zookeeper/myid][environment thirdsu -l zk
zkユーザーのパスワードを入力します。 ログインしたら、ディレクトリを/opt/zookeeper
に変更します。
- your_zookeeper_node_3 /data/zookeeper/myid][environment thirdcd /opt/zookeeper
ここで、ZooKeeperコマンドラインクライアントを起動し、your_zookeeper_node_1でZooKeeperに接続します。
- your_zookeeper_node_3 /data/zookeeper/myid][environment thirdbin/zkCli.sh -server your_zookeeper_node_1:2181
スタンドアロンインストールでは、クライアントとサーバーの両方が同じホストで実行されていました。 これにより、localhost
を使用してZooKeeperサーバーとのクライアント接続を確立できました。 クライアントとサーバーはマルチノードクラスター内の異なるノードで実行されているため、前の手順では、接続するためにyour_zookeeper_node_1のIPアドレスを指定する必要がありました。
手順5で見たのと同様に、CONNECTED
ラベルが付いたおなじみのプロンプトが表示されます。
次に、 znode を作成、一覧表示、削除します。 znodeは、ZooKeeperの基本的な抽象化であり、ファイルシステム上のファイルやディレクトリに類似しています。 ZooKeeperはそのデータを階層的な名前空間に保持し、znodesはこの名前空間のデータレジスタです。
ZooKeeperクラスターが正しくインストールおよび構成されていることを確認するには、znodeを正常に作成、一覧表示、および削除できることをテストすることが不可欠です。
zk_znode_1
という名前のznodeを作成し、文字列sample_data
を関連付けます。
- create /zk_znode_1 sample_data
作成すると、次の出力が表示されます。
OutputCreated /zk_znode_1
新しく作成されたznodeを一覧表示します。
- ls /
それに関連付けられたデータを取得します。
- get /zk_znode_1
ZooKeeperは次のように応答します。
Output[zk: your_zookeeper_node_1:2181(CONNECTED)] ls /
[zk_znode_1, zookeeper]
[zk: your_zookeeper_node_1:2181(CONNECTED)] get /zk_znode_1
sample_data
cZxid = 0x100000002
ctime = Tue Nov 06 19:47:41 UTC 2018
mZxid = 0x100000002
mtime = Tue Nov 06 19:47:41 UTC 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0
出力は、zk_node_1
に関連付けた値sample_data
を確認します。 ZooKeeperは、作成時間ctime
および変更時間mtime
に関する追加情報も提供します。 ZooKeeperはバージョン管理されたデータストアであるため、データバージョンに関するメタデータも表示されます。
zk_znode_1
znodeを削除します。
- delete /zk_znode_1
このステップでは、2つのZooKeeperノード間の接続を正常にテストしました。 また、znodeを作成、一覧表示、および削除することにより、基本的なznode管理についても学びました。 マルチノード構成が完了し、ZooKeeperの使用を開始する準備が整いました。
結論
このチュートリアルでは、スタンドアロン環境とマルチノードZooKeeper環境の両方を構成してテストしました。 マルチノードのZooKeeperデプロイメントを使用する準備ができたので、公式のZooKeeperドキュメントで追加情報とプロジェクトを確認できます。