Zookeeper-クイックガイド
ZooKeeperは、多数のホストを管理するための分散型調整サービスです。分散環境でのサービスの調整と管理は、複雑なプロセスです。ZooKeeperは、そのシンプルなアーキテクチャとAPIでこの問題を解決します。ZooKeeperを使用すると、開発者は、アプリケーションの分散性を気にすることなく、コアアプリケーションロジックに集中できます。
ZooKeeperフレームワークは、もともと「Yahoo!」で構築されました。簡単で堅牢な方法でアプリケーションにアクセスするため。その後、Apache ZooKeeperは、Hadoop、HBase、およびその他の分散フレームワークで使用される組織化されたサービスの標準になりました。たとえば、ApacheHBaseはZooKeeperを使用して分散データのステータスを追跡します。
先に進む前に、分散アプリケーションについて1つか2つのことを知っておくことが重要です。それでは、分散アプリケーションの概要から説明を始めましょう。
分散アプリケーション
分散アプリケーションは、特定のタスクを高速かつ効率的に完了するようにシステム間で調整することにより、ネットワーク内の複数のシステムで同時に(同時に)実行できます。通常、非分散アプリケーション(単一システムで実行)で完了するのに数時間かかる複雑で時間のかかるタスクは、関連するすべてのシステムのコンピューティング機能を使用して、分散アプリケーションで数分で実行できます。
より多くのシステムで実行するように分散アプリケーションを構成することにより、タスクを完了する時間をさらに短縮できます。分散アプリケーションが実行されているシステムのグループは、Cluster クラスターで実行されている各マシンは、 Node。
分散アプリケーションには2つの部分があります。 Server そして Client応用。サーバーアプリケーションは実際には分散されており、共通のインターフェイスを備えているため、クライアントはクラスター内の任意のサーバーに接続して同じ結果を得ることができます。クライアントアプリケーションは、分散アプリケーションと対話するためのツールです。
分散アプリケーションの利点
Reliability −単一または少数のシステムに障害が発生しても、システム全体に障害が発生するわけではありません。
Scalability −アプリケーションの構成をわずかに変更するだけで、ダウンタイムなしでマシンを追加することで、必要に応じてパフォーマンスを向上させることができます。
Transparency −システムの複雑さを隠し、それ自体を単一のエンティティ/アプリケーションとして表示します。
分散アプリケーションの課題
Race condition−特定のタスクを実行しようとしている2台以上のマシン。実際には、常に1台のマシンでのみ実行する必要があります。たとえば、共有リソースは、常に1台のマシンでのみ変更する必要があります。
Deadlock −互いに無期限に完了するのを待っている2つ以上の操作。
Inconsistency −データの部分的な障害。
Apache ZooKeeperの意味は何ですか?
Apache ZooKeeperは、クラスター(ノードのグループ)が相互に調整し、堅牢な同期技術を使用して共有データを維持するために使用するサービスです。ZooKeeperは、それ自体が分散アプリケーションを作成するためのサービスを提供する分散アプリケーションです。
ZooKeeperが提供する一般的なサービスは次のとおりです。
Naming service−クラスター内のノードを名前で識別します。DNSに似ていますが、ノード用です。
Configuration management −参加ノードのシステムの最新かつ最新の構成情報。
Cluster management −クラスター内のノードへの参加/離脱およびノードのステータスをリアルタイムで。
Leader election −調整の目的でノードをリーダーとして選出します。
Locking and synchronization service−データの変更中にデータをロックします。このメカニズムは、ApacheHBaseなどの他の分散アプリケーションに接続する際の自動障害回復に役立ちます。
Highly reliable data registry −1つまたはいくつかのノードがダウンしている場合でもデータの可用性。
分散アプリケーションには多くの利点がありますが、複雑で解読が難しいいくつかの課題もあります。ZooKeeperフレームワークは、すべての課題を克服するための完全なメカニズムを提供します。競合状態とデッドロックは、fail-safe synchronization approach。もう1つの主な欠点は、ZooKeeperが解決するデータの不整合です。atomicity。
ZooKeeperの利点
ZooKeeperを使用する利点は次のとおりです-
Simple distributed coordination process
Synchronization−サーバープロセス間の相互排除と協力。このプロセスは、構成管理のためのApacheHBaseで役立ちます。
Ordered Messages
Serialization−特定のルールに従ってデータをエンコードします。アプリケーションが一貫して実行されることを確認します。このアプローチをMapReduceで使用して、実行中のスレッドを実行するようにキューを調整できます。
Reliability
Atomicity −データ転送は成功または完全に失敗しますが、部分的なトランザクションはありません。
ZooKeeperの動作に深く入る前に、ZooKeeperの基本的な概念を見てみましょう。この章では、次のトピックについて説明します-
- Architecture
- 階層的な名前空間
- Session
- Watches
ZooKeeperのアーキテクチャ
次の図を見てください。これは、ZooKeeperの「クライアントサーバーアーキテクチャ」を表しています。
次の表では、ZooKeeperアーキテクチャの一部である各コンポーネントについて説明しました。
部 | 説明 |
---|---|
クライアント | 分散アプリケーションクラスターのノードの1つであるクライアントは、サーバーからの情報にアクセスします。特定の時間間隔で、すべてのクライアントがサーバーにメッセージを送信して、クライアントが生きていることをサーバーに通知します。 同様に、クライアントが接続すると、サーバーは確認応答を送信します。接続されたサーバーからの応答がない場合、クライアントはメッセージを別のサーバーに自動的にリダイレクトします。 |
サーバ | ZooKeeperアンサンブルのノードの1つであるサーバーは、すべてのサービスをクライアントに提供します。サーバーが稼働していることを通知するためにクライアントに確認応答を与えます。 |
アンサンブル | ZooKeeperサーバーのグループ。アンサンブルを形成するために必要なノードの最小数は3です。 |
盟主 | 接続されたノードのいずれかに障害が発生した場合に自動回復を実行するサーバーノード。リーダーはサービスの開始時に選出されます。 |
フォロワー | リーダーの指示に従うサーバーノード。 |
階層的な名前空間
次の図は、メモリ表現に使用されるZooKeeperファイルシステムのツリー構造を示しています。ZooKeeperノードはznode。すべてのznodeは名前で識別され、一連のパス(/)で区切られます。
この図では、最初にルートがあります znode「/」で区切ります。ルートの下には、2つの論理名前空間がありますconfig そして workers。
ザ・ config 名前空間は、一元化された構成管理と workers 名前空間は命名に使用されます。
下 config名前空間では、各znodeは最大1MBのデータを格納できます。これは、親znodeがデータも格納できることを除いて、UNIXファイルシステムに似ています。この構造の主な目的は、同期されたデータを格納し、znodeのメタデータを記述することです。この構造は次のように呼ばれますZooKeeper Data Model。
ZooKeeperデータモデルのすべてのznodeは、 stat構造。統計は単に提供しますmetadataznodeの。これは、バージョン番号、アクション制御リスト(ACL)、タイムスタンプ、およびデータ長で構成されます。
Version number−すべてのznodeにはバージョン番号があります。つまり、znodeに関連付けられたデータが変更されるたびに、対応するバージョン番号も増加します。複数のzookeeperクライアントが同じznodeで操作を実行しようとしている場合は、バージョン番号の使用が重要です。
Action Control List (ACL)− ACLは基本的に、znodeにアクセスするための認証メカニズムです。これは、すべてのznode読み取りおよび書き込み操作を管理します。
Timestamp−タイムスタンプは、znodeの作成と変更からの経過時間を表します。通常、ミリ秒単位で表されます。ZooKeeperは、「トランザクションID」(zxid)からznodeへのすべての変更を識別します。Zxid は一意であり、各トランザクションの時間を維持するため、あるリクエストから別のリクエストまでの経過時間を簡単に識別できます。
Data length−znodeに格納されているデータの合計量がデータ長です。最大1MBのデータを保存できます。
Znodeの種類
Znodeは、永続性、順次、および一時的なものとして分類されます。
Persistence znode−永続性znodeは、その特定のznodeを作成したクライアントが切断された後も存続します。デフォルトでは、特に指定がない限り、すべてのznodeは永続的です。
Ephemeral znode−エフェメラルznodeは、クライアントが稼働するまでアクティブです。クライアントがZooKeeperアンサンブルから切断されると、エフェメラルznodeは自動的に削除されます。このため、一時的なznodeのみがそれ以上子を持つことは許可されていません。エフェメラルznodeが削除されると、次の適切なノードがその位置を埋めます。一時的なznodeは、リーダー選出において重要な役割を果たします。
Sequential znode−シーケンシャルznodeは、永続的または一時的のいずれかになります。新しいznodeがシーケンシャルznodeとして作成されると、ZooKeeperは、元の名前に10桁のシーケンス番号を付加してznodeのパスを設定します。たとえば、パスを持つznodeの場合/myapp シーケンシャルznodeとして作成されると、ZooKeeperはパスをに変更します /myapp0000000001次のシーケンス番号を0000000002に設定します。2つの連続するznodeが同時に作成される場合、ZooKeeperは各znodeに同じ番号を使用することはありません。シーケンシャルznodeは、ロックと同期で重要な役割を果たします。
セッション
ZooKeeperの操作には、セッションが非常に重要です。セッション内の要求はFIFO順に実行されます。クライアントがサーバーに接続すると、セッションが確立され、session id クライアントに割り当てられます。
クライアントは送信します heartbeatsセッションを有効に保つために特定の時間間隔で。ZooKeeperアンサンブルは、サービスの開始時に指定された期間(セッションタイムアウト)を超えてクライアントからハートビートを受信しない場合、クライアントが停止したと判断します。
セッションタイムアウトは通常、ミリ秒単位で表されます。何らかの理由でセッションが終了すると、そのセッション中に作成されたエフェメラルznodeも削除されます。
時計
ウォッチは、クライアントがZooKeeperアンサンブルの変更に関する通知を受け取るためのシンプルなメカニズムです。クライアントは、特定のznodeを読み取りながらウォッチを設定できます。ウォッチは、(クライアントが登録する)znodeの変更について、登録されたクライアントに通知を送信します。
Znodeの変更は、znodeに関連付けられたデータの変更、またはznodeの子の変更です。ウォッチは1回だけトリガーされます。クライアントが再度通知を必要とする場合は、別の読み取り操作を介して行う必要があります。接続セッションの有効期限が切れると、クライアントはサーバーから切断され、関連するウォッチも削除されます。
ZooKeeperアンサンブルが開始されると、クライアントが接続するのを待ちます。クライアントは、ZooKeeperアンサンブルのノードの1つに接続します。リーダーノードまたはフォロワーノードの場合があります。クライアントが接続されると、ノードはセッションIDを特定のクライアントに割り当て、確認応答をクライアントに送信します。クライアントが確認応答を受け取らない場合、クライアントは単にZooKeeperアンサンブル内の別のノードに接続しようとします。ノードに接続されると、クライアントは定期的にノードにハートビートを送信して、接続が失われないようにします。
If a client wants to read a particular znode, それは送信します read requestznodeパスを持つノードに送信され、ノードは自身のデータベースから取得することにより、要求されたznodeを返します。このため、ZooKeeperアンサンブルでは読み取りが高速です。
If a client wants to store data in the ZooKeeper ensemble、znodeパスとデータをサーバーに送信します。接続されたサーバーは要求をリーダーに転送し、リーダーはすべてのフォロワーに書き込み要求を再発行します。大多数のノードのみが正常に応答した場合、書き込み要求は成功し、正常な戻りコードがクライアントに送信されます。そうしないと、書き込み要求は失敗します。ノードの厳密な大部分は次のように呼ばれますQuorum。
ZooKeeperアンサンブルのノード
ZooKeeperアンサンブルに異なる数のノードがある場合の影響を分析してみましょう。
私たちが持っている場合 a single nodeの場合、そのノードに障害が発生すると、ZooKeeperアンサンブルは失敗します。これは「単一障害点」の原因となるため、実稼働環境では推奨されません。
私たちが持っている場合 two nodes 2つのうち1つは過半数ではないため、1つのノードに障害が発生しても、過半数もありません。
私たちが持っている場合 three nodes1つのノードに障害が発生し、過半数を占めるため、これが最小要件です。ZooKeeperアンサンブルには、ライブ実稼働環境に少なくとも3つのノードが必要です。
私たちが持っている場合 four nodes2つのノードが失敗すると、再び失敗します。これは、3つのノードがあるのと似ています。追加のノードは目的を果たさないため、ノードを奇数で追加することをお勧めします(例:3、5、7)。
すべてのノードがデータベースに同じデータを書き込む必要があるため、ZooKeeperアンサンブルの読み取りプロセスよりも書き込みプロセスの方がコストがかかることがわかっています。したがって、バランスの取れた環境では、ノードの数を多くするよりも、ノードの数を少なくする(3、5、または7)方が適切です。
次の図はZooKeeperワークフローを示し、次の表はそのさまざまなコンポーネントを説明しています。
成分 | 説明 |
---|---|
書く | 書き込みプロセスはリーダーノードによって処理されます。リーダーは書き込み要求をすべてのznodeに転送し、znodeからの応答を待ちます。znodeの半分が応答する場合、書き込みプロセスは完了しています。 |
読んだ | 読み取りは、接続された特定のznodeによって内部的に実行されるため、クラスターと対話する必要はありません。 |
複製されたデータベース | zookeeperにデータを保存するために使用されます。各znodeには独自のデータベースがあり、すべてのznodeには、一貫性の助けを借りて常に同じデータがあります。 |
盟主 | リーダーは、書き込み要求の処理を担当するZnodeです。 |
フォロワー | フォロワーはクライアントから書き込み要求を受け取り、それらをリーダーznodeに転送します。 |
リクエストプロセッサ | リーダーノードにのみ存在します。フォロワーノードからの書き込み要求を管理します。 |
原子放送 | リーダーノードからフォロワーノードへの変更をブロードキャストする責任があります。 |
ZooKeeperアンサンブルでリーダーノードを選出する方法を分析してみましょう。あると考えてくださいNクラスター内のノードの数。リーダー選出のプロセスは次のとおりです-
すべてのノードは、同じパスを持つシーケンシャルなエフェメラルznodeを作成します。 /app/leader_election/guid_。
ZooKeeperアンサンブルは、パスに10桁のシーケンス番号を追加し、作成されるznodeは次のようになります。 /app/leader_election/guid_0000000001, /app/leader_election/guid_0000000002, 等
特定のインスタンスでは、znodeで最小の数を作成するノードがリーダーになり、他のすべてのノードはフォロワーになります。
各フォロワーノードは、次に小さい番号のznodeを監視します。たとえば、znodeを作成するノード/app/leader_election/guid_0000000008 znodeを監視します /app/leader_election/guid_0000000007 およびznodeを作成するノード /app/leader_election/guid_0000000007 znodeを監視します /app/leader_election/guid_0000000006.
リーダーがダウンした場合、対応するznode /app/leader_electionN 削除されます。
次のインラインフォロワーノードは、リーダーの削除に関する通知をウォッチャーから受け取ります。
次のインラインフォロワーノードは、最小数のznodeが他にあるかどうかを確認します。ない場合は、リーダーの役割を引き受けます。それ以外の場合は、最小数のznodeを作成したノードをリーダーとして検索します。
同様に、他のすべてのフォロワーノードは、最小数のznodeを作成したノードをリーダーとして選択します。
リーダー選出は、ゼロから行われる場合、複雑なプロセスです。しかし、ZooKeeperサービスはそれを非常に簡単にします。次の章では、開発目的でZooKeeperのインストールに移りましょう。
ZooKeeperをインストールする前に、システムが次のオペレーティングシステムのいずれかで実行されていることを確認してください-
Any of Linux OS−開発と展開をサポートします。デモアプリケーションに適しています。
Windows OS −開発のみをサポートします。
Mac OS −開発のみをサポートします。
ZooKeeperサーバーはJavaで作成され、JVMで実行されます。JDK6以降を使用する必要があります。
次に、以下の手順に従って、ZooKeeperフレームワークをマシンにインストールします。
ステップ1:Javaインストールの確認
システムにJava環境がすでにインストールされていると思われます。次のコマンドを使用して確認してください。
$ java -version
マシンにJavaがインストールされている場合は、インストールされているJavaのバージョンを確認できます。それ以外の場合は、以下の簡単な手順に従って、最新バージョンのJavaをインストールしてください。
ステップ1.1:JDKをダウンロードする
次のリンクにアクセスしてJDKの最新バージョンをダウンロードし、最新バージョンをダウンロードします。Java
最新バージョン(このチュートリアルの作成中)はJDK 8u 60で、ファイルは「jdk-8u60-linuxx64.tar.gz」です。お使いのマシンにファイルをダウンロードしてください。
ステップ1.2:ファイルを抽出する
通常、ファイルはにダウンロードされます downloadsフォルダ。それを確認し、次のコマンドを使用してtarセットアップを抽出します。
$ cd /go/to/download/path
$ tar -zxf jdk-8u60-linux-x64.gz
ステップ1.3:optディレクトリに移動する
すべてのユーザーがJavaを使用できるようにするには、抽出したJavaコンテンツを「/ usr / local / java」フォルダーに移動します。
$ su
password: (type password of root user)
$ mkdir /opt/jdk $ mv jdk-1.8.0_60 /opt/jdk/
ステップ1.4:パスを設定する
パス変数とJAVA_HOME変数を設定するには、次のコマンドを〜/ .bashrcファイルに追加します。
export JAVA_HOME = /usr/jdk/jdk-1.8.0_60
export PATH=$PATH:$JAVA_HOME/bin
次に、すべての変更を現在実行中のシステムに適用します。
$ source ~/.bashrc
ステップ1.5:Javaの代替
次のコマンドを使用して、Javaの代替を変更します。
update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_60/bin/java 100
ステップ1.6
検証コマンドを使用してJavaインストールを検証します (java -version) 手順1で説明します。
ステップ2:ZooKeeperフレームワークのインストール
ステップ2.1:ZooKeeperをダウンロードする
マシンにZooKeeperフレームワークをインストールするには、次のリンクにアクセスして、ZooKeeperの最新バージョンをダウンロードしてください。 http://zookeeper.apache.org/releases.html
現在、ZooKeeperの最新バージョンは3.4.6(ZooKeeper-3.4.6.tar.gz)です。
ステップ2.2:tarファイルを抽出する
次のコマンドを使用してtarファイルを抽出します-
$ cd opt/
$ tar -zxf zookeeper-3.4.6.tar.gz $ cd zookeeper-3.4.6
$ mkdir data
ステップ2.3:構成ファイルを作成する
名前の付いた構成ファイルを開きます conf/zoo.cfg コマンドを使用する vi conf/zoo.cfg および以下のすべてのパラメーターを開始点として設定します。
$ vi conf/zoo.cfg
tickTime = 2000
dataDir = /path/to/zookeeper/data
clientPort = 2181
initLimit = 5
syncLimit = 2
設定ファイルが正常に保存されたら、再び端末に戻ります。これで、zookeeperサーバーを起動できます。
ステップ2.4:ZooKeeperサーバーを起動します
次のコマンドを実行します-
$ bin/zkServer.sh start
このコマンドを実行すると、次のような応答が返されます。
$ JMX enabled by default
$ Using config: /Users/../zookeeper-3.4.6/bin/../conf/zoo.cfg $ Starting zookeeper ... STARTED
ステップ2.5:CLIを起動します
次のコマンドを入力します-
$ bin/zkCli.sh
上記のコマンドを入力すると、ZooKeeperサーバーに接続され、次の応答が返されます。
Connecting to localhost:2181
................
................
................
Welcome to ZooKeeper!
................
................
WATCHER::
WatchedEvent state:SyncConnected type: None path:null
[zk: localhost:2181(CONNECTED) 0]
ZooKeeperサーバーを停止します
サーバーに接続してすべての操作を実行した後、次のコマンドを使用してzookeeperサーバーを停止できます。
$ bin/zkServer.sh stop
ZooKeeperコマンドラインインターフェイス(CLI)は、開発目的でZooKeeperアンサンブルと対話するために使用されます。これは、さまざまなオプションのデバッグと回避に役立ちます。
ZooKeeper CLI操作を実行するには、最初にZooKeeperサーバー(「bin / zkServer.shstart」)をオンにしてから、ZooKeeperクライアント(「bin / zkCli.sh」)をオンにします。クライアントが起動したら、次の操作を実行できます-
- znodeを作成する
- データを取得する
- znodeの変更を監視する
- データを設定する
- znodeの子を作成する
- znodeの子を一覧表示します
- ステータスを確認する
- znodeの削除/削除
ここで、例を使用して上記のコマンドを1つずつ見ていきましょう。
Znodeを作成する
指定されたパスでznodeを作成します。ザ・flag引数は、作成されたznodeを一時的、永続的、または順次のいずれにするかを指定します。デフォルトでは、すべてのznodeは永続的です。
Ephemeral znodes (フラグ:e)セッションが期限切れになるか、クライアントが切断されると、自動的に削除されます。
Sequential znodes znodeパスが一意になることを保証します。
ZooKeeperアンサンブルは、シーケンス番号と10桁のパディングをznodeパスに追加します。たとえば、znodeパス/ myappは/ myapp0000000001に変換され、次のシーケンス番号は/ myapp0000000002になります。フラグが指定されていない場合、znodeは次のように見なされます。persistent。
構文
create /path /data
サンプル
create /FirstZnode “Myfirstzookeeper-app”
出力
[zk: localhost:2181(CONNECTED) 0] create /FirstZnode “Myfirstzookeeper-app”
Created /FirstZnode
を作成するには Sequential znode、 追加 -s flag 以下に示すように。
構文
create -s /path /data
サンプル
create -s /FirstZnode second-data
出力
[zk: localhost:2181(CONNECTED) 2] create -s /FirstZnode “second-data”
Created /FirstZnode0000000023
を作成するには Ephemeral Znode、 追加 -e flag 以下に示すように。
構文
create -e /path /data
サンプル
create -e /SecondZnode “Ephemeral-data”
出力
[zk: localhost:2181(CONNECTED) 2] create -e /SecondZnode “Ephemeral-data”
Created /SecondZnode
クライアント接続が失われると、一時的なznodeが削除されることに注意してください。ZooKeeper CLIを終了してから、CLIを再度開くことで試すことができます。
データを取得する
znodeの関連データと指定されたznodeのメタデータを返します。データが最後に変更された日時、変更された場所、データに関する情報などの情報が表示されます。このCLIは、データに関する通知を表示するウォッチを割り当てるためにも使用されます。
構文
get /path
サンプル
get /FirstZnode
出力
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode
“Myfirstzookeeper-app”
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 16:15:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 22
numChildren = 0
シーケンシャルznodeにアクセスするには、znodeのフルパスを入力する必要があります。
サンプル
get /FirstZnode0000000023
出力
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode0000000023
“Second-data”
cZxid = 0x80
ctime = Tue Sep 29 16:25:47 IST 2015
mZxid = 0x80
mtime = Tue Sep 29 16:25:47 IST 2015
pZxid = 0x80
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 0
見る
指定されたznodeまたはznodeの子データが変更されると、ウォッチに通知が表示されます。あなたは設定することができますwatch でのみ get コマンド。
構文
get /path [watch] 1
サンプル
get /FirstZnode 1
出力
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode 1
“Myfirstzookeeper-app”
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 16:15:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 22
numChildren = 0
出力は通常と同様です getコマンドですが、バックグラウンドでznodeの変更を待ちます。<ここから始めます>
データの設定
指定したznodeのデータを設定します。このセット操作が完了すると、を使用してデータを確認できます。get CLIコマンド。
構文
set /path /data
サンプル
set /SecondZnode Data-updated
出力
[zk: localhost:2181(CONNECTED) 1] get /SecondZnode “Data-updated”
cZxid = 0x82
ctime = Tue Sep 29 16:29:50 IST 2015
mZxid = 0x83
mtime = Tue Sep 29 16:29:50 IST 2015
pZxid = 0x82
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x15018b47db00000
dataLength = 14
numChildren = 0
割り当てた場合 watch のオプション get コマンド(前のコマンドと同様)の場合、出力は次のようになります-
出力
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Mysecondzookeeper-app”
WATCHER: :
WatchedEvent state:SyncConnected type:NodeDataChanged path:/FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x84
mtime = Tue Sep 29 17:14:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0
子の作成/サブznode
子の作成は、新しいznodeの作成に似ています。唯一の違いは、子znodeのパスにも親パスがあることです。
構文
create /parent/path/subnode/path /data
サンプル
create /FirstZnode/Child1 firstchildren
出力
[zk: localhost:2181(CONNECTED) 16] create /FirstZnode/Child1 “firstchildren”
created /FirstZnode/Child1
[zk: localhost:2181(CONNECTED) 17] create /FirstZnode/Child2 “secondchildren”
created /FirstZnode/Child2
子供をリストする
このコマンドは、 children znodeの。
構文
ls /path
サンプル
ls /MyFirstZnode
出力
[zk: localhost:2181(CONNECTED) 2] ls /MyFirstZnode
[mysecondsubnode, myfirstsubnode]
ステータスを確認する
Status指定されたznodeのメタデータを記述します。タイムスタンプ、バージョン番号、ACL、データ長、子znodeなどの詳細が含まれています。
構文
stat /path
サンプル
stat /FirstZnode
出力
[zk: localhost:2181(CONNECTED) 1] stat /FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 17:14:24 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0
Znodeを削除します
指定されたznodeとそのすべての子を再帰的に削除します。これは、そのようなznodeが使用可能な場合にのみ発生します。
構文
rmr /path
サンプル
rmr /FirstZnode
出力
[zk: localhost:2181(CONNECTED) 10] rmr /FirstZnode
[zk: localhost:2181(CONNECTED) 11] get /FirstZnode
Node does not exist: /FirstZnode
削除 (delete /path) コマンドはに似ています remove コマンド。ただし、子のないznodeでのみ機能するという事実を除きます。
ZooKeeperには、JavaおよびC用の公式APIバインディングがあります。ZooKeeperコミュニティは、ほとんどの言語(.NET、pythonなど)に非公式APIを提供します。ZooKeeper APIを使用すると、アプリケーションはZooKeeperアンサンブルに接続、相互作用、データの操作、調整を行い、最終的に切断することができます。
ZooKeeper APIには、ZooKeeperアンサンブルのすべての機能をシンプルかつ安全な方法で取得するための豊富な機能セットがあります。ZooKeeper APIは、同期メソッドと非同期メソッドの両方を提供します。
ZooKeeperアンサンブルとZooKeeperAPIは、あらゆる面で互いに完全に補完し合っており、開発者に大きなメリットをもたらします。この章では、Javaバインディングについて説明します。
ZooKeeperAPIの基本
ZooKeeperアンサンブルと相互作用するアプリケーションは、 ZooKeeper Client または単に Client。
ZnodeはZooKeeperアンサンブルのコアコンポーネントであり、ZooKeeper APIは、ZooKeeperアンサンブルでznodeのすべての詳細を操作するためのメソッドの小さなセットを提供します。
クライアントは、ZooKeeperアンサンブルと明確かつクリーンに対話するために、以下の手順に従う必要があります。
ZooKeeperアンサンブルに接続します。ZooKeeperアンサンブルは、クライアントにセッションIDを割り当てます。
ハートビートをサーバーに定期的に送信します。それ以外の場合、ZooKeeperアンサンブルはセッションIDの有効期限が切れ、クライアントは再接続する必要があります。
セッションIDがアクティブである限り、znodeを取得/設定します。
すべてのタスクが完了したら、ZooKeeperアンサンブルから切断します。クライアントが長時間非アクティブである場合、ZooKeeperアンサンブルは自動的にクライアントを切断します。
Javaバインディング
この章では、ZooKeeperAPIの最も重要なセットを理解しましょう。ZooKeeperAPIの中心的な部分はZooKeeper class。コンストラクターでZooKeeperアンサンブルを接続するオプションを提供し、次のメソッドがあります-
connect −ZooKeeperアンサンブルに接続します
create −znodeを作成します
exists −znodeが存在するかどうかとその情報を確認します
getData −特定のznodeからデータを取得する
setData −特定のznodeにデータを設定する
getChildren −特定のznodeで使用可能なすべてのサブノードを取得します
delete −特定のznodeとそのすべての子を取得する
close −接続を閉じる
ZooKeeperEnsembleに接続します
ZooKeeperクラスは、コンストラクターを介して接続機能を提供します。コンストラクターのシグネチャは次のとおりです-
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
どこ、
connectionString −ZooKeeperアンサンブルホスト。
sessionTimeout −ミリ秒単位のセッションタイムアウト。
watcher−「ウォッチャー」インターフェースを実装するオブジェクト。ZooKeeperアンサンブルは、ウォッチャーオブジェクトを介して接続ステータスを返します。
新しいヘルパークラスを作成しましょう ZooKeeperConnection メソッドを追加します connect。ザ・connect メソッドは、ZooKeeperオブジェクトを作成し、ZooKeeperアンサンブルに接続してから、オブジェクトを返します。
ここに CountDownLatch クライアントがZooKeeperアンサンブルに接続するまで、メインプロセスを停止(待機)するために使用されます。
ZooKeeperアンサンブルは、 Watcher callback。クライアントがZooKeeperアンサンブルに接続すると、Watcherコールバックが呼び出され、WatcherコールバックがcountDown の方法 CountDownLatch ロックを解除するには、 await メインプロセスで。
これは、ZooKeeperアンサンブルに接続するための完全なコードです。
コーディング:ZooKeeperConnection.java
// import java classes
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
// import zookeeper classes
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.KeeperException.Code;
import org.apache.zookeeper.data.Stat;
public class ZooKeeperConnection {
// declare zookeeper instance to access ZooKeeper ensemble
private ZooKeeper zoo;
final CountDownLatch connectedSignal = new CountDownLatch(1);
// Method to connect zookeeper ensemble.
public ZooKeeper connect(String host) throws IOException,InterruptedException {
zoo = new ZooKeeper(host,5000,new Watcher() {
public void process(WatchedEvent we) {
if (we.getState() == KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
});
connectedSignal.await();
return zoo;
}
// Method to disconnect from zookeeper server
public void close() throws InterruptedException {
zoo.close();
}
}
上記のコードを保存すると、次のセクションでZooKeeperアンサンブルを接続するために使用されます。
Znodeを作成する
ZooKeeperクラスは create methodZooKeeperアンサンブルに新しいznodeを作成します。の署名create 方法は次のとおりです-
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
どこ、
path−znodeパス。たとえば、/ myapp1、/ myapp2、/ myapp1 / mydata1、myapp2 / mydata1 / myanothersubdata
data −指定されたznodeパスに保存するデータ
acl−作成するノードのアクセス制御リスト。ZooKeeper APIは、静的インターフェースを提供しますZooDefs.Ids基本的なACLリストの一部を取得します。たとえば、ZooDefs.Ids.OPEN_ACL_UNSAFEは、開いているznodeのACLのリストを返します。
createMode−ノードのタイプ(エフェメラル、シーケンシャル、またはその両方)。これはenum。
新しいJavaアプリケーションを作成して、 createZooKeeperAPIの機能。ファイルを作成するZKCreate.java。mainメソッドで、タイプのオブジェクトを作成しますZooKeeperConnection と呼び出す connect ZooKeeperアンサンブルに接続する方法。
connectメソッドはZooKeeperオブジェクトを返します zk。さて、create の方法 zk カスタムのオブジェクト path そして data。
znodeを作成するための完全なプログラムコードは次のとおりです-
コーディング:ZKCreate.java
import java.io.IOException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
public class ZKCreate {
// create static instance for zookeeper class.
private static ZooKeeper zk;
// create static instance for ZooKeeperConnection class.
private static ZooKeeperConnection conn;
// Method to create znode in zookeeper ensemble
public static void create(String path, byte[] data) throws
KeeperException,InterruptedException {
zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
public static void main(String[] args) {
// znode path
String path = "/MyFirstZnode"; // Assign path to znode
// data in byte array
byte[] data = "My first zookeeper app”.getBytes(); // Declare data
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
create(path, data); // Create the data to the specified path
conn.close();
} catch (Exception e) {
System.out.println(e.getMessage()); //Catch error message
}
}
}
アプリケーションがコンパイルされて実行されると、指定されたデータを持つznodeがZooKeeperアンサンブルに作成されます。ZooKeeperCLIを使用して確認できますzkCli.sh。
cd /path/to/zookeeper
bin/zkCli.sh
>>> get /MyFirstZnode
存在する–Znodeの存在を確認します
ZooKeeperクラスは、 exists methodznodeの存在を確認します。指定されたznodeが存在する場合、znodeのメタデータを返します。の署名exists 方法は次のとおりです-
exists(String path, boolean watcher)
どこ、
path −znodeパス
watcher −指定したznodeを監視するかどうかを指定するブール値
ZooKeeperAPIの「存在する」機能を確認するための新しいJavaアプリケーションを作成しましょう。ファイル「ZKExists.java」を作成します。mainメソッドで、「ZooKeeperConnection」オブジェクトを使用してZooKeeperオブジェクト「zk」を作成します。次に、カスタム「パス」を使用して「zk」オブジェクトの「exists」メソッドを呼び出します。完全なリストは次のとおりです-
コーディング:ZKExists.java
import java.io.IOException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKExists {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to check existence of znode and its status, if znode is available.
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path, true);
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode"; // Assign znode to the specified path
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path); // Stat checks the path of the znode
if(stat != null) {
System.out.println("Node exists and the node version is " +
stat.getVersion());
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage()); // Catches error messages
}
}
}
アプリケーションをコンパイルして実行すると、次の出力が得られます。
Node exists and the node version is 1.
getDataメソッド
ZooKeeperクラスは getData指定されたznodeに添付されたデータとそのステータスを取得するメソッド。の署名getData 方法は次のとおりです-
getData(String path, Watcher watcher, Stat stat)
どこ、
path −znodeパス。
watcher −タイプのコールバック関数 Watcher。ZooKeeperアンサンブルは、指定されたznodeのデータが変更されると、Watcherコールバックを介して通知します。これは1回限りの通知です。
stat −znodeのメタデータを返します。
を理解するために新しいJavaアプリケーションを作成しましょう getDataZooKeeperAPIの機能。ファイルを作成するZKGetData.java。mainメソッドで、ZooKeeperオブジェクトを作成しますzk 彼を使って ZooKeeperConnectionオブジェクト。次に、getData カスタムパスを持つzkオブジェクトのメソッド。
これは、指定されたノードからデータを取得するための完全なプログラムコードです-
コーディング:ZKGetData.java
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKGetData {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path,true);
}
public static void main(String[] args) throws InterruptedException, KeeperException {
String path = "/MyFirstZnode";
final CountDownLatch connectedSignal = new CountDownLatch(1);
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path);
if(stat != null) {
byte[] b = zk.getData(path, new Watcher() {
public void process(WatchedEvent we) {
if (we.getType() == Event.EventType.None) {
switch(we.getState()) {
case Expired:
connectedSignal.countDown();
break;
}
} else {
String path = "/MyFirstZnode";
try {
byte[] bn = zk.getData(path,
false, null);
String data = new String(bn,
"UTF-8");
System.out.println(data);
connectedSignal.countDown();
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}, null);
String data = new String(b, "UTF-8");
System.out.println(data);
connectedSignal.await();
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
アプリケーションをコンパイルして実行すると、次の出力が得られます。
My first zookeeper app
そして、アプリケーションはZooKeeperアンサンブルからのさらなる通知を待ちます。ZooKeeper CLIを使用して、指定したznodeのデータを変更しますzkCli.sh。
cd /path/to/zookeeper
bin/zkCli.sh
>>> set /MyFirstZnode Hello
これで、アプリケーションは次の出力を出力して終了します。
Hello
setDataメソッド
ZooKeeperクラスは setData指定されたznodeに添付されたデータを変更するメソッド。の署名setData 方法は次のとおりです-
setData(String path, byte[] data, int version)
どこ、
path −znodeパス
data −指定されたznodeパスに保存するデータ。
version−znodeの現在のバージョン。ZooKeeperは、データが変更されるたびにznodeのバージョン番号を更新します。
ここで、新しいJavaアプリケーションを作成して理解してみましょう。 setDataZooKeeperAPIの機能。ファイルを作成するZKSetData.java。mainメソッドで、ZooKeeperオブジェクトを作成しますzk を使用して ZooKeeperConnectionオブジェクト。次に、setData の方法 zk 指定されたパス、新しいデータ、およびノードのバージョンを持つオブジェクト。
これは、指定されたznodeに添付されたデータを変更するための完全なプログラムコードです。
コード:ZKSetData.java
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import java.io.IOException;
public class ZKSetData {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to update the data in a znode. Similar to getData but without watcher.
public static void update(String path, byte[] data) throws
KeeperException,InterruptedException {
zk.setData(path, data, zk.exists(path,true).getVersion());
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path= "/MyFirstZnode";
byte[] data = "Success".getBytes(); //Assign data which is to be updated.
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
update(path, data); // Update znode data to the specified path
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
アプリケーションがコンパイルされて実行されると、指定されたznodeのデータが変更され、ZooKeeperCLIを使用して確認できます。 zkCli.sh。
cd /path/to/zookeeper
bin/zkCli.sh
>>> get /MyFirstZnode
getChildrenMethod
ZooKeeperクラスは getChildren特定のznodeのすべてのサブノードを取得するメソッド。の署名getChildren 方法は次のとおりです-
getChildren(String path, Watcher watcher)
どこ、
path −znodeパス。
watcher−タイプ「ウォッチャー」のコールバック機能。ZooKeeperアンサンブルは、指定されたznodeが削除されるか、znodeの下の子が作成/削除されると通知します。これは1回限りの通知です。
コーディング:ZKGetChildren.java
import java.io.IOException;
import java.util.*;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKGetChildren {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to check existence of znode and its status, if znode is available.
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path,true);
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode"; // Assign path to the znode
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path); // Stat checks the path
if(stat!= null) {
//“getChildren” method- get all the children of znode.It has two
args, path and watch
List <String> children = zk.getChildren(path, false);
for(int i = 0; i < children.size(); i++)
System.out.println(children.get(i)); //Print children's
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
プログラムを実行する前に、次の2つのサブノードを作成しましょう。 /MyFirstZnode ZooKeeper CLIを使用して、 zkCli.sh。
cd /path/to/zookeeper
bin/zkCli.sh
>>> create /MyFirstZnode/myfirstsubnode Hi
>>> create /MyFirstZnode/mysecondsubmode Hi
これで、プログラムをコンパイルして実行すると、上記で作成したznodeが出力されます。
myfirstsubnode
mysecondsubnode
Znodeを削除します
ZooKeeperクラスは delete指定されたznodeを削除するメソッド。の署名delete 方法は次のとおりです-
delete(String path, int version)
どこ、
path −znodeパス。
version −znodeの現在のバージョン。
を理解するために新しいJavaアプリケーションを作成しましょう deleteZooKeeperAPIの機能。ファイルを作成するZKDelete.java。mainメソッドで、ZooKeeperオブジェクトを作成しますzk を使用して ZooKeeperConnectionオブジェクト。次に、delete の方法 zk 指定されたオブジェクト path およびノードのバージョン。
znodeを削除するための完全なプログラムコードは次のとおりです-
コーディング:ZKDelete.java
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
public class ZKDelete {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to check existence of znode and its status, if znode is available.
public static void delete(String path) throws KeeperException,InterruptedException {
zk.delete(path,zk.exists(path,true).getVersion());
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode"; //Assign path to the znode
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
delete(path); //delete the node with the specified path
} catch(Exception e) {
System.out.println(e.getMessage()); // catches error messages
}
}
}
Zookeeperは、分散環境向けの柔軟な調整インフラストラクチャを提供します。ZooKeeperフレームワークは、今日の最高の産業用アプリケーションの多くをサポートしています。この章では、ZooKeeperの最も注目すべきアプリケーションのいくつかについて説明します。
Yahoo!
ZooKeeperフレームワークは、もともと「Yahoo!」で構築されました。適切に設計された分散アプリケーションは、データの透過性、パフォーマンスの向上、堅牢性、一元化された構成、調整などの要件を満たす必要があります。そこで、彼らはこれらの要件を満たすようにZooKeeperフレームワークを設計しました。
Apache Hadoop
Apache Hadoopは、ビッグデータ業界の成長の背後にある原動力です。Hadoopは、構成管理と調整をZooKeeperに依存しています。HadoopでのZooKeeperの役割を理解するためのシナリオを考えてみましょう。
と仮定します Hadoop cluster 橋 100 or more commodity servers。したがって、調整および命名サービスが必要です。多数のノードの計算が含まれるため、各ノードは互いに同期し、サービスにアクセスする場所を把握し、それらをどのように構成する必要があるかを把握する必要があります。この時点で、Hadoopクラスターにはクロスノードサービスが必要です。ZooKeeperは以下の機能を提供しますcross-node synchronization また、Hadoopプロジェクト全体のタスクがシリアル化および同期されるようにします。
複数のZooKeeperサーバーが大規模なHadoopクラスターをサポートします。各クライアントマシンは、ZooKeeperサーバーの1つと通信して、同期情報を取得および更新します。リアルタイムの例のいくつかは次のとおりです。
Human Genome Project−ヒトゲノムプロジェクトには、テラバイトのデータが含まれています。Hadoop MapReduceフレームワークを使用して、データセットを分析し、人間開発に関する興味深い事実を見つけることができます。
Healthcare −病院は、通常はテラバイト単位の膨大な数の患者の医療記録を保存、取得、分析できます。
Apache HBase
Apache HBaseは、大規模なデータセットのリアルタイムの読み取り/書き込みアクセスに使用されるオープンソースの分散型NoSQLデータベースであり、HDFS上で実行されます。HBaseが続きますmaster-slave architectureここで、HBaseマスターがすべてのスレーブを管理します。奴隷はRegion servers。
HBase分散アプリケーションのインストールは、実行中のZooKeeperクラスターに依存します。Apache HBaseは、ZooKeeperを使用して、マスターサーバーとリージョンサーバー全体に分散されたデータのステータスを追跡します。centralized configuration management そして distributed mutexメカニズム。HBaseのユースケースのいくつかを次に示します-
Telecom−電気通信業界は、数十億のモバイル通話記録(約30TB /月)を保存しており、これらの通話記録にリアルタイムでアクセスすることは大きな課題になります。HBaseを使用すると、すべてのレコードをリアルタイムで簡単かつ効率的に処理できます。
Social network−電気通信業界と同様に、Twitter、LinkedIn、Facebookなどのサイトは、ユーザーが作成した投稿を通じて大量のデータを受信します。HBaseを使用して、最近の傾向やその他の興味深い事実を見つけることができます。
Apache Solr
Apache Solrは、Javaで記述された高速のオープンソース検索プラットフォームです。これは、非常に高速で、障害に強い分散検索エンジンです。上に構築Lucene、それは高性能でフル機能のテキスト検索エンジンです。
Solrは、構成管理、リーダー選出、ノード管理、データのロックと同期など、ZooKeeperのすべての機能を幅広く使用しています。
Solrには2つの異なる部分があります。 indexing そして searching。インデックス作成は、後で検索できるようにデータを適切な形式で保存するプロセスです。Solrは、ZooKeeperを使用して、複数のノードのデータのインデックス作成と複数のノードからの検索の両方を行います。ZooKeeperは、次の機能を提供します-
必要に応じてノードを追加/削除
ノード間でのデータのレプリケーションとその後のデータ損失の最小化
複数のノード間でデータを共有し、その後、複数のノードから検索して検索結果を高速化する
Apache Solrのユースケースには、eコマースや求人検索などがあります。