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

MOCO で始める MySQL on Kubernetes

Avatar for sft8192 sft8192
March 30, 2022

MOCO で始める MySQL on Kubernetes

Avatar for sft8192

sft8192

March 30, 2022
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介 • 藤田 俊貴 • サイボウズ株式会社 • SRE/DBRE • クラウドサービスの運用に従事

    • MySQL 8.0 への移行が完了しました ~さようなら全ての MySQL 5.7~ • https://blog.cybozu.io/entry/2021/05/24/175000
  2. はじめに • Kubernetes 用 MySQL オペレータ 「MOCO」の紹介をします • MOCO を使うことで、日々の

    MySQL 運用が少し楽になるかも、 と思っていただけたら幸いです • 質問等は随時 @MySQL_MyNA へお願いします • 開発者の ymmt も待機しておりますので、お気軽にどうぞ!
  3. Kubernetes が得意なこと StatefulSet: 状態管理API Service: エンドポイントを提供 黄色いNode に 配置してください Pod

    の順序と一意性を 保証します Pod のIPアドレスを 提供します • 柔軟な Pod のスケジューリング • StatefulSet による安定した Pod の更新 • Service による接続先の自動切換えと負荷分散
  4. MySQL on Kubernetes で 実現できそうなこと • Pod のラック分散配置 • Pod

    を稼働させる Node を柔軟に指定 • 機材故障の自動フェイルオーバー • フェイルオーバー先の機材は自動で選定 • 安定した Pod の更新 • Pod の順序関係を保証するので必ずレプリカノードから更新 • 接続先の自動切換え • エンドポイントの IPアドレス は Service で管理 ・・・
  5. 宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを

    復旧する MySQL 何もワカラン 空き機材を 探してきて レプリケーションも自動的に維持してほしい
  6. Kubernetes Operator とは • 特定のアプリケーションに特化した Controller Operator (MySQL レプリケーション) Node:

    物理/仮想マシン Pod: Docker コンテナの集合体 MySQL完全に 理解した この状態に してください manifest
  7. Kubernetes Operator とは • 特定のアプリケーションに特化した Controller Operator (MySQL レプリケーション) この状態に

    してください manifest レプリケーション 構成を構築します container PRIMARY container REPLICA Node: 物理/仮想マシン Pod: Docker コンテナの集合体
  8. Kubernetes Operator とは • 特定のアプリケーションに特化した Controller container container PRIMARY REPLICA

    Operator (MySQL レプリケーション) この状態に してください manifest container REPLICA 機材が故障したら 自動的に空き機材へ フェイルオーバーします Node: 物理/仮想マシン Pod: Docker コンテナの集合体
  9. サイボウズの事情 • オンプレミス環境に Kubernetes ベースの新インフラを構築 • 既存インフラ上のアプリを新しいインフラへ移行する • 約500台の MySQL

    インスタンスを運用 既存インフラ基盤 新インフラ基盤 cybozu.com の新データセンター「Neco」が稼働開始 https://blog.cybozu.io/entry/2019/09/05/090000 Kubernetes 上で MySQL を運用したい
  10. MOCO とは • サイボウズが開発した Kubernetes 用 MySQL オペレータ • Loss-less

    semi-synchronous レプリケーションを採用 • MySQL クラスタを構築し自動運用する • 1,000 以上のクラスタを管理できるようなスケーラブルな アーキテクチャ https://github.com/cybozu-go/moco
  11. MOCO の特徴 • 多彩かつ高度な機能を提供 クラスタの自動構築 自動フェイルオーバー 自動/手動スイッチオーバー 接続の自動切換えと負荷分散 MySQL Shell

    を利用した 高速バックアップ 任意の時点のデータを リストアできる PiTR mysqld_exporter による 各種メトリクス取得 クラスタ間レプリケーション
  12. レプリケーション構成の手動構築 • MySQL インスタンスを作成 • プライマリインスタンスと必要な数だけレプリカインスタンスを作成 • レプリケーションの設定 • レプリケーション用にユーザ作成

    • 権限設定 • dump&restore or CLONE • プライマリサーバ情報のパラメータ設定 • レプリケーション開始 ・・・ レプリケーション構成を 構築したい
  13. レプリケーション構成の自動構築 • loss-less semi-synchronous replication 方式で レプリケーション構成を構築 • mysqld インスタンス数を設定可能

    (1,3,5) • 自分でビルドした mysql コンテナイメージも指定可能 container PRIMARY container REPLICA container REPLICA manifest apply レプリケーション構成 を構築したい
  14. 手動フェイルオーバー • 例えば機材が故障した場合 • レプリケーションを停止して設定を初期化 • 空き機材を探して用意 • MySQL ノードを1台追加してセットアップ

    • 新プライマリと新レプリカでレプリケーション設定 • レプリケーション再開 ・・・ 機材を入れ替えて レプリケーション 再開する
  15. 自動フェイルオーバー container PRIMARY container REPLICA IO_THREAD 停止 IO_THREAD 停止 フェイルオーバー

    container PRIMARY IO_THREAD 停止して フェイルオーバーを実行 • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える
  16. 自動フェイルオーバー container PRIMARY container REPLICA レプリカを追加して再開 フェイルオーバー container PRIMARY 追加!

    container REPLICA • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える
  17. 手動スケジューリング • 例えばフェイルオーバー時、フェイルオーバー先の機材として 適切なものを手動で探す PRIMARY REPLICA 少し 混んでる 満員御礼 空いてる

    空いてる 混んでる 満員御礼 少し 混んでる ラック1 ラック2 ラック3 レプリケーション構成 のインスタンスは ラック分散したい
  18. 手動スケジューリング • 例えばフェイルオーバー時、フェイルオーバー先の機材として 適切なものを手動で探す PRIMARY REPLICA 少し 混んでる 満員御礼 空いてる

    混んでる 満員御礼 少し 混んでる ラック1 ラック2 ラック3 レプリケーション構成 のインスタンスは ラック分散したい
  19. 自動スケジューリング • Pod を割り当てる条件を柔軟に指定可能 ラック1 ラック2 ラック3 PRIMARY REPLICA manifest

    apply レプリケーション構成 のインスタンスは ラック分散したい 与えられた条件に従って 適切に Pod を配置
  20. 自動スケジューリング • Pod を割り当てる条件を柔軟に指定可能 ラック1 ラック2 ラック3 PRIMARY REPLICA manifest

    apply フェイルオーバー時も 適切な Node を自動で選択 レプリケーション構成 のインスタンスは ラック分散したい
  21. 手動ローリングアップデート • レプリカの MySQL を更新する • レプリカをプライマリに昇格する • 新しくレプリカを追加する PRIMARY

    PRIMARY REPLICA 更新! 更新! REPLICA 追加! スイッチオーバー MySQL のバージョン を上げたい
  22. 自動ローリングアップデート container PRIMARY container REPLICA container REPLICA manifest apply 更新!

    更新! • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする MySQL のバージョン を上げたい
  23. 自動ローリングアップデート container REPLICA container PRIMARY container REPLICA manifest apply 更新!

    更新! スイッチオーバー • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする MySQL のバージョン を上げたい
  24. 自動ローリングアップデート container REPLICA container PRIMARY container REPLICA manifest apply 更新!

    更新! 更新! • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする MySQL のバージョン を上げたい
  25. • Kubernetes でエンドポイントを提供するのに一般的な Service という 仕組みを採用 • リードレプリカを使った負荷分散が可能 MOCO の負荷分散と

    接続の自動切換え container REPLICA container PRIMARY moco-mysql-replica moco-mysql-primary Application Write Read 192.168.0.101 192.168.0.102 container REPLICA 192.168.0.103 Replication 192.168.0.102 192.168.0.103 192.168.0.101
  26. • Kubernetes でエンドポイントを提供するのに一般的な Service という 仕組みを採用 • リードレプリカを使った負荷分散が可能 MOCO の負荷分散と

    接続の自動切換え container REPLICA container PRIMARY Application Write Read container REPLICA Replication フェイルオーバー 実行 192.168.0.101 192.168.0.102 192.168.0.103 192.168.0.102 192.168.0.103 moco-mysql-replica moco-mysql-primary 192.168.0.101
  27. • Kubernetes でエンドポイントを提供するのに一般的な Service という 仕組みを採用 • リードレプリカを使った負荷分散が可能 MOCO の負荷分散と

    接続の自動切換え container PRIMARY container PRIMARY Application Write Read container REPLICA Replication ・・・ ・・・ moco-mysql-replica moco-mysql-primary 192.168.0.101 192.168.0.102 192.168.0.103 192.168.0.103 192.168.0.104 Service の 接続先 IP更新 192.168.0.102
  28. というわけで • Kubernetes 用 MySQL オペレータ 「MOCO」を紹介しました • MOCO を使うことで、日々の

    MySQL 運用が少し楽になるかも、と思っ ていただけたら幸いです • MOCO を試してみたい方はこちらからどうぞ! • https://cybozu-go.github.io/moco/index.html • 不具合がありましたら issue 登録お願いします • https://github.com/cybozu-go/moco • 質問/疑問点ありましたら @MySQL_MyNA へ!
  29. 開発の裏話 • 正直な感想としては… • ステートフルアプリのオペレーターの自作は絶対回避推奨! • Kubernetes の深い知識が必要 • Kubernetes

    専門家として知るべき 47 のこと • https://ymmt.hatenablog.com/entry/k8s-things • MySQL の深い知識が必要 • 技術顧問の @yoku0825 さんにお世話になりました • https://blog.cybozu.io/entry/2019-11-yoku0825 • ステートが多く、開発が難航 • 全体で約1年半ほど開発 開発者の声