Contenu connexe Similaire à Pulsar Handson 20180226 (20) Pulsar Handson 201802262. Japan Pulsar User Group
Japan Pulsar User Groupにご参加ください!
https://japan-pulsar-user-group.connpass.com/
4. 4
準備
資料: https://github.com/nkurihar/pulsar-handson
1. お使いのPCにdocker/docker-composeを導入してください:
• DockerComunityEdition: https://www.docker.com/community-edition
※OSが古いなどでDockerComunityEditionが使えない場合下記を導入してください:
• DockerToolBox: https://docs.docker.com/toolbox/overview/
• DockerCompose: https://docs.docker.com/compose/install/
2. apachepulsar/pulsarとapachepulsar/pulsar-dashboardをpullしておいてください:
3. nkurihar/pulsar-handson をcloneしておいてください(要git)
$ docker pull apachepulsar/pulsar
$ docker pull apachepulsar/pulsar-dashboard
$ git clone https://github.com/nkurihar/pulsar-handson.git
$ cd pulsar-handson
15. 15
代表的なメッセージキュー
• Kafka
• 2011年にLinkedInから公開
• 大量のデータを高速に処理する事を目指し設計
• ストリームデータの処理によく使用される
• RabbitMQ
• 2007年にRabbit Technologiesから公開
• 通信プロトコルにAMQPを採用
• どちらかと言えばパフォーマンスよりも信頼性を重視
• ActiveMQ
• 2004年から使用されている歴史あるプロダクト
• 様々なプロトコルをサポートし、多数の言語から利用可能なのが強み
17. 17
システム構成図 ■Broker
• クライアントとのメッセージの
やり取りを担当
■Bookie
• トピックに送信されたメッセージや
それに関連するデータを保存
■ZooKeeper
• トピックの管理に必要なメタ情報を
保存
• Local ZKはクラスタ内に閉じた
情報を担当
• Global ZKは全てのクラスタで
共有すべき情報を担当
Producer Consumer
Broker 1 Broker 2 Broker 3
Bookie
1
Local
ZooKeeper
Bookie
2
Bookie
3
Pulsar クラスタ
Global
ZooKeeper
18. 18
Apache BookKeeperとは?
• オープンソースの分散型ログストレージサービス
• データを複製し複数のノード(Bookie)に分散して保存 → 強い耐障害性
• ノード数を増やせば容量と速度の向上が可能 → スケーラブル
A
Bookie2 Bookie3
D
C
A
B
D
B
C
Bookie1
データの複製数は自由に変更可能
Apache BookKeeperはApache Software Foundationの
米国およびその他の国における登録商標または商標です。
19. 19
BookKeeperのアーキテクチャ
• 先行書き込みログ
• ストレージに対する「操作」を先に書き込む
• 永続化ストレージへの反映は後からバックグラウンドで
• 途中で電源が落ちても「操作」を再開可能
• 容量より速度を重視したいので高速なSSDを使用
• 永続化ストレージ
• メッセージを溜めておく
• 速度より容量を重視したいので大容量なHDDを使用
先行書き込みログで速度を担保
永続化ストレージで容量を担保
先行書き込みログ
(SSD)
永続化ストレージ
(HDD)
Bookie
書き込み
キャッシュ
先行読み込み
キャッシュ
Write
Read
21. 21
Pulsar導入の経緯
■背景
• Yahoo! JAPANには100程度のサービスが存在(ヤフオク、ショッピング、…)
• それぞれのサービスが個々にMQを構築すると
• 設備・運用コストが増大
• ナレッジが社内で分散
• 本来やりたいサービス開発に集中できない
→ サービス横断で利用可能な「社内プラットフォームとしてのMQ」を提供したい
■求められる要件
1. 高いパフォーマンス / スケーラビリティ
2. 堅牢なストレージ
3. 複数のサービスの同居(マルチテナント)
4. 複数のデータセンター間でのレプリケーション
→ Pulsarなら満たせる!
Producer Consumer
Producer Consumer
Producer Consumer
トピックA
トピックB
トピックC
サービスB
サービスC
サービスA
23. 23
利用の流れ
ProducerサービスA Consumer
Producer Consumer
Producer Consumer
Producer Consumer
トピックA
トピックB
トピックC
トピックD
サービスB
サービスC
サービスD
• マルチテナント: 複数の利用者が1つのPulsarインスタンスを共有
• 利用者がセルフサービスでトピックを作成
• 認証認可、割当リソースの設定も可能
• Yahoo! JAPANの社内では設定用の独自UIを提供している
各サービスが利用可能な
リソースを個別に設定可能:
BacklogSize 2GB,
RetentionTime 7days, …
他のサービスのトピックへの
アクセスは認証・認可機構で
ブロック利用者がセルフサービスで
トピックを作成
設定用UI
24. 24
利用事例1 - コンテンツ入稿プラットフォーム
• Yahoo! JAPANには外部のコンテンツプロバイダから様々なファイルが入稿される
• 入稿サーバへのファイル転送を検知したら入稿ログをPulsarに流す
• トピックを購読している各サービスがファイルを取得して処理する
Producer
Consumer
トピック
サービスA
Pulsar
コンテンツの入稿ログ
をPulsarに流す
ファイルを取得
Consumer
サービスB
Consumer
サービスC
入稿サーバ
コンテンツ
プロバイダ
天気情報、地図情報、
ニュース etc.
ログサーバ
25. 25
利用事例2 - Yahoo!メールの検索インデックス作成
• メールの検索インデックスの生成/修正といった時間のかかるジョブを非同期に
処理するために利用
• ProducerはPulsarにジョブをキューイング
• ConsumerはPulsarからジョブを取り出して順番に処理
Producer
Consumer
Producer
トピック
ジョブを処理する
ハンドラ
メールBEサーバ
メールBEサーバ
Pulsar
リクエスト
ジョブを登録
忙しい時やジョブが
失敗した時は再登録
ジョブを
取り出して処理
30. 30
メッセージの送受信
# Consumerを起動
$ bin/pulsar-client consume -s sub
persistent://sample/standalone/ns1/topic1
# Producerからメッセージを送信(別ターミナルで)
$ bin/pulsar-client produce -m ‘hoge,fuga,bar'
persistent://sample/standalone/ns1/topic1
# Consumerがメッセージを受信
----- got message -----
hoge
----- got message -----
fuga
----- got message -----
bar
31. 31
パフォーマンス測定ツールの実行
# Producer(終了するときはCtrl+C)
$ bin/pulsar-perf produce persistent://sample/standalone/ns1/topic1
<中略>
2018-02-16 10:43:51,830 - INFO - [main:PerformanceProducer@401] -
Throughput produced: 100.0 msg/s --- 0.8 Mbit/s ---
Latency: mean: 4.714 ms - med: 3.303 - 95pct: 4.563 - 99pct:
64.946 - 99.9pct: 153.931 - 99.99pct: 162.850 - Max: 162.850...
# Consumer(終了するときはCtrl+C)
$ bin/pulsar-perf consume persistent://sample/standalone/ns1/topic1
<中略>
2018-02-16 10:49:22,136 - INFO - [main:PerformanceConsumer@313] -
Throughput received: 99.926 msg/s -- 0.781 Mbit/s ---
Latency: mean: 7.856 ms - med: 8.000 - 95pct: 12.000 - 99pct: 13.000
- 99.9pct: 13.000 - 99.99pct: 13.000 - Max: 13.000
秒間メッセージ数
平均レイテンシ
35. 35
Pulsarのインターフェース
• クライアントライブラリはJava, C++, Pythonを提供
• 他の言語からもWebSocket APIを利用可能
• Producer/Consumerは次のようなトピックURIを指定してPulsarに接続
例: persistent://my-prop/standalone/my-ns/topic1
• さらにConsumerはサブスクリプションの名前を指定する必要がある
• 用途に応じて3種類のサブスクリプションモード(メッセージの配信方式)を選択可能
persistent://property/cluster/namespace/destination
サービス名など
データセンターなど
用途など
用途の詳細などメッセージを永続化
36. 36
プロパティ / ネームスペースの作成
# プロパティを作成
$ bin/pulsar-admin properties create -c standalone
-r 'my-role' my-prop
# 確認
$ bin/pulsar-admin properties get my-prop
# ネームスペースを作成
$ bin/pulsar-admin namespaces create my-
prop/standalone/my-ns
# 作成されたことを確認
$ bin/pulsar-admin namespaces list my-prop
37. 37
メッセージの送受信(今作ったネームスペースに対して)
# Consumerを起動
$ bin/pulsar-client consume -s sub
persistent://my-prop/standalone/my-ns/topic1
# Producerからメッセージを送信(別ターミナルで)
$ bin/pulsar-client produce -m ‘hoge,fuga,bar'
persistent://my-prop/standalone/my-ns/topic1
# Consumerがメッセージを受信
----- got message -----
hoge
----- got message -----
fuga
----- got message -----
bar
38. 38
Persistent / Non-persistent
Producer Consumer
Broker
Bookie
Producer Consumer
Broker
Bookie
永続化
Persistent:
• メッセージをBookieに保存する
• データの永続性を重視
Non-persistent:
• メッセージをBookieに保存しない
• データの配信速度を重視
persistent://prop/cluster/ns/dst non-persistent://prop/cluster/ns/dst
39. 39
メッセージの送受信(non-persistent)
# Consumerを起動
$ bin/pulsar-client consume -s sub non-persistent://my-
prop/standalone/my-ns/topic1
# Producerからメッセージを送信(別ターミナルで)
$ bin/pulsar-client produce -m ‘hoge,fuga,bar’ non-
persistent://my-prop/standalone/my-ns/topic1
# Consumerがメッセージを受信
----- got message -----
hoge
----- got message -----
fuga
----- got message -----
bar
42. 42
Exclusive
# Consumerを起動
$ bin/pulsar-client consume -s sub persistent://my-
prop/standalone/my-ns/topic1
# 同じサブスクリプション名でConsumerの起動しようとすると失敗
する(別ターミナルで)
$ bin/pulsar-client consume -s sub persistent://my-
prop/standalone/my-ns/topic1
ERROR Error while consuming messages
ERROR Exclusive consumer is already connected
…
43. 43
サブスクリプションタイプ2 - Shared
Producer Consumer
Consumer
Consumer
subscription
(Shared)
• 1つのサブスクリプションに複数のConsumerが接続可能
• メッセージは各Consumerに(ほぼ)ラウンドロビンで配信される
• 複数のConsumerで処理を分担させたい場合に有用
トピック
1 12 23 3
44. 44
Shared
# ConsumerをSharedで起動
$ bin/pulsar-client consume -s sub -t Shared -n 0
persistent://my-prop/standalone/my-ns/topic1
# 同じサブスクリプション名で別のConsumerを起動(別ターミナル
で)
$ bin/pulsar-client consume -s sub -t Shared -n 0
persistent://my-prop/standalone/my-ns/topic1
# Producerからメッセージを5個送信(別ターミナルで)
$ bin/pulsar-client produce -m 1,2,3,4,5
persistent://my-prop/standalone/my-ns/topic1
45. 45
サブスクリプションタイプ3 - Failover
Producer Consumer
Consumer
Consumer
• 複数のConsumerが接続可能だが、メッセージを受け取るのはその内1つだけ
• そのConsumerがダウンすると別のConsumerがメッセージを受け取るようになる
• アクティブ・スタンバイ構成を実現可能
subscription
(Failover)
トピック
1 12 23 3
46. 46
Failover
# ConsumerをFailoverで起動
$ bin/pulsar-client consume -s sub -t Failover -n 0
persistent://my-prop/standalone/my-ns/topic1
# 同じサブスクリプション名で別のConsumerを起動(別ターミナルで)
$ bin/pulsar-client consume -s sub -t Failover -n 0
persistent://my-prop/standalone/my-ns/topic1
# Producerからメッセージを5個送信(別ターミナルで)$ bin/pulsar-
client produce -m 1,2,3,4,5 persistent://my-
prop/standalone/my-ns/topic1
# メッセージを受信したConsumerの接続を切ってから再度送信
$ bin/pulsar-client produce -m 1,2,3,4,5 persistent://my-
prop/standalone/my-ns/topic1
48. 48
Backlog
Consumer8 7 6 5 4 3 2 1 1 Ack 12 Ack 2
Backlog
subscription-A
Cursor
• Ack(Acknowledgement)
• Consumerがメッセージの処理を終えたときにBrokerに返す応答
• Cursor
• どのメッセージのAckが返されたかの情報
• Backlog
• 1つ以上のサブスクリプションからまだAckが返されていないメッセージ
49. 49
Backlog – 実践
# Producerからメッセージを10個送信
$ bin/pulsar-client produce -m HelloPulsar -n 10 persistent://my-
prop/standalone/my-ns/topic1
# statsを確認(msgBacklog=10になっている)
$ bin/pulsar-admin persistent stats persistent://my-
prop/standalone/my-ns/topic1
…
"msgThroughputOut" : 0.0,
"msgRateRedeliver" : 0.0,
"msgBacklog" : 10,
# Backlogを消化
$ bin/pulsar-admin persistent skip-all -s sub persistent://my-
prop/standalone/my-ns/topic1
# statsを確認(msgBacklog=0になっている)
$ bin/pulsar-admin persistent stats persistent://my-
prop/standalone/my-ns/topic1
50. 50
Retention
Consumer8 7 6 5 4 3 2 1 1 Ack 12 Ack 2
Backlog Retention
subscription-A
Cursor
✓✓
• Retention
• 既にAckが返されたメッセージを(必要に応じて再送できるように)保存しておく機能
• retention size: 最大何Mバイトまで保存するか
• retention time: 最大何分まで保存するか
51. 51
Retetion – 実践
# Retentionを設定
$ bin/pulsar-admin namespaces set-retention -s 1M -t 1h my-
prop/standalone/my-ns
# 設定されたことを確認
$ bin/pulsar-admin namespaces get-retention my-prop/standalone/my-
ns
{
"retentionTimeInMinutes" : 60,
"retentionSizeInMB" : 1
}
# Cursorを戻す
$ bin/pulsar-admin persistent reset-cursor -s sub -t 1h
persistent://my-prop/standalone/my-ns/topic1
# statsを確認(msgBacklog=10に戻っている)
$ bin/pulsar-admin persistent stats persistent://my-
prop/standalone/my-ns/topic1
57. 57
補足1 : Globalなネームスペースの作成
# レプリケーション先のクラスタを指定
$ bin/pulsar-admin namespaces set-clusters -c
‘west,east' my-prop/global/my-ns
set-clustersコマンドでレプリケーション先を予め指定する必要がある
58. 58
補足2 : 選択的なレプリケーション
List<String> restrictReplicationTo = new ArrayList<>();
restrictReplicationTo.add("west");
restrictReplicationTo.add("east");
Messagemessage = MessageBuilder.create()
.setContent("my-message”.getBytes())
.setReplicationClusters(restrictReplicationTo)
.build();
producer.send(message);
メッセージごとにレプリケーション先を指定することも可能
61. 61
認証認可 – 実践
トピック
Producer Consumer
Consumer
user1のproduceと
consumeを許可
user1
Producer
role: user1 role: user1
role: user2 role: user2
# user1のproduce/consumeを許可
$ bin/pulsar-admin namespaces grant-permission --actions produce,consume
--role user1 my-prop/standalone/my-ns
63. まとめ
63
まとめ
• Pulsar
• Pub-Subメッセージングを採用したメッセージキュー
• 高速、スケーラブル、マルチテナント、ジオレプリケーション
• 公式ドキュメントはこちら:
• 英語 : https://pulsar.incubator.apache.org/docs/latest/getting-started/LocalCluster/
• 日本語 : https://pulsar.incubator.apache.org/ja/getting-started/LocalCluster/
• 質問やフィードバックはSlackまたはメーリングリストへ:
• https://apache-pulsar.slack.com/
• users@pulsar.incubator.apache.org
66. 66
// PulsarのURIを指定してクライアントを作成
PulsarClient client = PulsarClient.create(
"pulsar://broker.usw.example.com:6650");
// トピックを指定してProducerを作成
Producer producer = client.createProducer(
"persistent://my-property/us-west/my-namespace/my-topic");
// メッセージを送信
producer.send("my-message".getBytes());
Javaのサンプルコード - Producer
67. 67
PulsarClient client = PulsarClient.create(
"pulsar://broker.usw.example.com:6650");
// トピックとサブスクリプションを指定してConsumerを作成
Consumer consumer = client.subscribe(
"persistent://my-property/us-west/my-namespace/my-topic",
"my-subscription-name");
// メッセージを受信して画面に表示
Message msg = consumer.receive();
System.out.println(new String(msg.getData()));
// メッセージに対するACKを返信(キューからメッセージを削除)
consumer.acknowledge(msg);
Javaのサンプルコード - Consumer
68. 68
PulsarClient client = PulsarClient.create(
"pulsar://broker.usw.example.com:6650");
// Consumerの設定にサブスクリプションタイプを追加
ConsumerConfiguration conf = new ConsumerConfiguration();
conf.setSubscriptionType(SubscriptionType.Shared);
Consumer consumer = client.subscribe(
"persistent://my-property/us-west/my-namespace/my-topic",
"my-subscription-name", conf);
Javaのサンプルコード - サブスクリプションタイプの指定
Notes de l'éditeur それでは時間になりましたので、セミナーを開始したいと思います。
皆さま、本日はApache Pulsarハンズオンにお越しいただきありがとうございます。
私はヤフー株式会社システム統括本部プラットフォーム開発本部の栗原望と申します。
本日の司会進行と発表を務めさせて頂きます。よろしくお願いします。
本日の主催はJapan Pulsar User Groupになります。
今回が初めてのイベントになりますが、今後も定期的にイベントを行う予定ですので、よろしければグループへの登録をお願いします。 本日ハンズオンを手伝うスタッフです。
スタッフの方、ちょっと手を上げてもらってよいでしょうか。
セミナー中何かわからないことなどあればこのメンバーにお声がけください。 本日のハンズオンではDockerを利用します。
資料はgithubにあるので詳しくはこちらを参照してください。
お使いのPCでdockerとdocker-composeコマンドを予め導入しておいてください。
また、Dockerイメージのpullに多少時間がかかりますので、あらかじめお願いします。 本日ご紹介するApache Pulsarの概要です。 本日のハンズオンのゴールです。 もう少し詳しく説明します。
メッセージキューを使わなかったらどうなるか考えてみましょう。 ここまででMQがどんなものかが何となくはわかって頂けたかと思います。
しかし、Pulsarを理解して頂くためには、さらにPub-Subメッセージングと呼ばれる概念を知って頂く必要があります。
購読ができるConsumerは必ずしも1つとは限りません。
複数のConsumerがトピックを購読していれば、その全てにメッセージを届ける事ができます。 Pub-Subメッセージングをしない場合、1対1ならまだよいのですが、1対多や多対多になると組み合わせが大量になるため、複雑で管理が大変になってしまいます。 これがPub-Subメッセージングで、比較的大規模なシステム間を連携させるときの緩衝材の役割を果たします。 Pulsarのアーキテクチャの説明が終わった所で、次はYahoo! JAPANに置ける利用事例をご紹介したいと思います。 これがYahoo! JAPANでの構成例になります。
東西にデータセンターがあり、それぞれにPulsarのクラスタを構築しています。
GeoReplicationの機能があるので一拠点に流れてきたメッセージはもう一方の拠点にも流すことができます。
またPulsarのクライアントライブラリはJava/C++/Pythonがあるのですが、それ以外の言語から使う場合はWebSocketのProxyを叩いてもらっています。
更にBrokerのメトリクス情報はPrometheusに収集され、Grafanaで可視化しています。
これによりどのサービスがどれくらいPublishしているなどを見ることができます。 さきほどPulsarには3つのコンポーネントがあることを説明しました。
しかしちょっとした確認の際、すべてを起動するのは少し面倒です。
そのようなときのためにPulsarにはStandaloneというものが用意されています。
これはBroker/Bookie/Zookeeperが一つになったおためし版のコンポーネントです。
今からこれを起動してみましょう。 ※キューを1つに Pulsarにおける認証認可について説明します。
まずPulsarの管理者であるスーパーユーザーがプロパティを作成します。
プロパティにはその管理者であるadminRoleを設定します。
プロパティのadminRoleはその下にネームスペースを作成することができます。
またそれらの設定を変更することができます。
例えばproduce/consumeを許可するロールの設定や、Backlog/Retentionのサイズなどです。 実際にトピックに対してproduce/consumeを許可するロールを設定してみましょう。