Introduction to Distributed Systems - Distributed Systems ...
Tour of distributed systems 1 - ZooKeeper
-
Upload
chris-birchall -
Category
Documents
-
view
549 -
download
0
description
Transcript of Tour of distributed systems 1 - ZooKeeper
Apache ZooKeeper分散システムのツアー #1
Chris2014/7/1#m3dev
https://github.com/m3dev/distrib-systems-tour
Apache ZooKeeper
http://zookeeper.apache.org/
元Hadoop子プロジェクト
(Yahoo!発)
2008年(?)からApacheトップレベル
ZooKeeperとは
“ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.”
と言うと…?
ZooKeeper とは
ZKの用途・使い道を考える前、
まず基本機能を知っておくと良い
基本機能1:ツリー構造
ZKはファイルシステムっぽいツリー構造を提供する。
ただし「フォルダ」と「ファイル」を区別しない。どちらも「ZNode」と呼ぶ。
ZNodeはデータも入れ子も持てる。
基本機能1:ツリー構造
/ /hoge - data: “hello world” /hoge/foo - data: “I am a foo” /hoge/bar - data 無し
ZNodeデータについて
● 少量の想定(最大1MB)○ 大量のデータを持たせると性能が著しく落ちる
● バイナリデータ(byte[])○ ZKは中身を気にしない○ 文字列とかJSONが一般的
ZNodeデータ:バージョン管理
ZNodeのデータを変更すると、
バージョン番号がインクリメントされる。
バージョンを指定し条件付き操作ができる。
(Compare-and-swapやETagのイメージ)
“まだバージョン123であれば、
データをこれに更新してください”
基本機能2:ZNode監視
● ZNode作成・削除● ZNodeデータ変更● ZNodeの子ノードの作成・削除
のウォッチを登録できる
注意:一度通知を発行したらウォッチは消え、再登録が必要。
その際、イベントを見落とすかもしれない。
基本機能3:Ephemeral(短命)node
ZNodeを作成したクライアントのセッション終了時に自動化に消える、特殊なZNode
ZNode監視と組み合わせると便利:
1. クライアントAが短命Node /hoge を作成2. クライアントBがウォッチを登録3. クライアントAの突然の死!4. Nodeが消えて、Bさんに通知が飛ぶ
基本機能4:シーケンシャルZNode
一意のZnode名を保証する仕組み
“create sequential node /hoge/foo-”→ /hoge/foo-0000000000
“create sequential node /hoge/foo-”→ /hoge/foo-0000000001
短命+シーケンシャルなZNodeも作れる。
基本機能4:可用性
ZKを複数台のクラスタで運用できる。
(1台構成もアプリ組み込みでも可能)
書き込みはクォーラム(Ex:3台)にレプリケートしてからACKする。
(Split-brain問題を防ぐため
クォーラムをN/2以上にしなさい)
基本機能4:可用性
ZK1 ZK2 ZK4 ZK5ZK3
クライアント
WRITE ACK
ZooKeeperの使い道
以上の基本機能を使って何ができるか?
● 設定情報の一元管理● サービス登録・ディスカバリ● リーダー選挙● 分散ロック● バリアー● FIFOキュー
使い道:設定情報の一元管理
多数のマシンの設定管理は面倒。
ZKに入れれば一元管理できて便利。
アプリ アプリ アプリ アプリ アプリ アプリ
ZK
設定
使い道:サービス登録・ディスカバリ
Hogeサービス
Hogeサービス
アプリ
ZK
Hogeサービス
登録
”Hogeサービスをください”
使い道:サービス登録・ディスカバリ
サービス登録:
● 短命ノード /hogeServices/{id} を作成○ 短命だからインスタンスが落ちたら消える
● データ=サービスのIPアドレス、など
ディスカバリ:
● /hogeServices/ の子供一覧を取得● 利用するインスタンスを選ぶ
○ ラウンドロビン、など
使い道:リーダー選挙
Hogeサービス
Hogeサービス
ZK
Hogeサービス
リーダー
リソース
書き込み 読み込み only
使い道:リーダー選挙
リーダー立候補:
● 短命+シーケンシャルZNodeを作成○ /election/myId_000000N
● Nより小さいノードが○ 無い → やったー!自分がリーダー○ ある → 誰かが既にリーダー
■ そのZNodeをウォッチする■ 消えたら自分がリーダーになる
使い道:分散ロック
基本的にリーダー選挙と同じ仕組み
使い道:バリアー
バリアーをセット:
● ZNode /barrier を作成
バリアーをチェック:
● /barrier の有無をチェック○ 無い → 進んでOK○ ある → ウォッチを設定
■ ZNodeが削除されたら進んでOK
使い道:FIFOキュー
Consumer
Producer ZK
Producer
コンシューマが1個しかない想定
使い道:FIFOキュー
要素の追加:
● シーケンシャルZNodeを作成○ /queue/0000000N○ データ=要素自体
要素の取得・処理:
● /queue/ の子供一覧を取得● 名前昇順で処理する
○ 処理したらZNodeを削除
ZooKeeper インタフェース
● TCP(defaultポート=2181)● API
○ Java○ Ruby (zk gem)○ ...
● CLI ツール○ ZooKeeperのtarballに入っている
Apache Curator
http://curator.apache.org/
ZKの標準APIは正直、面倒くさい
Curatorは使い勝手の良いAPIでラップする
+よく使うレシピが実装してある
+いくつかの便利ユーティリティ
その他のおもしろプロジェクト
Ordasity● https://github.com/boundary/ordasity● クラスタでの自動ワーク分担
強い依存は要注意
http://engineering.pinterest.com/post/77933733851/zookeeper-resilience-at-pinterest
ZKをSPoFにするな!
Quick start (OS X)$ brew install zookeeper
$ zkServer start
$ zkCli
Connecting to localhost:2181Welcome to ZooKeeper!
[zk: localhost:2181(CONNECTED) 0] ls /[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /hoge "hello"Created /hoge
[zk: localhost:2181(CONNECTED) 2] get /hoge"hello"cZxid = 0x8ctime = Sun Jun 29 12:54:03 JST 2014...
ハンズオン!
https://github.com/m3dev/distrib-systems-tour
ひな形プロジェクト
● Skinny, Play1
アイデア
● 遅延タスク(メール配信とか)の管理● サービスディスカバリを使ってみる● バリアー+WebSocketsで何かを作る