ZooKeeper学習


シーンの説明を適用する
現在、エンドウアジのCodisをRedisのクラスター配置案として試験しているが、Codis 2.0は現在、Zookeeperに依存して構成情報の保存と同期ツールとして使用されています.Zookeeperに触れる前に、いくつかのドキュメントと資料を見ただけで、多くの会社がデータの同期と管理を構成するミドルウェアとしてZookeeperを使用していることを知っています.
二Zookeeperの原理
ZooKeeperの公式によると、ZooKeeperは構成情報、ネーミングスペースを維持し、分散同期とパケットサービスを提供する中央サービス協調ツールである.
設計目標Design Goals
ZooKeeperは簡単です
ZooKeeperは、分散プログラムが互いに共有される標準ファイルシステムのような階層ネーミングスペースを介して調整することを可能にする.このネーミングスペースは複数のデータレジスタからなり、znodesとも呼ばれる.典型的なファイルシステムとは異なり、ZooKeeperのデータはメモリに保存され、ファイルシステムのデータはディスクに保存され、ZooKeeperはより高いスループットとより低い遅延を達成することができる.
ZooKeeperはコピーできます
ZooKeeperが調整した分散プログラムと同様に、ZooKeeper自体はホストのセット間でコピーできるように設計されています.ZooKeeperサービスを構成するサーバは、互いに互いを知らなければならない.ZooKeeperサービスステータスのメモリミラー、ログ、スナップショット情報をディスクに保存します.ほとんどのサーバが利用可能であれば、ZooKeeperサービスが利用可能です.
クライアントは単一のZooKeeperサーバに接続され、要求の送信、応答の取得、watchイベントの取得、および心拍数の送信のためのTCP接続を維持する.このTCP接続が切断されると、このクライアントは別の異なるサーバに接続されます.
ZooKeeperは秩序化されています
ZooKeeperは、すべてのトランザクションのシーケンス番号を反映するために、各更新を1つの数値でマークします.後続の操作では、同期の原因など、より高いレベルの抽象概念を実現するために、このシーケンス番号を使用することができます.
ZooKeeperは速い
ZooKeeperは,読み取り動作が主導的な応用においてより高速である.
データモデルと階層コマンド空間
ZooKeeperのネーミングスペースは標準的なファイルシステムに似ています.標準的なファイルシステムのように、ZooKeeperコマンド空間の各ノードとサブノードにデータを関連付けることはできません.znodeという用語を用いてZooKeeperのデータノードを表す
Conditional updates and watches
ZooKeeperはwatchesの概念をサポートしている.クライアントはznodeにwatchを設定できます.このznodeが変更されると、その上に設定されたwatchもトリガーされ、削除されます.
Guaranters
ZooKeeperはとても速くて簡単です.これらのより複雑なサービスを同期させるなどの基礎コンポーネントを設計することを目標としているため、一連の保証措置を提供しています.
Sequential Consistencyシリアル番号コンシステンシクライアントの更新は、送信される順序に従います.
Atomicity原子性は更新に失敗するか更新に成功するか
Single System ImageクライアントがどのZooKeeperサービスに接続して得られるデータも同じです
Reliabilityは、更新がコミットされると、更新が書き換えられるまで更新の状態を維持します.
 Timeliness   
3 ZooKeeperの導入と管理
1.依存ソフトウェア
ZooKeeperはJDK 1を必要とする.6以上は、ZooKeeperを別の機器に配備することが望ましい.
2.ZooKeeperクラスタの設定
信頼性の高いZooKeeperサービスを構築するためには、ZooKeeperクラスタ、ensembleコレクションとも呼ばれるものを配備する必要があります.コレクション内のほとんどのメンバーが利用可能であれば、ZooKeeperサービス全体が利用可能です.コレクション内のメンバー数は奇数でなければなりません.
wget 
tar zxvf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6
cp conf/zoo_sample.cfg  conf/zoo.cfg

zoo.cfgの内容は以下の通りです
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888

tickTime単一計時時間の長さ、ZooKeeperの基本時間単位、ミリ秒単位.通常のホップ検出とタイムアウトに使用
initLimitはfollowers接続とleaderへの同期を可能にし、ZooKeeperが管理するデータ量が比較的大きい場合はこの値を大きくします.
syncLimit followersがリーダーに同期できる時間の合計
DataDir ZooKeeper関連データ格納パスの指定
DataLogDirこのパラメータを設定すると、このパラメータが指定したディレクトリにログが格納されます.DataDirとDataLogDirを2つの異なるディスクに分離すると、ZooKeeperのパフォーマンスが大幅に向上します.したがって、ZooKeeperのミラーファイルとログファイルは別々に保存し、ログの書き込みがパフォーマンスに影響を与えないようにすることが望ましい.
ClientPortリスニングポートの指定
autopurge.snapRetainCount自動クリーンアップログを開く
autopurge.purgeIntervalログをクリーンアップする間隔(時間単位)
各集合メンバーにはIDがあり、このIDはそれぞれのdataDirディレクトリの下のmyidファイルに記録され、このファイルは手動で作成する必要があります.
echo "1">/tmp/zookeeper/myid
3.ZooKeeperモニタ
ZooKeeperを監視するには、ZooKeeper自身が提供する4文字のコマンドを使用してZooKeeperの様々な状態を表示する方法と、JMXを使用して表示する方法の2つがあります.
conf ZooKeeperの構成情報の表示
   echo conf|nc 127.0.0.1 2181
cons接続情報のリスト
   echo cons|nc 172.28.2.157 2181
crst接続/セッションデータのリセット
   echo crst|nc 172.28.2.157 2181
dumpには、比較的顕著なセッションとノードがリストされます.Leaderノードでのみ使用可能
Envi環境変数のリスト
ruokはサービスが正常に動作しているかどうかをテストし、imokに戻る場合は応答しません.
srstサーバ状態のリセット
Srvrは完全な詳細をリストします
# echo srvr|nc 127.0.0.1 2181
Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Latency min/avg/max: 0/0/0
Received: 1
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x300000025
Mode: leader
Node count: 17158

statは、サーバの詳細と接続されているクライアントをリストします.
wchsはwatchesの簡潔な情報をリストします
wchcはwatchesの詳細をリストします
wchpはwatchesの詳細をリストし、パスに基づいて表示します.このコマンドはパフォーマンスに影響を与える可能性がありますので、慎重に使用してください.
mntrはクラスタの監視状況をリストする
echo mntr|nc 127.0.0.1 2181
zk_version	3.4.6-1569965, built on 02/20/2014 09:09 GMT
zk_avg_latency	0
zk_max_latency	8
zk_min_latency	0
zk_packets_received	10464
zk_packets_sent	10464
zk_num_alive_connections	3
zk_outstanding_requests	0
zk_server_state	leader
zk_znode_count	17159
zk_watch_count	2
zk_ephemerals_count	1
zk_approximate_data_size	6666471
zk_open_file_descriptor_count	32
zk_max_file_descriptor_count	102400
zk_followers	2
zk_synced_followers	2
zk_pending_syncs	0

zk_followers,zk_synced_followers,zk_pending_syncsこれらはリーダーロールのみ表示されます
4.データファイルの管理
ZooKeeperはそのデータをデータディレクトリの下に、トランザクションログディレクトリの下に存在します.デフォルトではdataDirが指定したディレクトリに格納されます.実際の導入時にトランザクション・ログを別々に保存すると、ZooKeeperサービスのスループットが増加し、遅延が減少します.
# ls -lh /tmp/zookeeper/version-2/
total 20M
-rw-r--r-- 1 root root    1 Feb 23 21:36 acceptedEpoch
-rw-r--r-- 1 root root    1 Feb 23 21:36 currentEpoch
-rw-r--r-- 1 root root  65M Feb 18 17:39 log.1
-rw-r--r-- 1 root root  65M Feb 23 20:30 log.100000001
-rw-r--r-- 1 root root  65M Feb 21 17:20 log.1cfe
-rw-r--r-- 1 root root  65M Feb 25 15:33 log.300000001
-rw-r--r-- 1 root root  296 Feb 16 18:26 snapshot.0
-rw-r--r-- 1 root root 892K Feb 18 17:42 snapshot.1cfd
-rw-r--r-- 1 root root 5.4M Feb 23 15:29 snapshot.807d

各ZooKeeperサービスには一意のIDがあります.このIDはmyidファイルとプロファイルの2つの場所で使用されます.
myidファイルは、ローカルサービス側のIDをマークし、プロファイル内のIDは他のサーバ側に接続するために使用されます.
snapshot. ZooKeeperのファジイミラーファイルです
5.避けなければならないこと
ZooKeeperを導入する際には、次のような問題を回避する必要があります.
ZooKeeperホストリストが一致しません
各ZooKeeperホストのコンフィギュレーションファイルのクラスタホストのリストは一致するべきで、ZooKeeperクラスタに接続されているクライアント構成のホストリストページはZooKeeperホスト構成のリストと一致するべきである
ZooKeeperのトランザクション・ログの場所を間違えました
ZooKeeperのパフォーマンスに影響を与える最も重要な点は、トランザクション・ログです.ZooKeeperは、応答を返す前にトランザクションをディスクに同期します.トランザクション・ログを1つのディスクに個別に保存すると、ZooKeeperのパフォーマンスが大幅に向上します.トランザクション・ログを多忙なディスクに格納すると、パフォーマンスに顕著な影響を及ぼします.
Java Heapサイズ設定エラー
Java Heapサイズの設定に特に注目する必要があり、ZooKeeperサーバがSWAPを使用できない場合があります.DON'T SWAP
保守的な見積りでは、4 GBのメモリがあれば、JavaのHeapサイズを6 GBか4 GBに設定することはできません.オペレーティングシステムにはキャッシュとしてメモリが必要なため、最大3 GB程度に設定します.一番いいのは圧力テストをすることです.
四ZooKeeper開発関連
ZooKeeperのコラボレーションサービスを利用して分散アプリケーションを作成するには、以下の情報が必要です.
1.ZooKeeperのデータモデル
ZooKeeperには階層ドメイン名空間があります
2.Znodes
ZooKeeper階層ドメイン名空間ツリーの各ノードをznodeと呼ぶ.
3.Watches
クライアントはznodesでwatchesを設定できます.znodeに変更があるとwatchがトリガーされ、watchがクリーンアップされます.watchがトリガーされると、ZooKeeperはクライアントに通知を送信します.ZooKeeperのすべての読み取り操作でwatchを設定できます.ZooKeeperのwatchに関する定義は、1つのwatchイベントが使い捨てのトリガである.
リファレンスドキュメント
http://zookeeper.apache.org/
http://www.us.apache.org/dist/zookeeper/
http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html
http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html