tour of distributed systems 1 - zookeeper

29
Apache ZooKeeper 分散システムのツアー #1 Chris 2014/7/1 #m3dev https://github.com/m3dev/distrib-systems-tour

Upload: chris-birchall

Post on 28-Nov-2014

549 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Tour of distributed systems 1 - ZooKeeper

Apache ZooKeeper分散システムのツアー #1

Chris2014/7/1#m3dev

https://github.com/m3dev/distrib-systems-tour

Page 2: Tour of distributed systems 1 - ZooKeeper

Apache ZooKeeper

http://zookeeper.apache.org/

元Hadoop子プロジェクト

(Yahoo!発)

2008年(?)からApacheトップレベル

Page 3: Tour of distributed systems 1 - ZooKeeper

ZooKeeperとは

“ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.”

と言うと…?

Page 4: Tour of distributed systems 1 - ZooKeeper

ZooKeeper とは

ZKの用途・使い道を考える前、

まず基本機能を知っておくと良い

Page 5: Tour of distributed systems 1 - ZooKeeper

基本機能1:ツリー構造

ZKはファイルシステムっぽいツリー構造を提供する。

ただし「フォルダ」と「ファイル」を区別しない。どちらも「ZNode」と呼ぶ。

ZNodeはデータも入れ子も持てる。

Page 6: Tour of distributed systems 1 - ZooKeeper

基本機能1:ツリー構造

/ /hoge - data: “hello world” /hoge/foo - data: “I am a foo” /hoge/bar - data 無し

Page 7: Tour of distributed systems 1 - ZooKeeper

ZNodeデータについて

● 少量の想定(最大1MB)○ 大量のデータを持たせると性能が著しく落ちる

● バイナリデータ(byte[])○ ZKは中身を気にしない○ 文字列とかJSONが一般的

Page 8: Tour of distributed systems 1 - ZooKeeper

ZNodeデータ:バージョン管理

ZNodeのデータを変更すると、

バージョン番号がインクリメントされる。

バージョンを指定し条件付き操作ができる。

(Compare-and-swapやETagのイメージ)

“まだバージョン123であれば、

データをこれに更新してください”

Page 9: Tour of distributed systems 1 - ZooKeeper

基本機能2:ZNode監視

● ZNode作成・削除● ZNodeデータ変更● ZNodeの子ノードの作成・削除

のウォッチを登録できる

注意:一度通知を発行したらウォッチは消え、再登録が必要。

その際、イベントを見落とすかもしれない。

Page 10: Tour of distributed systems 1 - ZooKeeper

基本機能3:Ephemeral(短命)node

ZNodeを作成したクライアントのセッション終了時に自動化に消える、特殊なZNode

ZNode監視と組み合わせると便利:

1. クライアントAが短命Node /hoge を作成2. クライアントBがウォッチを登録3. クライアントAの突然の死!4. Nodeが消えて、Bさんに通知が飛ぶ

Page 11: Tour of distributed systems 1 - ZooKeeper

基本機能4:シーケンシャルZNode

一意のZnode名を保証する仕組み

“create sequential node /hoge/foo-”→ /hoge/foo-0000000000

“create sequential node /hoge/foo-”→ /hoge/foo-0000000001

短命+シーケンシャルなZNodeも作れる。

Page 12: Tour of distributed systems 1 - ZooKeeper

基本機能4:可用性

ZKを複数台のクラスタで運用できる。

(1台構成もアプリ組み込みでも可能)

書き込みはクォーラム(Ex:3台)にレプリケートしてからACKする。

(Split-brain問題を防ぐため

クォーラムをN/2以上にしなさい)

Page 13: Tour of distributed systems 1 - ZooKeeper

基本機能4:可用性

ZK1 ZK2 ZK4 ZK5ZK3

クライアント

WRITE ACK

Page 14: Tour of distributed systems 1 - ZooKeeper

ZooKeeperの使い道

以上の基本機能を使って何ができるか?

● 設定情報の一元管理● サービス登録・ディスカバリ● リーダー選挙● 分散ロック● バリアー● FIFOキュー

Page 15: Tour of distributed systems 1 - ZooKeeper

使い道:設定情報の一元管理

多数のマシンの設定管理は面倒。

ZKに入れれば一元管理できて便利。

アプリ アプリ アプリ アプリ アプリ アプリ

ZK

設定

Page 16: Tour of distributed systems 1 - ZooKeeper

使い道:サービス登録・ディスカバリ

Hogeサービス

Hogeサービス

アプリ

ZK

Hogeサービス

登録

”Hogeサービスをください”

Page 17: Tour of distributed systems 1 - ZooKeeper

使い道:サービス登録・ディスカバリ

サービス登録:

● 短命ノード /hogeServices/{id} を作成○ 短命だからインスタンスが落ちたら消える

● データ=サービスのIPアドレス、など

ディスカバリ:

● /hogeServices/ の子供一覧を取得● 利用するインスタンスを選ぶ

○ ラウンドロビン、など

Page 18: Tour of distributed systems 1 - ZooKeeper

使い道:リーダー選挙

Hogeサービス

Hogeサービス

ZK

Hogeサービス

リーダー

リソース

書き込み 読み込み only

Page 19: Tour of distributed systems 1 - ZooKeeper

使い道:リーダー選挙

リーダー立候補:

● 短命+シーケンシャルZNodeを作成○ /election/myId_000000N

● Nより小さいノードが○ 無い → やったー!自分がリーダー○ ある → 誰かが既にリーダー

■ そのZNodeをウォッチする■ 消えたら自分がリーダーになる

Page 20: Tour of distributed systems 1 - ZooKeeper

使い道:分散ロック

基本的にリーダー選挙と同じ仕組み

Page 21: Tour of distributed systems 1 - ZooKeeper

使い道:バリアー

バリアーをセット:

● ZNode /barrier を作成

バリアーをチェック:

● /barrier の有無をチェック○ 無い → 進んでOK○ ある → ウォッチを設定

■ ZNodeが削除されたら進んでOK

Page 22: Tour of distributed systems 1 - ZooKeeper

使い道:FIFOキュー

Consumer

Producer ZK

Producer

コンシューマが1個しかない想定

Page 23: Tour of distributed systems 1 - ZooKeeper

使い道:FIFOキュー

要素の追加:

● シーケンシャルZNodeを作成○ /queue/0000000N○ データ=要素自体

要素の取得・処理:

● /queue/ の子供一覧を取得● 名前昇順で処理する

○ 処理したらZNodeを削除

Page 24: Tour of distributed systems 1 - ZooKeeper

ZooKeeper インタフェース

● TCP(defaultポート=2181)● API

○ Java○ Ruby (zk gem)○ ...

● CLI ツール○ ZooKeeperのtarballに入っている

Page 25: Tour of distributed systems 1 - ZooKeeper

Apache Curator

http://curator.apache.org/

ZKの標準APIは正直、面倒くさい

Curatorは使い勝手の良いAPIでラップする

+よく使うレシピが実装してある

+いくつかの便利ユーティリティ

Page 26: Tour of distributed systems 1 - ZooKeeper

その他のおもしろプロジェクト

Ordasity● https://github.com/boundary/ordasity● クラスタでの自動ワーク分担

Page 28: Tour of distributed systems 1 - ZooKeeper

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...

Page 29: Tour of distributed systems 1 - ZooKeeper

ハンズオン!

https://github.com/m3dev/distrib-systems-tour

ひな形プロジェクト

● Skinny, Play1

アイデア

● 遅延タスク(メール配信とか)の管理● サービスディスカバリを使ってみる● バリアー+WebSocketsで何かを作る