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 は単一のマシンの障害しか処理できません。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 が奇数の場合は、アンサンブルは znode データを失うことなく最大 N/2 台のサーバー障害に耐えることができます。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のデータディレクトリには、特定のサービングアンサンブルによって保存されたznodeの永続的なコピーであるファイルが含まれています。これらは、スナップショットファイルとトランザクションログファイルです。znodeに変更が加えられると、これらの変更はトランザクションログに追加されます。ログが大きくなると、znodeの現在の状態のスナップショットがファイルシステムに書き込まれ、将来のトランザクションのために新しいトランザクションログファイルが作成されます。スナップショット作成中は、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サービングクラスタは非常に信頼性が高いため、サーバーがダウンしても、クラスタ全体はアクティブな状態を維持し、要求を処理します。さらに、クラスタは「自己修復」されるため、障害が発生したサーバーは、再起動すると、手動で操作することなく、自動的にアンサンブルに再参加します。

daemontoolsまたはSMFなどのスーパーバイザプロセスを使用すると(他のスーパーバイザプロセスのオプションも使用できます。どれを使用するかはユーザー次第です。これらは単なる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サーバーの動作をさらに微調整できます。一部は、Javaシステムプロパティ(一般的にzookeeper.keywordという形式)を使用して設定することもできます。利用可能な場合は、正確なシステムプロパティを以下に示します。

この機能は下位互換性と上位互換性があります。さまざまなシナリオを以下に示します。

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

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

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

クラスタオプション

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

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

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. NIOではSSLがサポートされていないため、NettyServerCnxnFactoryをserverCnxnFactoryとして使用する必要があります。以下の設定を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の新機能:**フォーレターワードを使用する前に、明示的にホワイトリストに登録する必要があります。詳細については、クラスター設定セクションで説明されている4lw.commands.whitelistを参照してください。今後、フォーレターワードは非推奨となり、代わりに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/[コマンド名]"にアクセスすることでコマンドが発行されます(例:http://localhost:8080/commands/stat)。コマンド応答はJSONとして返されます。元のプロトコルとは異なり、コマンドは4文字の名前に制限されず、コマンドは複数名を持つことができます。たとえば、「stmk」は「set_trace_mask」とも呼ばれます。使用可能なすべてのコマンドの一覧を表示するには、ブラウザをURL /commandsにポイントします(例:http://localhost:8080/commands)。ポートとURLの変更方法については、AdminServer構成オプションを参照してください。

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

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

使用可能なコマンドには以下が含まれます。

データファイル管理

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クラスタにインターフェースする多くのアプリケーション/サービスを展開する場合に非常に役立ちます。