Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OCI Streaming 技術詳細
Search
oracle4engineer
PRO
July 19, 2023
Technology
0
440
OCI Streaming 技術詳細
Oracle Infrastructure(OCI)のサービスの技術資料です。
oracle4engineer
PRO
July 19, 2023
Tweet
Share
More Decks by oracle4engineer
See All by oracle4engineer
津島博士のパフォーマンス講座「Oracle Partitioningの基本と最新情報」
oracle4engineer
PRO
1
110
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2.1k
Oracle Database 性能分析入門
oracle4engineer
PRO
2
240
[自動バックアップのコスト比較]リカバリ・サービス (RCV/ZRCV) とオブジェクト・ストレージ
oracle4engineer
PRO
1
250
Oracle Cloud Infrastructure:2024年4月度サービス・アップデート
oracle4engineer
PRO
1
230
シン・Kafka / shin-kafka
oracle4engineer
PRO
8
2.8k
Autonomous Database Cloud 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
14
35k
Oracleデータベースって何だ!?
oracle4engineer
PRO
4
310
Oracle Exadata Database Service on Cloud@Customer (ExaDB-C@C) - UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
1.1k
Other Decks in Technology
See All in Technology
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
4
600
地理空間データ可視化・解析・活用ソリューション Pacific Spatial Solutions (PSS)
pacificspatialsolutions
0
320
LLM開発・活用の舞台裏@2024.04.25
yushin_n
3
1k
AWSに詳しくない人でも始められるコスト最適化ガイド
yuhta28
2
270
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
320
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
220
競技としてのKaggle、役に立つKaggle
yu4u
6
2.2k
よく聞くけど使ったことないソフトウェアNo.1 KafkaとSnowflake
foursue
4
370
web-application-security
matsuihidetoshi
1
180
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
250
Python と Snowflake はズッ友だょ!~ Snowflake の Python 関連機能をふりかえる ~
__allllllllez__
2
130
Azure犬駆動開発の記録/GlobalAzureFukuoka2024_20240420
nina01
1
230
Featured
See All Featured
Web development in the modern age
philhawksworth
203
10k
The Pragmatic Product Professional
lauravandoore
26
5.8k
Product Roadmaps are Hard
iamctodd
45
9.7k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
242
1.2M
A Philosophy of Restraint
colly
197
16k
Visualization
eitanlees
137
14k
Designing for humans not robots
tammielis
248
25k
Facilitating Awesome Meetings
lara
43
5.6k
Six Lessons from altMBA
skipperchong
22
3k
Raft: Consensus for Rubyists
vanstee
133
6.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
25
2k
Fantastic passwords and where to find them - at NoRuKo
philnash
38
2.5k
Transcript
Oracle Cloud Infrastructure Streaming Service 技術詳細 日本オラクル株式会社 Jul. 2023 1
Streamingを利用するにあたって理解しておくべき概念とその詳細 • Stream : Partitionで区切られた、Messageの追加のみ可能なデータストア • Stream Pool : Streamをグループ化したもの
• Kafka Connect利用時にはこのStream Poolの設定値が必要(コンソールから確認可能) • Message : Base64エンコードされたデータ(KeyとValueで構成) • 1MBを超えるサイズのMessageは利用できない • Key : Messageをグルーピングするための識別子、同じKeyを持つMessageは同じPartitionに送られる Streamingの概念(Stream, Message, Key, Partition) 2 0 1 2 3 4 5 Partition0 0 1 2 3 4 Partition1 0 1 2 3 4 5 6 Partition2 Stream Messageの追加 (KeyによってPartitionに分配) Stream Pool Copyright © 2023, Oracle and/or its affiliates
Streamingを利用するにあたって理解しておくべき概念とその詳細 • Offset : Partition内でのMessageの識別子 • Offsetを保存しておくことで、そのOffsetから読み出しを再開できる • 0, 1,
2, 4, 5, 7 のように、必ずしも密にはならないため、「次のOffsetを算出して読み出しを再開」という処理は書けない • Cursor : SDKを利用する際にStreamからMassageを読み出す際のポインタ • Cursorは作成後5分経つと失効する • 失効するため、Cursorを保存しておいて障害からの回復に使うのは危険 • Partition : Streamの中の区切りであり、これにより並列なMessageの読み出しを実現できる • Partitionの名称は自動的に0,1,2,3,4,...と割り当てられる • Partitionの数量はStreamの作成時に指定(後から追加/削除はできない) Streamingの概念(Offset, Cursor) 3 0 1 2 4 5 7 Partition Stream Offset Cursor Copyright © 2023, Oracle and/or its affiliates
Producer : Messageを書き込む(Publish)役割 • 同じKeyのMessageは、同一のPartitionに配信される • Producerが明示的にどのPartitionに書き込むかを指定することはできない • Keyを指定することで、Partition内での配信順序を保持できる(first-in/first-out) •
Keyを指定しない(null)場合は、複数のPartitionに自動的に分散される Consumer : Messageを読み出す(Subscribe)役割 • Messageが作成された順に、Messageを読み出す • 複数のPartitionから読み出す場合は、Messageの順序は保証されない • どこまでMessageを読み出したかはOffsetを用いて判断 ProducerとConsumer – Streamingの周辺コンポーネント 4 0 1 2 0 1 0 Stream Producer 1 PutMessage API GetMessage API Producer 2 Producer 3 Consumer 1 Consumer 2 Consumer 3 Partition0 Partition1 Partition2 Key0 Value Key2 Value Key1 Value Key2 Value Key0 Value Copyright © 2023, Oracle and/or its affiliates
Streamの作成後、APIを利用しメッセージの書き込み(Produce)可能に • Streamの作成はOCIコンソールやAPIで行うことができる Messageの読み出し(Consume)のためには、Cursorを利用する • OffsetのポインターとなるCursorを、Partitionを指定して作成 • 作成したCursorを利用して、PartitionからMessageを読み出し • Cursorは都度生成せず、Message取得時に取得できるNextCursorを利用する
その他のProduce/Consume方法 • Kafka互換性APIの利用 • Kafka Connect構成を利用 • Kafka Connectと接続し、Object StorageやAutonomous DBとの接続が可能 MessageのProduceとConsume 5 Copyright © 2023, Oracle and/or its affiliates
• Cursorは5つの種類があり、作成時に対応するパラメータとともに指定 • TRIM_HORIZON: 全てのMessageを取得、パラメータ無し • AT_OFFSET: 特定のOffset以上のMessageを取得、パラメータはOffset • AFTER_OFFSET:
特定のOffsetより大きなMessageを取得、パラメータはOffset • AT_TIME: 指定した時間以降のMessageを取得、パラメータはTime • LATEST: Cursorの初回生成後に追加されたMessageを取得 • Cursor作成時の種類は、どのようにMessageを取得したいかで決める Cursorの詳細 Copyright © 2023, Oracle and/or its affiliates 6 Offset - 0 Timestamp – 00:00 Offset - 1 Timestamp – 00:01 Offset - 2 Timestamp – 00:02 Offset - 3 Timestamp – 00:03 TRIM_HORIZON AT_OFFSET(1) AFTER_OFFSET( 1) AT_TIME(00:0 3) ※Cursor 生成 Offset – 4 Timestamp – 00:04 LATEST
• 複数のConsumerでグループを構成 • GroupNameがGroupの識別子となり、Consumerの識別子はInstanceName • Group内のConsumerは、それぞれ単一のPartitionから読み出す • 同じGroup内の複数のConsumerが、同一のPartitionからMessageを読み出すことはできない • この仕組みが、並列かつPartitionの重複がないデータの読み出しを可能にする
Consumer Groupの概要 7 Consumer 1 Consumer 2 Consumer 3 Grp. A 0 1 2 0 1 0 Stream Partition0 Partition1 Partition2 Consumer 4 Consumer 5 Consumer 6 Grp. B Copyright © 2023, Oracle and/or its affiliates
Consumer Groupを使う際には、GroupCursorを利用する • GroupNameとInstanceNameを指定し、GroupCursorを取得する Consumer Groupの使い方 8 Consumer 1 Consumer
2 Grp. A 0 1 2 Stream 0 1 0 1 .groupName(“GroupA”) .instanceName(“Consumer1”) .groupName(“GroupA”) .instanceName(“Consumer2”) 取得したGroupCursorをそれぞれ利用 GroupCursorの種類は ・TRIM_HORIZON ・AT_TIME ・LATEST に限定される Copyright © 2023, Oracle and/or its affiliates
• Consumer Group内のアサイン(どのPartitionから読み出すか)は自動的に決まる • Consumer Groupにはリバランスという仕組みがある • インスタンスが追加された場合には、Consumerは読み出しの負荷を分散する • インスタンスがエラーなどで削除された場合、残ったConsumerで全てのPartitionから読み出すように動作
Consumer Groupの仕組み 9 Consumer 1 Consumer 2 0 1 2 Stream 0 1 2 0 0 1 Consumer3, Consumer4 の順番に追加 リバランスされる 追加後も待機状態に Consumer 1 Consumer 2 3 5 Stream 0 1 2 1 2 2 3 Consumer 3 Consumer 4 ※図はTRIM_HORIZONの場合の動作 3 5 6 Stream 0 1 2 1 2 3 4 6 Consumer 3 Consumer 4 Consumer 1 Consumer 2 3 5 Stream 0 1 2 1 2 2 3 Consumer 3 Consumer 4 Consumer1, Consumer2 を停止 停止したインスタンスが一度 読み出したOffsetをもう一 度読み出し、 リバランスさ れる (詳しくは次スライド) Copyright © 2023, Oracle and/or its affiliates
• Consumer Groupには、Messageを欠落させないための 仕組みであるCommitという概念がある • Commitを自動で行うCommitOnGet: Message取得時 に、最後に取得したMessageのOffsetをCommitする • Consumer
1が0-99のMessageを取得し、100-199の Message取得時に落ちた場合、99がCommitされる • 結果的に引き継ぐConsumer 2は、100からMessageを取得す るため、データロスしないことになる • CommitのタイミングはgetMessages API実行時 • 自動CommitをOffにすることも可能 Consumer GroupにおけるCommitの概念 Copyright © 2023, Oracle and/or its affiliates 10 Consumer 1 Consumer 2 0 … 99 Stream 0 301 … 400 1 0-99のMessageを取得後、 100- 199のMessageを取得しに行く Consumer 1 Consumer 2 0 … 99 100 … 199 Stream 0 1 301 … 400 401 … 500 停止 Partition0の読み出しを Consumer2が引き継ぐ Consumer 1 Consumer 2 0 … 99 100 … 199 200 … 299 Stream 0 301 … 400 401 … 500 501 … 600 1 返却されたNextCursorを利用して引き続 き501以降のMessageを読み出し 99がCommitされているので、100以降の読み出 しから引き継げる(データロスを防げる)
Consumerがエラーなどで停止した際、30秒経つとそのInstanceはConsumer Groupから除外される • プログラムの都合上、Consumerが30秒以上Messageを取得しない可能性がある場合には、 Heartbeat APIを利用してConsumer Groupから除外されないようにする • 一度停止したConsumerを再開したとしても、自動リバランスにより、停止する前と同様のPartitionから読み出すと は限らない
Consumer GroupにおけるConsumerのライフサイクル Copyright © 2023, Oracle and/or its affiliates 11 Consumer 1 Consumer 2 0 … 100 Stream 0 301 … 400 1 停止 30秒後 Consumer 3 Consumer 4 Heartbeat APIの実行 Consumer 2 0 … 100 Stream 0 301 … 400 1 Consumer 3 Consumer 4 Heartbeat APIの実行 Groupから除外されない Consumer1は Groupから除外され、 再度Groupに入ったと してもPartition0から 読み出すわけではない
None