Apache > ZooKeeper
 

ZooKeeper 管理者ガイド

導入と管理ガイド

導入

このセクションには、Zookeeper の導入に関する情報が含まれており、以下のトピックについて説明しています。

最初の2つのセクションでは、データセンターなどの本番環境に ZooKeeper をインストールすることに関心のある方を対象としています。最後のセクションでは、評価、テスト、開発など、限定的な目的で ZooKeeper を設定する場合(本番環境以外)について説明します。

システム要件

サポートされているプラットフォーム

ZooKeeper は複数のコンポーネントで構成されています。一部のコンポーネントは幅広くサポートされていますが、一部のコンポーネントは少数のプラットフォームでのみサポートされています。

次のマトリックスは、さまざまなオペレーティングシステムプラットフォームで各コンポーネントを実行するためのコミットされたサポートレベルを示しています。

サポートマトリックス
オペレーティングシステムクライアントサーバーネイティブクライアントContrib
GNU/Linux開発および本番開発および本番開発および本番開発および本番
Solaris開発および本番開発および本番サポートされていませんサポートされていません
FreeBSD開発および本番開発および本番サポートされていませんサポートされていません
Windows開発および本番開発および本番サポートされていませんサポートされていません
Mac OS X開発のみ開発のみサポートされていませんサポートされていません

マトリックスで明示的にサポートされているものとして記載されていないオペレーティングシステムについては、コンポーネントが動作する場合と動作しない場合があります。ZooKeeper コミュニティは、他のプラットフォームで報告された明らかなバグを修正しますが、完全なサポートはありません。

必要なソフトウェア

ZooKeeper は Java バージョン 1.8 以降(JDK 8 LTS、JDK 11 LTS、JDK 12 - Java 9 および 10 はサポートされていません)で動作します。ZooKeeper サーバーのアンサンブルとして動作します。アンサンブルの推奨最小サイズは 3 つの ZooKeeper サーバーであり、別々のマシンで実行することもお勧めします。Yahoo! では、ZooKeeper は通常、デュアルコアプロセッサ、2GB の RAM、80GB の IDE ハードドライブを搭載した専用の RHEL ボックスに導入されています。

クラスタ化された(マルチサーバー)設定

信頼性の高い ZooKeeper サービスを実現するには、アンサンブルと呼ばれるクラスタに ZooKeeper を導入する必要があります。アンサンブルの大部分が稼働している限り、サービスは利用可能です。Zookeeper は過半数が必要なため、奇数のマシンを使用するのが最適です。たとえば、4 台のマシンでは、ZooKeeper は 1 台のマシンの障害のみを処理できます。2 台のマシンが故障した場合、残りの 2 台のマシンは過半数を構成しません。しかし、5 台のマシンでは、ZooKeeper は 2 台のマシンの故障を処理できます。

注記

ZooKeeper の導入ガイドで説明されているように、フォールトトレラントなクラスタ化された設定には最低 3 つのサーバーが必要です。奇数のサーバーを使用することを強くお勧めします。

通常、本番インストールには 3 つのサーバーで十分ですが、メンテナンス中の最大限の信頼性のために、5 つのサーバーをインストールすることをお勧めします。3 つのサーバーの場合、1 つのサーバーでメンテナンスを実行すると、そのメンテナンス中に他の 2 つのサーバーのいずれかが故障する可能性があります。5 つのサーバーが稼働している場合、1 つのサーバーをメンテナンスのために停止しても、他の 4 つのサーバーのいずれかが突然故障しても問題ありません。

冗長性の考慮事項には、環境のすべての側面を含める必要があります。3 つの ZooKeeper サーバーがある場合でも、それらのネットワークケーブルがすべて同じネットワークスイッチに接続されている場合、そのスイッチの故障により、アンサンブル全体が停止します。

アンサンブルの一部となるサーバーを設定する手順を次に示します。これらの手順は、アンサンブル内のすべてのホストで実行する必要があります。

  1. Java JDK をインストールします。システムのネイティブパッケージシステムを使用するか、JDK をここからダウンロードできます。http://java.sun.com/javase/downloads/index.jsp

  2. Java ヒープサイズを設定します。これは、スワッピングを回避するために非常に重要であり、スワッピングは ZooKeeper のパフォーマンスを著しく低下させます。正しい値を決定するには、負荷テストを使用し、スワッピングを引き起こす使用量制限を十分に下回っていることを確認します。保守的に行い、4GB のマシンには最大 3GB のヒープサイズを使用します。

  3. ZooKeeper サーバーパッケージをインストールします。ここからダウンロードできます。https://zookeeper.dokyumento.jp/releases.html

  4. 設定ファイルを作成します。このファイルは任意の名前を付けることができます。出発点として次の設定を使用してください。

    tickTime=2000
    dataDir=/var/lib/zookeeper/
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=zoo1:2888:3888
    server.2=zoo2:2888:3888
    server.3=zoo3:2888:3888
    

    これらおよびその他の設定の意味については、設定パラメータセクションを参照してください。ここでいくつかの点を考慮してください。ZooKeeper アンサンブルの一部である各マシンは、アンサンブル内の他のすべてのマシンについて認識する必要があります。これは、server.id=host:port:port の形式の行のシリーズを使用して実現します。(パラメータhostportは分かりやすいものです。各サーバーに対して、まずクォーラムポートを指定し、次にZooKeeperリーダー選出専用のポートを指定する必要があります)。ZooKeeper 3.6.0 以降では、各 ZooKeeper サーバーインスタンスに複数のアドレスを指定することもできます(これにより、複数の物理ネットワークインターフェースをクラスタ内で並行して使用できる場合に可用性を高めることができます)。サーバー ID を各マシンに割り当てるには、各サーバーのデータディレクトリ(設定ファイルのパラメータdataDirで指定)に存在する、myidという名前のファイルを作成します。

  5. myidファイルは、そのマシンのIDのテキストのみを含む単一行で構成されます。そのため、サーバー1のmyidには「1」というテキストのみが含まれ、それ以外は何も含まれません。IDはアンサンブル内で一意である必要があり、1〜255の値を持つ必要があります。重要:TTLノードなどの拡張機能を有効にする場合(下記参照)、内部的な制限により、IDは1〜254の範囲内にする必要があります。

  6. myidと同じディレクトリに初期化マーカーファイルinitializeを作成します。このファイルは、空のデータディレクトリが期待されていることを示します。存在する場合、空のデータベースが作成され、マーカーファイルが削除されます。存在しない場合、空のデータディレクトリは、このピアが投票権を持たず、アクティブなリーダーと通信するまでデータディレクトリを設定しないことを意味します。新しいアンサンブルを起動する場合にのみ、このファイルを作成することを目的としています。

  7. 設定ファイルが設定されている場合、ZooKeeper サーバーを起動できます。

    $ java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
    

QuorumPeerMain は ZooKeeper サーバーを起動し、JMX 管理 Bean も登録されます。これにより、JMX 管理コンソールを介して管理できます。ZooKeeper JMX ドキュメントには、JMX を使用した ZooKeeper の管理の詳細が含まれています。リリースに含まれるスクリプトbin/zkServer.shを参照して、サーバーインスタンスの起動例を確認してください。8. ホストに接続して展開をテストします。Java では、次のコマンドを実行して簡単な操作を実行できます。

    $ bin/zkCli.sh -server 127.0.0.1:2181

シングルサーバーと開発者向け設定

開発目的で ZooKeeper を設定する場合は、ZooKeeper のシングルサーバーインスタンスを設定し、Java または C のクライアント側のライブラリとバインディングを開発マシンにインストールすることをお勧めします。

シングルサーバーインスタンスの設定手順は上記と同様ですが、設定ファイルはよりシンプルです。ZooKeeper の導入ガイドシングルサーバーモードでの ZooKeeper のインストールと実行セクションで、完全な手順を確認できます。

クライアント側のライブラリのインストールについては、ZooKeeper プログラマーガイドバインディングセクションを参照してください。

管理

このセクションには、ZooKeeper の実行とメンテナンスに関する情報が含まれており、以下のトピックについて説明しています。

ZooKeeper 導入の設計

ZooKeeper の信頼性は、2 つの基本的な前提に基づいています。

  1. 導入されているサーバーのうち、少数のみが故障します。このコンテキストにおける故障とは、マシンクラッシュ、またはサーバーを過半数から分離するネットワークエラーを意味します。
  2. 導入されたマシンは正しく動作します。正しく動作するとは、コードを正しく実行し、時計が正しく動作し、ストレージとネットワークコンポーネントが一貫して動作することを意味します。

以下のセクションには、これらの前提が成り立つ確率を最大限に高めるための、ZooKeeper 管理者向けの考慮事項が含まれています。これらのいくつかは複数マシン間の考慮事項であり、その他は導入されているすべてのマシンについて考慮する必要がある事項です。

複数マシン間の要件

ZooKeeper サービスをアクティブにするには、互いに通信できる非故障マシンの過半数が必要です。N 台のサーバーを持つ ZooKeeper アンサンブルの場合、N が奇数であれば、アンサンブルは最大 N/2 台のサーバー障害に耐えることができます(znode データの損失はありません)。N が偶数の場合、アンサンブルは最大 N/2-1 台のサーバー障害に耐えることができます。

たとえば、3 台のサーバーを持つ ZooKeeper アンサンブルの場合、アンサンブルは最大 1 台(3/2)のサーバー障害に耐えることができます。5 台のサーバーを持つ ZooKeeper アンサンブルの場合、アンサンブルは最大 2 台(5/2)のサーバー障害に耐えることができます。6 台のサーバーを持つ ZooKeeper アンサンブルの場合も、データの損失を防ぎ、「ブレインスプリット」の問題を回避するために、最大 2 台(6/2-1)のサーバー障害に耐えることができます。

ZooKeeper アンサンブルは通常、奇数のサーバーで構成されます。これは、偶数のサーバーでは、故障耐性の能力がサーバー数が1つ少ないアンサンブルと同じであるためです(5ノードアンサンブルと6ノードアンサンブルの両方で2つの故障)が、アンサンブルは1つ多いサーバーのための追加の接続とデータ転送を維持する必要があるためです。

障害発生時の耐性を最大限に高めるには、マシンの障害を独立させるようにする必要があります。例えば、ほとんどのマシンが同じスイッチを共有している場合、そのスイッチの障害によって相関のある障害が発生し、サービスが停止する可能性があります。これは、共有電源回路、冷却システムなどにも当てはまります。

単一マシンの要件

ZooKeeperがストレージメディア、CPU、ネットワーク、メモリなどのリソースへのアクセスについて他のアプリケーションと競合する必要がある場合、そのパフォーマンスは著しく低下します。ZooKeeperは強力な耐久性保証を持っており、変更を担当する操作が完了する前に、変更をログに記録するためにストレージメディアを使用します。この依存関係を認識し、ZooKeeperの操作がメディアによって遅延されないようにするには、細心の注意を払う必要があります。このようなパフォーマンス低下を最小限に抑えるためにできることの一部を次に示します。

プロビジョニング

考慮事項:ZooKeeper の長所と短所

管理

メンテナンス

ZooKeeperクラスタには、長期的なメンテナンスはほとんど必要ありませんが、次の点に注意する必要があります。

継続的なデータディレクトリのクリーンアップ

ZooKeeperのデータディレクトリには、特定のサービングアンサンブルによって格納されたznodesの永続的なコピーであるファイルが含まれています。これらは、スナップショットファイルとトランザクションログファイルです。znodesに変更が加えられると、これらの変更はトランザクションログに追加されます。ログが大きくなると、znodesの現在の状態のスナップショットがファイルシステムに書き込まれ、今後のトランザクションのために新しいトランザクションログファイルが作成されます。スナップショット作成中は、ZooKeeperは着信トランザクションを古いログファイルに追加し続ける場合があります。したがって、スナップショットより新しいトランザクションの一部は、スナップショットの前にある最後のトランザクションログに見つかる場合があります。

ZooKeeperサーバーは、デフォルトの設定(後述の自動パージを参照)を使用している場合、古いスナップショットとログファイルを削除しません。これはオペレーターの責任です。すべての運用環境は異なるため、これらのファイルの管理要件はインストールごとに異なる場合があります(バックアップなど)。

PurgeTxnLogユーティリティは、管理者が使用できる単純な保持ポリシーを実装しています。 APIドキュメントには、呼び出し規約(引数など)の詳細が記載されています。

次の例では、最後のcount個のスナップショットとその対応するログが保持され、他のものは削除されます。の値は、通常3より大きくする必要があります(必須ではありませんが、最近のログが破損した場合に備えて3つのバックアップを提供します)。これは、ZooKeeperサーバーマシンでcronジョブとして実行して、ログを毎日クリーンアップできます。

java -cp zookeeper.jar:lib/slf4j-api-1.7.30.jar:lib/logback-classic-1.2.10.jar:lib/logback-core-1.2.10.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>

スナップショットと対応するトランザクションログの自動パージは、バージョン3.4.0で導入され、以下の構成パラメーターautopurge.snapRetainCountautopurge.purgeIntervalを介して有効にできます。詳細については、以下の高度な設定を参照してください。

デバッグログのクリーンアップ(logback)

このドキュメントのログに関するセクションを参照してください。組み込みのlogback機能を使用してローリングファイルアペンダーを設定することが期待されています。リリースのtarファイルのconf/logback.xmlにあるサンプル構成ファイルに例が示されています。

スーパービジョン

各ZooKeeperサーバープロセス(JVM)を管理するスーパーバイザープロセスを用意することをお勧めします。ZKサーバーは「高速失敗」するように設計されており、回復できないエラーが発生した場合はシャットダウン(プロセスの終了)します。ZooKeeperサービングクラスタは非常に信頼性が高いため、サーバーがダウンしても、クラスタ全体はアクティブな状態を維持し、リクエストを処理します。さらに、クラスタは「自己修復」するため、失敗したサーバーは再起動されると、手動で操作することなく、アンサンブルに自動的に再参加します。

daemontoolsSMFなどのスーパーバイザープロセス(他のスーパーバイザープロセスのオプションも利用可能です。どのオプションを使用するかはユーザー次第です。これらは単なる2つの例です)を使用すると、プロセスが異常終了した場合でも、自動的に再起動され、クラスタに迅速に再参加します。

OutOfMemoryErrorが発生した場合に、ZooKeeperサーバープロセスの終了とヒープダンプの設定も推奨されます。これは、LinuxとWindowsでそれぞれ次の引数を使用してJVMを起動することで実現します。ZooKeeperに同梱されているzkServer.shzkServer.cmdスクリプトでは、これらのオプションが設定されています。

-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'

"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"

モニタリング

ZooKeeperサービスは、主に3つの方法で監視できます。

ロギング

ZooKeeperは、ログ記録インフラストラクチャとしてSLF4Jバージョン1.7を使用します。デフォルトでは、ZooKeeperにはログ記録バックエンドとしてLOGBackが同梱されていますが、他のサポートされているログ記録フレームワークを使用することもできます。

ZooKeeperのデフォルトのlogback.xmlファイルは、confディレクトリにあります。Logbackでは、logback.xmlが作業ディレクトリ(ZooKeeperの実行ディレクトリ)にあるか、クラスパスからアクセスできる必要があります。

SLF4Jの詳細については、マニュアルを参照してください。

Logbackの詳細については、Logbackウェブサイトを参照してください。

トラブルシューティング

設定パラメータ

ZooKeeperの動作は、ZooKeeper設定ファイルによって制御されます。このファイルは、ディスクレイアウトが同じであると仮定して、ZooKeeperサーバーを構成するすべてのサーバーでまったく同じファイルを使用できるように設計されています。サーバーが異なる設定ファイルを使用する場合は、すべての異なる設定ファイル内のサーバーのリストが一致するように注意する必要があります。

注記

3.5.0以降、これらのパラメーターの一部は動的設定ファイルに配置する必要があります。静的設定ファイルに配置されている場合、ZooKeeperはそれらを動的設定ファイルに自動的に移動します。詳細については、動的再構成を参照してください。

最小限の設定

設定ファイルで定義する必要がある最小限の設定キーワードを次に示します。

高度な設定

このセクションの設定はオプションです。これらを使用して、ZooKeeperサーバーの動作をさらに微調整できます。一部は、通常zookeeper.keywordという形式のJavaシステムプロパティを使用して設定することもできます。利用可能な場合は、正確なシステムプロパティを以下に示します。

この機能は下位互換性および上位互換性を備えています。さまざまなシナリオを以下に示します。

  1. サーバーによって内部的にトリガーされるスナップショット a. 古いスナップショットを新しいコードで読み込む場合、存在しないlastProcessedZxid値の読み取りを試行するとEOFExceptionが発生し、例外がキャッチされます。lastProcessedZxidはスナップショットファイル名を使用して設定されます。

    b. 新しいスナップショットを古いコードで読み込む場合、ダイジェスト値のデシリアライズ後に正常に終了します。スナップショットファイルの末尾にあるlastProcessedZxidは無視されます。lastProcessedZxidはスナップショットファイル名を使用して設定されます。

    1. リーダーとフォロワー間の同期 新旧両方のコードにおいて、lastProcessedZxidはリーダーによってシリアル化されず、フォロワーによってデシリアライズされません。QuorumPacketを介してリーダーから送信されたlastProcessedZxidに設定されます。
  2. 管理サーバーAPIによってトリガーされるスナップショット スナップショットコマンドを機能させるには、機能フラグを有効にする必要があります。

クラスタオプション

このセクションのオプションは、サーバーのアンサンブル(つまり、サーバーのクラスタを展開する場合)で使用するために設計されています。

本当にデフォルトですべてのフォーレターワードコマンドを有効にする必要がある場合は、アスタリスクオプションを使用すると、リストにすべてのコマンドを1つずつ含める必要がありません。たとえば、これによりすべてのフォーレターワードコマンドが有効になります。

4lw.commands.whitelist=*

暗号化、認証、認可オプション

このセクションのオプションを使用すると、サービスによって実行される暗号化/認証/認可を制御できます。

このページ以外にも、プログラマーガイドでクライアント側設定に関する役立つ情報を見つけることができます。ZooKeeper Wikiには、ZooKeeper SSLサポートZooKeeperのSASL認証に関する役立つページもあります。

実験的なオプション/機能

現在実験段階と見なされている新機能。

危険なオプション

次のオプションは役立つ場合がありますが、使用するときは注意してください。それぞれのリスクは、変数の機能の説明とともに説明されています。

データディレクトリの自動作成の無効化

3.5の新機能: ZooKeeperサーバーのデフォルト動作は、起動時に設定ファイルで指定されたデータディレクトリが存在しない場合、自動的にそのディレクトリを作成することです。これは、場合によっては不便で、危険なこともあります。実行中のサーバーの設定変更を行い、dataDirパラメーターを誤って変更した場合を考えてみてください。ZooKeeperサーバーを再起動すると、この存在しないディレクトリが作成され、空のznode名前空間でサービスを開始します。このシナリオは、事実上の「スプリットブレイン」状態(つまり、新しい無効なディレクトリと元の有効なデータストアの両方にデータが存在する状態)を引き起こす可能性があります。そのため、この自動作成動作をオフにするオプションがあると便利です。一般的に本番環境ではこれをオフにする必要がありますが、残念ながらデフォルトのレガシー動作はこの時点では変更できないため、ケースバイケースで対応する必要があります。これは、ZooKeeper配布パッケージのユーザーとパッケージャーに委ねられています。

zkServer.shを実行する際、環境変数ZOO_DATADIR_AUTOCREATE_DISABLEを1に設定することで、自動作成を無効にできます。クラスファイルから直接ZooKeeperサーバーを実行する場合は、Javaコマンドラインでzookeeper.datadir.autocreate=falseを設定することで実現できます。つまり、-Dzookeeper.datadir.autocreate=falseです。

この機能が無効になっており、ZooKeeperサーバーが必要なディレクトリが存在しないと判断した場合、エラーを生成して起動を拒否します。

この新機能をサポートするために、新しいスクリプトzkServer-initialize.shが提供されています。自動作成が無効になっている場合、ユーザーはまずZooKeeperをインストールし、データディレクトリ(および可能性のあるtxnlogディレクトリ)を作成してから、サーバーを起動する必要があります。そうでなければ、前の段落で述べたように、サーバーは起動しません。zkServer-initialize.shを実行すると、必要なディレクトリが作成され、オプションでmyidファイルが設定されます(オプションのコマンドラインパラメーター)。このスクリプトは、自動作成機能自体を使用しない場合でも使用でき、myidファイルの作成を含むセットアップは過去にユーザーにとって問題となっていたため、ユーザーにとって役立つ可能性が高いです。このスクリプトはデータディレクトリが存在することを確認するだけで、設定ファイルは作成せず、実行するには設定ファイルが利用可能である必要があります。

db 存在検証の有効化

3.6.0の新機能: データツリーが見つからない場合のZooKeeperサーバーの起動時のデフォルト動作は、zxidをゼロに設定し、投票メンバーとしてクォーラムに参加することです。サーバーがダウンしている間に何らかのイベント(例:悪意のある'rm -rf')によってデータディレクトリが削除された場合、このサーバーはトランザクションが欠落しているリーダーの選出に役立つ可能性があるため、これは危険です。DBの存在検証を有効にすると、データツリーが見つからない場合の起動時の動作が変更されます。サーバーは、リーダーと同期してアンサンブルデータの最新バージョンを取得できるようになるまで、非投票参加者としてアンサンブルに参加します。(アンサンブルの作成)空のデータツリーが期待されていることを示すには、'myid'と同じディレクトリに'initialize'というファイルを作成する必要があります。このファイルは、サーバーが起動時に検出して削除します。

クラスファイルから直接ZooKeeperサーバーを実行する場合は、Javaコマンドラインでzookeeper.db.autocreate=falseを設定することで、初期化検証を有効にできます。つまり、-Dzookeeper.db.autocreate=falseです。zkServer-initialize.shを実行すると、必要な初期化ファイルが作成されます。

パフォーマンスチューニングオプション

3.5.0の新機能: 読み取りスループットを向上させるために、いくつかのサブシステムが改良されました。これには、NIO通信サブシステムとリクエスト処理パイプライン(コミットプロセッサ)のマルチスレッド化が含まれます。NIOはデフォルトのクライアント/サーバー通信サブシステムです。そのスレッドモデルは、1つのアクセプタースレッド、1〜N個のセレクタースレッド、0〜M個のソケットI/Oワーカースレッドで構成されています。リクエスト処理パイプラインでは、同じ整合性保証(同じセッションでの書き込み後の読み取り)を維持しながら、一度に複数の読み取りリクエストを処理するようにシステムを設定できます。コミットプロセッサのスレッドモデルは、1つのメインスレッドと0〜N個のワーカースレッドで構成されています。

デフォルト値は、専用のZooKeeperマシンでの読み取りスループットを最大化することを目的としています。ピーク読み取りスループットを実現するには、両方のサブシステムに十分な数のスレッドが必要です。

デバッグオブザーバビリティ設定

3.6.0の新機能: ZooKeeperのデバッグを容易にするために、以下のオプションが導入されました。

AdminServer の設定

3.9.0の新機能: 次のオプションは、AdminServerの設定に使用されます。

3.7.1の新機能: 次のオプションは、AdminServerの設定に使用されます。

3.6.0の新機能: 次のオプションは、AdminServerの設定に使用されます。

3.5.0の新機能: 次のオプションは、AdminServerの設定に使用されます。

メトリクスプロバイダー

3.6.0の新機能: 次のオプションは、メトリクスの設定に使用されます。

デフォルトでは、ZooKeeperサーバーはAdminServerフォーレターワードインターフェースを使用して、便利なメトリクスを公開します。

3.6.0以降、お気に入りのシステムにメトリクスをエクスポートする異なるメトリクスプロバイダーを設定できます。

3.6.0以降、ZooKeeperバイナリパッケージにはPrometheus.ioとの統合が含まれています。

Netty フレームワークを使用した通信

NettyはNIOベースのクライアント/サーバー通信フレームワークであり、Javaアプリケーションのネットワークレベルの通信の多くの複雑さを(直接NIOを使用するよりも)簡素化します。さらに、Nettyフレームワークには、暗号化(SSL)と認証(証明書)の組み込みサポートがあります。これらはオプション機能であり、個別にオンまたはオフにできます。

バージョン3.5以降では、環境変数 **zookeeper.serverCnxnFactory** を **org.apache.zookeeper.server.NettyServerCnxnFactory** に設定することで、ZooKeeper サーバーはNIO(デフォルトオプション)の代わりにNettyを使用できます。クライアントの場合は、**zookeeper.clientCnxnSocket** を **org.apache.zookeeper.ClientCnxnSocketNetty** に設定します。

クォーラム TLS

3.5.5の新機能

Nettyフレームワークに基づいて、ZooKeeperアンサンブルは通信チャネルでTLS暗号化を使用するように設定できます。このセクションでは、クォーラム通信で暗号化を設定する方法について説明します。

クォーラムTLSは、リーダー選出とクォーラム通信プロトコルの両方のセキュリティをカプセル化することに注意してください。

  1. ローカル資格情報を格納するためのSSLキーストアJKSを作成します。

各ZKインスタンスに対して1つのキーストアを作成する必要があります。

この例では、自己署名証明書を生成し、秘密キーと共にkeystore.jksに格納します。これはテスト目的には適していますが、本番環境ではキーに署名するために正式な証明書が必要になる可能性があります。

エイリアス(-alias)と識別名(-dname)は、関連付けられているマシンのホスト名と一致する必要があることに注意してください。そうでない場合、ホスト名検証は機能しません。

keytool -genkeypair -alias $(hostname -f) -keyalg RSA -keysize 2048 -dname "cn=$(hostname -f)" -keypass password -keystore keystore.jks -storepass password
  1. キーストアから署名済みの公開キー(証明書)を抽出します。

この手順は、自己署名証明書の場合にのみ必要になる場合があります。

keytool -exportcert -alias $(hostname -f) -keystore keystore.jks -file $(hostname -f).cer -rfc
  1. すべてのZooKeeperインスタンスの証明書を含むSSLトラストストアJKSを作成します。

同じトラストストア(すべての承認済み証明書を格納)をアンサンブルの参加者間で共有する必要があります。複数の証明書を同じトラストストアに格納するには、異なるエイリアスを使用する必要があります。エイリアスの名前は関係ありません。

keytool -importcert -alias [host1..3] -file [host1..3].cer -keystore truststore.jks -storepass password
  1. SSLはNIOではサポートされていないため、serverCnxnFactoryとしてNettyServerCnxnFactoryを使用する必要があります。以下の設定をzoo.cfg設定ファイルに追加します。
sslQuorum=true
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
  1. ログでアンサンブルがTLSで実行されていることを確認します。
INFO  [main:QuorumPeer@1789] - Using TLS encrypted quorum communication
INFO  [main:QuorumPeer@1797] - Port unification disabled
...
INFO  [QuorumPeerListener:QuorumCnxManager$Listener@877] - Creating TLS-only quorum server socket

既存の非 TLS クラスタのダウンタイムなしのアップグレード

3.5.5の新機能

ポート統合機能を利用して、既に実行されているZooKeeperアンサンブルをダウンタイムなしでTLSにアップグレードするために必要な手順を次に示します。

  1. 前のセクションで説明されているように、すべてのZK参加者に対して必要なキーストアとトラストストアを作成します。

  2. 次の設定を追加し、最初のノードを再起動します。

sslQuorum=false
portUnification=true
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password

TLSはまだ有効になっていませんが、ポート統合を有効にします。

  1. 残りのノードで手順2を繰り返します。ログに次のエントリが表示されることを確認します。
INFO  [main:QuorumPeer@1791] - Using insecure (non-TLS) quorum communication
INFO  [main:QuorumPeer@1797] - Port unification enabled
...
INFO  [QuorumPeerListener:QuorumCnxManager$Listener@874] - Creating TLS-enabled quorum server socket

各ノードの再起動後、クォーラムが再び正常になることを二重に確認する必要があります。

  1. 各ノードでクォーラムTLSを有効にし、ローリング再起動を実行します。
sslQuorum=true
portUnification=true
  1. アンサンブル全体がTLSで実行されていることを確認したら、ポート統合を無効にして、別のローリング再起動を実行できます。
sslQuorum=true
portUnification=false

ZooKeeper コマンド

4文字ワード

ZooKeeperは、少数のコマンドに応答します。各コマンドは4文字で構成されます。クライアントポートでtelnetまたはncを介してZooKeeperにコマンドを発行します。

より興味深い3つのコマンド:「stat」はサーバーと接続されたクライアントに関する一般的な情報を提供し、「srvr」と「cons」はそれぞれサーバーと接続に関する詳細情報を提供します。

3.5.3の新機能:4文字コマンドを使用する前に、明示的にホワイトリストに登録する必要があります。詳細は、クラスタ設定セクションで説明されている4lw.commands.whitelistを参照してください。 今後は、4文字コマンドは非推奨となり、代わりにAdminServerを使用してください。

出力はJavaプロパティ形式と互換性があり、内容は時間の経過とともに変更される可能性があります(新しいキーが追加される)。スクリプトは変更を想定する必要があります。注意:キーの一部はプラットフォーム固有であり、キーの一部はリーダーのみがエクスポートします。出力には、次の形式の複数行が含まれています。

key \t value

ruokコマンドの例を次に示します。

$ echo ruok | nc 127.0.0.1 5111
    imok

AdminServer

3.5.0の新機能:AdminServerは、4文字コマンドにHTTPインターフェースを提供する埋め込みJettyサーバーです。デフォルトでは、サーバーはポート8080で起動され、URL "/commands/[command name]"にアクセスすることでコマンドが発行されます(例:http://localhost:8080/commands/stat)。コマンド応答はJSONとして返されます。元のプロトコルとは異なり、コマンドは4文字の名前に制限されず、コマンドは複数の名前を持つことができます。たとえば、「stmk」は「set_trace_mask」とも呼ばれます。使用可能なすべてのコマンドのリストを表示するには、ブラウザをURL /commands(例:http://localhost:8080/commands)にポイントします。ポートとURLの変更方法については、AdminServer設定オプションを参照してください。

AdminServerはデフォルトで有効になっていますが、次のいずれかの方法で無効にすることができます。

AdminServerが無効になっている場合でも、TCP 4文字コマンドインターフェースは引き続き使用できます。

SSL/TLSのAdminServerの設定
admin.portUnification=true
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
2019-08-03 15:44:55,213 [myid:] - INFO  [main:JettyAdminServer@123] - Successfully loaded private key from /data/software/cert/keystore.jks
2019-08-03 15:44:55,213 [myid:] - INFO  [main:JettyAdminServer@124] - Successfully loaded certificate authority from /data/software/cert/truststore.jks

2019-08-03 15:44:55,403 [myid:] - INFO  [main:JettyAdminServer@170] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands

使用可能なコマンドには、次のものがあります。

データファイル管理

ZooKeeperは、データをデータディレクトリに、トランザクションログをトランザクションログディレクトリに格納します。デフォルトでは、これら2つのディレクトリは同じです。サーバーは(そして、そうするべきです)、トランザクションログファイルをデータファイルとは別のディレクトリに格納するように構成できます。トランザクションログが専用のログデバイスに存在する場合、スループットが向上し、レイテンシが減少します。

データディレクトリ

このディレクトリには、2つまたは3つのファイルが含まれています。

各ZooKeeperサーバーには、固有のIDがあります。このIDは、myidファイルと設定ファイルの2つの場所で使用されます。myidファイルは、指定されたデータディレクトリに対応するサーバーを識別します。設定ファイルには、サーバーIDで識別された各サーバーの連絡先情報がリストされています。ZooKeeperサーバーインスタンスが起動すると、myidファイルからそのIDを読み取り、そのIDを使用して設定ファイルから読み取り、リスンするポートを調べます。

データディレクトリに格納されているsnapshotファイルは、ZooKeeperサーバーがスナップショットを取得している間にデータツリーへの更新が行われるため、ファジースナップショットです。snapshotファイル名のサフィックスは、スナップショット開始時の最後にコミットされたトランザクションのZooKeeperトランザクションIDであるzxidです。したがって、スナップショットには、スナップショット処理中に発生したデータツリーへの更新のサブセットが含まれています。そのため、スナップショットは実際に存在したデータツリーに対応していない可能性があり、このため、ファジースナップショットと呼んでいます。それでも、ZooKeeperは、更新のべき等性を利用するため、このスナップショットを使用して復旧できます。ファジースナップショットに対してトランザクションログを再生することにより、ZooKeeperはログの最終的なシステムの状態を取得します。

ログディレクトリ

ログディレクトリには、ZooKeeperトランザクションログが含まれています。更新が行われる前に、ZooKeeperは、更新を表すトランザクションが不揮発性ストレージに書き込まれていることを確認します。現在のログファイルに書き込まれたトランザクション数が(可変の)しきい値に達すると、新しいログファイルが開始されます。しきい値は、スナップショットの頻度にも影響を与える同じパラメーターを使用して計算されます(上記のsnapCountとsnapSizeLimitInKbを参照)。ログファイルのサフィックスはそのログに書き込まれた最初のzxidです。

ファイル管理

スナップショットファイルとログファイルの形式は、スタンドアロンのZooKeeperサーバーとレプリケートされたZooKeeperサーバーの異なる構成間で変更されません。したがって、これらのファイルを稼働中のレプリケートされたZooKeeperサーバーから、スタンドアロンのZooKeeperサーバーを持つ開発マシンにプルして、トラブルシューティングを行うことができます。

古いログファイルとスナップショットファイルを使用すると、ZooKeeperサーバーの以前の状態を確認し、その状態を復元することもできます。

ZooKeeperサーバーはスナップショットファイルとログファイルを作成しますが、削除することはありません。データファイルとログファイルの保持ポリシーは、ZooKeeperサーバーの外部で実装されます。サーバー自体は、最新の完全なファジースナップショット、それに続くすべてのログファイル、およびその前の最後のログファイルのみを必要とします。後者の要件は、このスナップショットの開始後に発生したが、その時点で既存のログファイルに書き込まれた更新を含めるために必要です。これは、スナップショットとログのロールオーバーがZooKeeperで多少独立して進むため可能です。ZooKeeperストレージの保持ポリシーとメンテナンスの設定の詳細については、このドキュメントのメンテナンスセクションを参照してください。

注記

これらのファイルに格納されているデータは暗号化されていません。ZooKeeperに機密データを格納する場合は、不正アクセスを防ぐために必要な対策を取る必要があります。そのような対策はZooKeeperの外部(例:ファイルへのアクセスの制御)であり、それが展開されている個々の設定に依存します。

リカバリ - TxnLogToolkit

詳細はこちらを参照してください。

避けるべきこと

ZooKeeperを正しく構成することで回避できる一般的な問題をいくつか紹介します。

ベストプラクティス

最適な結果を得るには、次のZookeeperのベストプラクティスに注意してください。

マルチテナントインストールについては、ZooKeeperの「chroot」サポートについて詳しく説明しているセクションを参照してください。これは、単一のZooKeeperクラスタとインターフェースする多くのアプリケーション/サービスを展開する場合に非常に役立ちます。