Upgrade to Pro — share decks privately, control downloads, hide ads and more …

リソース・管理効率の向上だけでない、分散システムとしてのTiDBの魅力

Tech Leverages
March 04, 2025
54

 リソース・管理効率の向上だけでない、分散システムとしてのTiDBの魅力

Tech Leverages

March 04, 2025
Tweet

More Decks by Tech Leverages

Transcript

  1. | © 2024 Levtech Co., Ltd. 2 レバテック開発部 前原 宗太朗 SOTARO

    MAEHARA 2022年6月入社 レバテック開発部ビジネスサポートグループ バックエンドエンジニア 出身: 鹿児島 言語: C++/Go/Python/TypeScript/PHP/Rust 趣味: League of Legends adcメインのp3
  2. | © 2024 Levtech Co., Ltd. 3 MySQL互換を謳うオープンソースのNew SQLデータベース 特徴 •

    99.99%の可用性と耐障害性 • 書き込みを含めた水平方向の拡張性 • トランザクション・分析クエリの両方をサポートするHTAP構成の実現 TiDBとは
  3. | © 2024 Levtech Co., Ltd. 4 ❌ 話さないこと • レバテックがなぜTiDBを導入したのか

    ◦ 導入背景については「TiDB User Day 2024」にて発表されています ◦ 内容をざっくりまとめると、マイクロサービス化によって増えたDBクラスターを 効率的に管理するためにTiDBの導入したというお話 ◦ 運用の管理負荷の軽減とリソースの効率化について特に触れられている 今日話すこと・話さないこと
  4. | © 2024 Levtech Co., Ltd. 5 🟢 話すこと 1. TiDBがいかにして高可用性と耐障害性を実現しているのか

    2. どうやって書き込みのスケーラビリティを実現しているか TiDBの魅力はリソース効率の向上や管理負荷の軽減の向上だけではない • TiDBを支える裏側の仕組みには技術的な面白さがある • 書き込み負荷の高いワークロードへの対応やトランザクション・分析クエリの両立な ど、他の魅力も多く存在する この発表を通して少しでもTiDBに興味を持ってもらうのが目的 今日話すこと・話さないこと
  5. | © 2024 Levtech Co., Ltd. 7 TiDBのアーキテクチャの外観 Storage Cluster TiDB

    Cluster TiDB TiDB TiDB TiKV TiKV TiKV PD Cluster Placement Driver Placement Driver Placement Driver TiKV TiKV TiKV TiKV TiKV TiKV
  6. | © 2024 Levtech Co., Ltd. 8 Storage Cluster TiDB Cluster

    TiDBのアーキテクチャの外観 TiDB TiDB TiDB TiKV TiKV TiKV PD Cluster Placement Driver Placement Driver Placement Driver TiKV TiKV TiKV TiKV TiKV TiKV PD Cluster Placement Driver Placement Driver Placement Driver メタデータ管理のコンポーネント 様々な管理や制御を行い、クラスター全体の「頭脳」の役割を果たす
  7. | © 2024 Levtech Co., Ltd. 9 Storage Cluster TiDBのアーキテクチャの外観 TiDB

    Cluster TiDB TiDB TiDB TiKV TiKV TiKV PD Cluster Placement Driver Placement Driver Placement Driver TiKV TiKV TiKV TiKV TiKV TiKV TiDB Cluster TiDB TiDB TiDB ステートレスなSQLレイヤー クエリの解析や最適化、実行などを行う
  8. | © 2024 Levtech Co., Ltd. 10 TiDB Cluster TiDBのアーキテクチャの外観 TiDB

    TiDB TiDB PD Cluster Placement Driver Placement Driver Placement Driver Storage Cluster TiKV TiKV TiKV TiKV TiKV TiKV TiKV TiKV TiKV Storage Cluster TiKV TiKV TiKV TiKV TiKV TiKV TiKV TiKV TiKV データの保存を担当 複数のノードにデータを分散させ、自動でデータの同期を行う 今日話すのは主にデータ分散と同期の部分
  9. | © 2024 Levtech Co., Ltd. 11 TiDBの特徴の1つとして99.99%の可用性と耐障害性 しかし、99.99%の可用性と言われても。。。ピンとはこない 世はまさに大クラウド時代 多くのケースではクラウドプロバイダーが可用性を保証してくれるし、ミッションクリティ

    カルなシステムでない限り、そこまで意識することは少ないかも クラウドが普及する前はどのようにして可用性をあげていた? TiDBがいかにして高可用性と耐障害性を実現しているのか
  10. | © 2024 Levtech Co., Ltd. 16 耐障害性 • 非同期レプリケーションになるため、マスターのコミット ≠

    スレーブへの適用が保証 されるわけではない • 障害時にスレーブが最新データを保持していない可能性がある ダウンタイム • スレーブ昇格時に数十秒のダウンタイム発生 運用負荷 • 構成によっては手動でフェールオーバーが必要 問題点
  11. | © 2024 Levtech Co., Ltd. 17 1. データを複数のノードに分散させる ◦ データを分散させることで単一障害点をなくす

    2. ノード間でデータを安全に同期的に複製させる ◦ 非同期ではタイミングによって、失われるデータが存在する 3. 障害時に自動で素早く安全にリカバリーする ◦ ダウンタイムを最小限に抑えつつ、データの一貫性も保証する これらを実現するために分散合意アルゴリズムが使われる 可用性や耐障害性を向上させるための3つのポイント ☝ 分散合意アルゴリズムはKuberneteの裏側でも使われているよ
  12. | © 2024 Levtech Co., Ltd. 18 複数のノード間で一貫性のあるステートマシンを提供するためのアルゴリズム 代表的なものにPaxosとRaftがある すべてのノードが同じログを適用すれば、必ず同じ状態になると仮定している ⇨

    State Machine Replication 分散合意アルゴリズム ノード A { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 ノード B { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 適用 適用 ☝ Paxosは難しいと言われており、シンプルを売りにしているのがRaft。現在はRaftが主流。
  13. | © 2024 Levtech Co., Ltd. 19 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる これにより、過半数のノードさえ生きていれば、システムはデータの一貫性を保ちながら運 用を続行できる いかにして高可用性と耐障害性を実現しているのか
  14. | © 2024 Levtech Co., Ltd. 20 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる これにより、過半数のノードさえ生きていれば、システムはデータの一貫性を保ちながら運 用を続行できる いかにして高可用性と耐障害性を実現しているのか 日本語でおk
  15. | © 2024 Levtech Co., Ltd. 21 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる いかにして高可用性と耐障害性を実現しているのか
  16. | © 2024 Levtech Co., Ltd. 22 すべてのノードが同じログを適用すれば、必ず同じ状態になると仮定している 一元管理されたログを配布する ノード A

    { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 ノード B { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 適用 適用
  17. | © 2024 Levtech Co., Ltd. 23 すべてのノードが同じログを適用すれば、必ず同じ状態になると仮定している 一元管理されたログを配布する ノード A

    { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 ノード B { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 適用 適用 これの順番を決めるノード が必要
  18. | © 2024 Levtech Co., Ltd. 24 ノードをリーダーとフォロワーに分けて、リーダーがログの順序を決定する フォロワーは順番通りにログを適用する 一元管理されたログを配布する リーダー

    { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 フォロワー { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 適用 適用 これ通りに適用してな〜 りょ
  19. | © 2024 Levtech Co., Ltd. 25 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる いかにして高可用性と耐障害性を実現しているのか
  20. | © 2024 Levtech Co., Ltd. 26 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる いかにして高可用性と耐障害性を実現しているのか
  21. | © 2024 Levtech Co., Ltd. 27 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる いかにして高可用性と耐障害性を実現しているのか
  22. | © 2024 Levtech Co., Ltd. 28 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる ⇨ 過半数のノードが最新のログを持つことが保証するために、過半数が合意したログのみを 確定とする いかにして高可用性と耐障害性を実現しているのか
  23. | © 2024 Levtech Co., Ltd. 29 ステートマシンを同期する流れ リーダー 2つのストレージを用いる raft

    • ログを保存する役割 • 命令とデータのセット kv • 状態を保存する役割 raft kv フォロワー raft kv フォロワー raft kv { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga }
  24. | © 2024 Levtech Co., Ltd. 30 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv フォロワー raft kv フォロワー raft kv
  25. | © 2024 Levtech Co., Ltd. 31 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv { PUT Key = 1, name = hoge } フォロワー raft kv フォロワー raft kv 1-1 クライアントから のリクエスト 1-2 エントリーログの作成
  26. | © 2024 Levtech Co., Ltd. 32 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv { PUT Key = 1, name = hoge } フォロワー raft kv フォロワー raft kv 2 ログをフォロワーに送信
  27. | © 2024 Levtech Co., Ltd. 33 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } 3-1 ログを自身のノード に保存 3-2 自身の状態と比較して 問題なければOKを返す
  28. | © 2024 Levtech Co., Ltd. 34 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } 4 過半数から合意を得たらログを 確定(コミット)させ適用の指示 を送る
  29. | © 2024 Levtech Co., Ltd. 35 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } { Key = 1, name = hoge } { Key = 1, name = hoge } { Key = 1, name = hoge } 5-1 適用の指示後に自身のKV に状態を反映 5-2 適用の指示を受け取ると 自身のKVに状態を反映
  30. | © 2024 Levtech Co., Ltd. 36 ステートマシンを同期する流れ リーダー 具体的な流れ 1.

    リーダーがエントリーログの作成 2. リーダーがログをフォロワーへ送信 3. フォロワーがログの保存と検証、合意 4. リーダーがログをコミットし適用の指示 5. リーダー、フォロワーがログを適用 raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } フォロワー raft kv { PUT Key = 1, name = hoge } { Key = 1, name = hoge } { Key = 1, name = hoge } { Key = 1, name = hoge } 過半数ノードが最新のログを持って いることが保証される
  31. | © 2024 Levtech Co., Ltd. 37 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる いかにして高可用性と耐障害性を実現しているのか
  32. | © 2024 Levtech Co., Ltd. 38 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる いかにして高可用性と耐障害性を実現しているのか
  33. | © 2024 Levtech Co., Ltd. 39 1. 一元管理されたログを配布することで、すべてのノードを同じ状態にすることができる a. ログを一元管理するリーダーを選出し、リーダーがログの順序を決定する

    2. リーダーが故障して交代する場合でも、過半数が合意したログのみを確定とすることで、一貫した ログの確定が行われる 3. 過半数のノードが最新のログを持つことが保証されるので、リーダー故障時でも過半数の同意を得 られる新しいリーダーを選び、継続してログを更新できる ⇨ 障害時もログの一貫性を保つためにリーダー選びが重要 いかにして高可用性と耐障害性を実現しているのか
  34. | © 2024 Levtech Co., Ltd. 40 障害時のリーダー選出 前提 過半数の合意が得られたデータしか確定しない 過半数のノードには最新のログが存在する

    ⇨ 過半数のノードと一致するログを持っていれ ば、最新のログを持っているとしてリーダーにな ることできる リーダー フォロワー 1 フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9
  35. | © 2024 Levtech Co., Ltd. 41 障害時のリーダー選出 前提 過半数の合意が得られたデータしか確定しない 過半数のノードには最新のログが存在する

    ⇨ 過半数のノードと一致するログを持っていれ ば、最新のログを持っているとしてリーダーにな ることできる この場合はフォロワー1と2がリーダーになるこ とができる リーダー フォロワー 1 フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 term1 1 2 3 4 5 term2 6 7 8 9 フォロワー 2
  36. | © 2024 Levtech Co., Ltd. 42 障害時のリーダー選出 用語の説明 ターム •

    リーダーの任期を表す数値 • 1つのタームでは、1人のリーダーしか存在しない • リーダー選挙が行われるたびに、このタームの値 が1つ増加する ログインデックス • 現在のログがどの位置まで進んでいるかを示す • 新しいログが追加されるたびに、インデックスが 1つずつ増加する リーダー フォロワー 1 フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9
  37. | © 2024 Levtech Co., Ltd. 43 障害時のリーダー選出 リーダー フォロワー 1

    フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙
  38. | © 2024 Levtech Co., Ltd. 44 障害時のリーダー選出 リーダー フォロワー 1

    フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 0 リーダーはフォロワーに対して一定間隔でハートビートを送っている
  39. | © 2024 Levtech Co., Ltd. 45 障害時のリーダー選出 リーダー フォロワー 1

    フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 1-1 リーダーがクラッシュするとハートビートが途絶える
  40. | © 2024 Levtech Co., Ltd. 46 障害時のリーダー選出 リーダー キャンディデート フォロワー

    3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 1-2 フォロワーは各自election timeoutを持っており、タイムアウトを検知 するとキャンディデートとして立候補する
  41. | © 2024 Levtech Co., Ltd. 47 障害時のリーダー選出 リーダー キャンディデート フォロワー

    3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 1-3 候補者は自分に一票を入れた上で、他のフォロワーに自分に投票してく ださいとリクエストを送る。その際にtermを一つ進める リクエストにはタームとログインデックスを含める term: 2 index: 9 term: 2 index: 9 term: 2 index: 9
  42. | © 2024 Levtech Co., Ltd. 48 障害時のリーダー選出 リーダー キャンディデート フォロワー

    3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 term: 2 index: 9 RequestVote 2 フォロワーはタームとログインデックスを比較して、自分と同じか最新の ログを持っていると判断できた場合は投票を行う 投票 投票 投票
  43. | © 2024 Levtech Co., Ltd. 49 障害時のリーダー選出 リーダー リーダー フォロワー

    3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 投票 投票 3-1 過半数の投票をもらうとリーダーに昇格する 投票
  44. | © 2024 Levtech Co., Ltd. 50 障害時のリーダー選出 リーダー リーダー フォロワー

    3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 3-2 新しいリーダーはリーダーになったことをフォロワーに通知する 最新のエントリに追いついていないフォロワーがいた場合はログの再送を行 う 9 8 term2 6 7 8 9 term2 6 7
  45. | © 2024 Levtech Co., Ltd. 51 障害時のリーダー選出 リーダー キャンディデート フォロワー

    3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 キャンディデート term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 4-1 たまたまタイムアウトのタイミングが被ってしまうと候補者が複数発生 して票が割れることがある ☝ 実際は衝突を軽減するためにランダムなタイムアウトを割り当てているよ 投票 投票
  46. | © 2024 Levtech Co., Ltd. 52 障害時のリーダー選出 リーダー フォロワー 1

    フォロワー 3 フォロワー 4 term1 1 2 3 4 5 term2 6 7 8 9 term1 1 2 3 4 5 term2 6 7 term2 6 7 8 term2 6 7 8 9 term1 1 2 3 4 5 term1 1 2 3 4 5 フォロワー 2 term1 1 2 3 4 5 term2 6 7 8 9 具体的な流れ 1. リーダーのダウンを検知したフォロワーが キャンディデートとして立候補 2. フォロワーが、自分と同じか新しいログを 持つ候補者にのみ投票 3. 過半数の投票を得たキャンディデートが リーダーに昇格 4. 票が割れた場合は再選挙 4-2 タームを更新して全員がフォロワーに戻る 複数の立候補者がでにくいようにランダムでタイムアウトを割り当てる timeout: 150ms timeout: 130ms timeout: 170ms timeout: 180ms
  47. | © 2024 Levtech Co., Ltd. 53 前半まとめ 過半数の合意が得られたデータしか確定しない ⇨ 確定したデータは過半数の合意を得ていることを保証できる

    耐障害性はどうやって保証しているのか? ⇨ 過半数のノードと一致するログを持つノードをリーダーに選出することで、障害時もログの一貫性を 保証することができる リーダーの選出は自動で素早く行われるため、運用負荷なしに高い可用性と耐障害性 を手に入れることができる ☝ コミット->適用の間に障害が起きたらとか、クラッシュしたリーダーが復帰したら?など細かい話もあるけど、今日は割愛!
  48. | © 2024 Levtech Co., Ltd. 54 🟢 話すこと 1. TiDBがいかにして高可用性と耐障害性を実現しているのか

    2. どうやって書き込みのスケーラビリティを実現しているか 今日話すこと(再掲)
  49. | © 2024 Levtech Co., Ltd. 55 MySQL互換を謳うオープンソースのNew SQLデータベース 特徴 •

    99.99%の可用性と耐障害性 • 書き込みを含めた水平方向の拡張性 • トランザクション・分析クエリの両方をサポートするHTAP構成の実現 TiDBとは(再掲)
  50. | © 2024 Levtech Co., Ltd. 56 MySQL互換を謳うオープンソースのNew SQLデータベース 特徴 •

    99.99%の可用性と耐障害性 • 書き込みを含めた水平方向の拡張性 • トランザクション・分析クエリの両方をサポートするHTAP構成の実現 TiDBとは(再掲)
  51. | © 2024 Levtech Co., Ltd. 63 ノードをリーダーとフォロワーに分けて、リーダーがログの順序を決定する フォロワーは順番通りにログを適用する 一元管理されたログを配布する リーダー

    { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 フォロワー { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 適用 適用 これ通りに適用してな〜 りょ ノードをリーダーとフォロワーに分けて、リーダーがログの順序を決定する フォロワーは順番通りにログを適用する
  52. | © 2024 Levtech Co., Ltd. 64 ノードをリーダーとフォロワーに分けて、リーダーがログの順序を決定する フォロワーは順番通りにログを適用する 一元管理されたログを配布する リーダー

    { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 フォロワー { PUT Key = 1, name = hoge } { PUT Key = 2, name = fuga } { PUT Key = 1, name = piyo } { Key = 1, name = piyo } { Key = 1, name = fuga } ログ 状態 適用 適用 これ通りに適用してな〜 りょ ノードをリーダーとフォロワーに分けて、リーダーがログの順序を決定する フォロワーは順番通りにログを適用する ⇨ 全ての処理はリーダーに依存する
  53. | © 2024 Levtech Co., Ltd. 67 Storage Cluster Multi Raft

    Group TiDB では、データを「リージョン」という細かい単位に分割し、リージョンごとにリー ダーを割り当てる TiKV node 1 Region 1 Region 3 Region 4 Region n ・・・ Region 2 TiKV node 3 Region 3 Region 4 Region n ・・・ TiKV node 4 Region 1 Region 2 Region 4 Region n ・・・ Region 3 TiKV node 2 Region 1 Region 2 Region n ・・・
  54. | © 2024 Levtech Co., Ltd. 68 Multi Raft Group TiDB

    では、データを「リージョン」という細かい単位に分割し、リージョンごとにリー ダーを割り当てる • 1つのノードに書き込み負荷が集中せず、書き込みをスケールさせることができる ◦ シャーディングと同様の考え方 • ノード間でデータの同期が保証されているため、実現できる リージョンにデータはどうやって割り当てる?
  55. | © 2024 Levtech Co., Ltd. 69 Multi Raft Group TiDB

    では、データを「リージョン」という細かい単位に分割し、リージョンごとにリー ダーを割り当てる • 1つのノードに書き込み負荷が集中せず、書き込みをスケールさせることができる ◦ シャーディングと同様の考え方 • ノード間でデータの同期が保証されているため、実現できる リージョンにデータはどうやって割り当てる? ⇨ Placement Driverの出番
  56. | © 2024 Levtech Co., Ltd. 70 Multi Raft Group Placement

    Driverの役割 • リージョンの分割とマージ ◦ リージョンには上限のサイズ(デフォルトは96 MiB)が決められている ◦ あるリージョンのサイズが上限を超える場合、自動でリージョンを分割する ◦ 逆に、データ量が少なくなりすぎたリージョンをマージさせる場合もある • ホットスポットの回避 ◦ クラスタ全体の負荷状況をモニタリングし、特定ノードへ負荷が集中しないよう に管理 ◦ リーダーの再配置や、リージョンの配置換えを行い、ホットスポットを分散する
  57. | © 2024 Levtech Co., Ltd. 71 後半まとめ どうやって書き込みのスケーラビリティを実現しているか • データを「リージョン」という細かい単位に分割し、リージョンごとにリーダーを割り当てる

    Multi Raft Groupを採用 ◦ 書き込みのノードを分散させることで書き込みの負荷を分散させている • Placement Driverによるデータの再配置(スプリット・マージ)とホットスポット回避のための バランシングによって、自動でスケーリングを実現
  58. | © 2024 Levtech Co., Ltd. 72 他にもあるよ!TiDBの魅力 • 分散アルゴリズムを支えるストレージ要件 ◦

    耐障害性 (WAL, LSM-Tree)、読み込み最適化 (Bloom Filter, Block Cache) • 分散トランザクション (MVCC + Percolator) ◦ 大量の並行処理が可能な二段階コミット方式 を採用し、整合性を確保 • HTAP 構成 ◦ TiFlash(列指向ストレージ) とのリアルタイム同期 ◦ DeltaTreeで書き込み性能と圧縮効率を両立 ◦ MPPによる大規模分析クエリの高速化 なんとPingCap公式で無料で公開されている!
  59. | © 2024 Levtech Co., Ltd. 73 まとめ TiDBがいかにして高可用性と耐障害性を実現しているのか • 分散合意アルゴリズムによって、一度確定したデータは過半数の合意を得ていることが保証される

    • 過半数のノードと一致するログを持つノードをリーダーに選出することで、障害発生時もログの一 貫性を維持できる • リーダーの選出は自動で素早く行われるため、運用負荷をかけずに高可用性と耐障害性を確保でき る どうやって書き込みのスケーラビリティを実現しているか • データを「リージョン」という細かい単位に分割し、リージョンごとにリーダーを割り当てる Multi Raft Groupを採用 ◦ 書き込みのノードを分散させることで書き込みの負荷を分散させている • Placement Driverによるデータの再配置(スプリット・マージ)とホットスポット回避のための バランシングによって、自動でスケーリングを実現