autoindexほか hueにおけるkafka 活用事例...kafkaで困る部分...

25
AutoIndexほか HUEにおけるKafka 活用事例 (株) ワークスアプリケーションズ HUE&ATE Dept. 浅野 航平 1

Upload: others

Post on 30-Mar-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

AutoIndexほかHUEにおけるKafka

活用事例

(株) ワークスアプリケーションズHUE&ATE Dept. 浅野 航平

1

Page 2: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

1. Kafkaについて

2

Page 3: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

Kakfa概要

• OSSのメッセージキュー実装の一つ。 独自仕様・独自プロトコル (on TCP)

• Fast/Scalable/Durable/Distributed

• pub-sub/queuing両方をサポート

3

Page 4: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

• クライアント (APサーバー、バッチ計算ノード;Producer/Consumer)

• Brokerノード (この部分をKafkaクラスタと考える

• ZooKeeperノード

ノード構成

Producer Broker

Consumer ZooKeeper

4

Page 5: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

• メッセージ量が増大していっても、Brokerの数を増やせば(パーティション数など他の設計定数の範囲内で)処理能力を増やせる。

Scalability

Producer Broker

Consumer ZooKeeper

5

Page 6: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

メッセージの保証

• At-Least-Once:  必ずどれかで処理されるが、 重複がありうる

• At-Most-Once: 重複はないがロスするかもしれない

• Exactly-Once:  重複もロスもしない

一般に

6

Page 7: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

メッセージの保証Kafkaではconumer処理の書き方の協調が必要:

• At-Least-Once:  メッセージを受け取って、 処理が終わってからコミット

• At-Most-Once: メッセージを受け取りを コミットしてから処理

• Exactly-Once:  メッセージの処理とコミットを同時に

7

Page 8: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

2. AutoIndex

8

Page 9: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

新製品HUEのMW基盤Cassandraをメイン永続層に採用し、スケーラビリティと、マルチデータセンタ要件、耐障害性を確保。 Elasticsearchで全文検索能力の付与。 全てAWS上 (他クラウドもサポート予定)

9

Page 10: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

正規化するか否か?RDBであればクエリ時にジョインができるのだが、Cassandraにはジョインがない。 Elasticsearchに入れるデータはそもそも 非正規化しないと有意義なクエリができない。

非正規化データを基本とすると、更新時に複数の書き込みが発生してしまい、性能維持と整合性確保が困難に。

10

Page 11: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

AutoIndexCassandraには正規化データのみ登録 INSERTの際にメッセージをproduce 常時走るconsumerでメッセージを検知して非正規化データを常に更新

CassandraApplication

IndexGeneratorKafka

1: INSERT 2: produce

3: consume

4: INSERT (+Join先の取得)

11

Page 12: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

バリエーションCassandraApplication

IndexGeneratorKafka

1: INSERT 2: produce

3: consume

4: Join先の取得

Elasticsearch

5: INDEX

12

Page 13: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

Kafkaが向く理由高いスループット要求。

Cassandraの操作が基本的に冪等なので、At-Least-Onceモードが使える。

Cassandra側のスケールに合わせてKafkaもスケールできる。

13

Page 14: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

Kafkaで困る部分クラスタがデータセンタを跨げない クラスタ内の障害検知にハートビートをつかっていて、パケット遅延にシビア クラスタ内通信が平文・認証レス (0.9.0で解消) 順序の保証が必要なければ他プロトコルでクラスタ間を中継をして解決可能

14

Page 15: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

まとめAt-least-once保証で十分な応用であればscalabilityもあり、クラウド上でも使いやすい。

メッセージ順序保証の喪失を許容できれば、マルチデータセンタでも利用可能。

AutoIndexのように特性のマッチする問題で使うことが大切。

15

Page 16: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

Appendix

Page 17: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

メッセージのproduce

appendProducer

17

Page 18: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

メッセージのconsume

18

consumerconsumer

読み終わると、offsetが+1されるだけ。メッセージ自身は消えない。

Page 19: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

topic複数のキューのインスタンスがあって

それぞれに名前が付いている。

topic1 topic2 topic3

19

Page 20: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

topic複数のキューのインスタンスがあって

それぞれに名前が付いている。

topic1 topic2 topic3

pp

20

Page 21: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

topic複数のキューのインスタンスがあって

それぞれに名前が付いている。

topic1 topic2 topic3

pp

c

c

21

Page 22: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

partitiontopicを更に分割した単位に自動的に振り分け。同一partition内でしか順序が付かない。

出典: http://kafka.apache.org/documentation.html

22

Page 23: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

consumer group同じoffsetを共有するconsumerの集団。スレッド/プロセス/実行ノードなどは違うかもしれない。

c1

c2

c3

23

Page 24: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

queuing mode

c1

c2

c3

全consumerが同じgroupの場合、どれか一つがかならず受信する。

先着1名

24

Page 25: AutoIndexほか HUEにおけるKafka 活用事例...Kafkaで困る部分 クラスタがデータセンタを跨げない クラスタ内の障害検知に ハートビートをつかっていて、

pub-sub mode

c1

c2

c3

全consumerが異なるgroupの場合、全consumerがかならず受信する。

全員

25