Slide 1

Slide 1 text

MOCO で始める MySQL on Kubernetes 藤田 俊貴 日本 MySQL ユーザ会

Slide 2

Slide 2 text

自己紹介 • 藤田 俊貴 • サイボウズ株式会社 • SRE/DBRE • クラウドサービスの運用に従事 • MySQL 8.0 への移行が完了しました ~さようなら全ての MySQL 5.7~ • https://blog.cybozu.io/entry/2021/05/24/175000

Slide 3

Slide 3 text

はじめに • Kubernetes 用 MySQL オペレータ 「MOCO」の紹介をします • MOCO を使うことで、日々の MySQL 運用が少し楽になるかも、 と思っていただけたら幸いです • 質問等は随時 @MySQL_MyNA へお願いします • 開発者の ymmt も待機しておりますので、お気軽にどうぞ!

Slide 4

Slide 4 text

MySQL の運用忙しい問題

Slide 5

Slide 5 text

MySQL の運用 • 日頃から多くのタスクが発生 • サーバ故障時の切り替え作業 • 負荷に応じたスケーリング • データの復元 • 障害対応 ・・・

Slide 6

Slide 6 text

MySQL の運用 • 全て手動で実施するのはとても大変 • 故障機材の切り替え • インスタンスのラック分散配置 • レプリケーションの設定 • オペレーションミスの可能性 ・・・ • 安定運用するためになるべく自動化したい

Slide 7

Slide 7 text

そこで本日は・・・

Slide 8

Slide 8 text

Kubernetes を使った MySQL の自動運用を紹介!

Slide 9

Slide 9 text

MySQL on Kubernetes

Slide 10

Slide 10 text

Kubernetes とは • コンテナ化されたワークロードやサービスを管理するための オープンソースプラットフォーム • 宣言的な構成管理と自動化を促進する manifest container 宣言! この状態を 維持する controller Node: 物理/仮想マシン Pod: Docker コンテナの集合体

Slide 11

Slide 11 text

宣言的に管理? • Kubernetes では「あるべき姿」を宣言すると、その状態に近 づけるよう自動的に制御する container 壊れたから別の機材で コンテナを立ち上げるよ controller container Node: 物理/仮想マシン Pod: コンテナの集合体

Slide 12

Slide 12 text

Kubernetes が得意なこと StatefulSet: 状態管理API Service: エンドポイントを提供 黄色いNode に 配置してください Pod の順序と一意性を 保証します Pod のIPアドレスを 提供します • 柔軟な Pod のスケジューリング • StatefulSet による安定した Pod の更新 • Service による接続先の自動切換えと負荷分散

Slide 13

Slide 13 text

MySQL on Kubernetes で 実現できそうなこと • Pod のラック分散配置 • Pod を稼働させる Node を柔軟に指定 • 機材故障の自動フェイルオーバー • フェイルオーバー先の機材は自動で選定 • 安定した Pod の更新 • Pod の順序関係を保証するので必ずレプリカノードから更新 • 接続先の自動切換え • エンドポイントの IPアドレス は Service で管理 ・・・

Slide 14

Slide 14 text

MySQL のよくある構成 REPLICA PRIMARY REPLICA プライマリ1台 レプリカ2台の レプリケーション構成

Slide 15

Slide 15 text

宣言的に管理 REPLICA PRIMARY REPLICA この状態を自動で 維持してほしい この状態を 維持するよ

Slide 16

Slide 16 text

宣言的に管理 REPLICA PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ この状態を 維持するよ

Slide 17

Slide 17 text

宣言的に管理 REPLICA PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ この状態を 維持・・・ 空き機材を 探してきて

Slide 18

Slide 18 text

宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを 復旧する MySQL 何もワカラン 空き機材を 探してきて

Slide 19

Slide 19 text

宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを 復旧する MySQL 何もワカラン 空き機材を 探してきて レプリケーションも自動的に維持してほしい

Slide 20

Slide 20 text

Kubernetes Operator を使って自律運用する

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Kubernetes Operator とは • 特定のアプリケーションに特化した Controller container container PRIMARY REPLICA Operator (MySQL レプリケーション) この状態に してください manifest container REPLICA 機材が故障したら 自動的に空き機材へ フェイルオーバーします Node: 物理/仮想マシン Pod: Docker コンテナの集合体

Slide 24

Slide 24 text

MySQL を自動運用する Operator が欲しい

Slide 25

Slide 25 text

サイボウズの事情 • オンプレミス環境に Kubernetes ベースの新インフラを構築 • 既存インフラ上のアプリを新しいインフラへ移行する • 約500台の MySQL インスタンスを運用 既存インフラ基盤 新インフラ基盤 cybozu.com の新データセンター「Neco」が稼働開始 https://blog.cybozu.io/entry/2019/09/05/090000 Kubernetes 上で MySQL を運用したい

Slide 26

Slide 26 text

MySQL を新基盤で運用するために要件を洗い出し

Slide 27

Slide 27 text

要件を満たす Operator が無かったので自作した https://blog.cybozu.io/entry/moco#なぜ-MOCO-を開発したのか

Slide 28

Slide 28 text

MOCO とは • サイボウズが開発した Kubernetes 用 MySQL オペレータ • Loss-less semi-synchronous レプリケーションを採用 • MySQL クラスタを構築し自動運用する • 1,000 以上のクラスタを管理できるようなスケーラブルな アーキテクチャ https://github.com/cybozu-go/moco

Slide 29

Slide 29 text

MOCO の特徴 • 多彩かつ高度な機能を提供 クラスタの自動構築 自動フェイルオーバー 自動/手動スイッチオーバー 接続の自動切換えと負荷分散 MySQL Shell を利用した 高速バックアップ 任意の時点のデータを リストアできる PiTR mysqld_exporter による 各種メトリクス取得 クラスタ間レプリケーション

Slide 30

Slide 30 text

MOCO を使うと日々のMySQL 運用が少しだけ楽になります?

Slide 31

Slide 31 text

MySQL のレプリケーション構成を作りたい

Slide 32

Slide 32 text

レプリケーション構成の手動構築 • MySQL インスタンスを作成 • プライマリインスタンスと必要な数だけレプリカインスタンスを作成 • レプリケーションの設定 • レプリケーション用にユーザ作成 • 権限設定 • dump&restore or CLONE • プライマリサーバ情報のパラメータ設定 • レプリケーション開始 ・・・ レプリケーション構成を 構築したい

Slide 33

Slide 33 text

レプリケーション構成の自動構築 • loss-less semi-synchronous replication 方式で レプリケーション構成を構築 • mysqld インスタンス数を設定可能 (1,3,5) • 自分でビルドした mysql コンテナイメージも指定可能 container PRIMARY container REPLICA container REPLICA manifest apply レプリケーション構成 を構築したい

Slide 34

Slide 34 text

レプリケーション構成の自動構築 Manifest ファイルを apply するだけ

Slide 35

Slide 35 text

機材故障による障害から復旧したい

Slide 36

Slide 36 text

手動フェイルオーバー • 例えば機材が故障した場合 • レプリケーションを停止して設定を初期化 • 空き機材を探して用意 • MySQL ノードを1台追加してセットアップ • 新プライマリと新レプリカでレプリケーション設定 • レプリケーション再開 ・・・ 機材を入れ替えて レプリケーション 再開する

Slide 37

Slide 37 text

自動フェイルオーバー • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える container PRIMARY container REPLICA container REPLICA Node が1台 故障した

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

自動フェイルオーバー 自動で PRIMARY が 切り替わる

Slide 41

Slide 41 text

Pod が稼働する Node を自動で選択したい

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

自動スケジューリング • Pod を割り当てる条件を柔軟に指定可能 ラック1 ラック2 ラック3 PRIMARY REPLICA manifest apply フェイルオーバー時も 適切な Node を自動で選択 レプリケーション構成 のインスタンスは ラック分散したい

Slide 47

Slide 47 text

MySQL をバージョンアップしたい

Slide 48

Slide 48 text

手動ローリングアップデート • レプリカの MySQL を更新する • レプリカをプライマリに昇格する • 新しくレプリカを追加する MySQL のバージョン を上げたい PRIMARY REPLICA REPLICA 更新! 更新!

Slide 49

Slide 49 text

手動ローリングアップデート • レプリカの MySQL を更新する • レプリカをプライマリに昇格する • 新しくレプリカを追加する PRIMARY PRIMARY REPLICA 更新! 更新! REPLICA 追加! スイッチオーバー MySQL のバージョン を上げたい

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

自動ローリングアップデート 自動で バージョンアップ

Slide 56

Slide 56 text

負荷分散したい

Slide 57

Slide 57 text

• Read と Write でアプリケーションが使うデータベースを切り替える • IP が変わったら何らかの仕組みで更新する よくある負荷分散 Application Write Read PRIMARY REPLICA 192.168.0.101 192.168.0.102 192.168.0.101 192.168.0.102

Slide 58

Slide 58 text

• Read と Write でアプリケーションが使うデータベースを切り替える • IP が変わったら何らかの仕組みで更新する よくある負荷分散 Application Write Read PRIMARY REPLICA REPLICA 192.168.0.101 192.168.0.102 192.168.0.101 192.168.0.103 192.168.0.103

Slide 59

Slide 59 text

• 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

Slide 60

Slide 60 text

• 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

Slide 61

Slide 61 text

• 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

Slide 62

Slide 62 text

MOCO の負荷分散と 接続の自動切換え 接続先が 自動で切り替わる

Slide 63

Slide 63 text

MOCO を使うと日々のMySQL 運用が少しだけ楽になります!

Slide 64

Slide 64 text

というわけで • Kubernetes 用 MySQL オペレータ 「MOCO」を紹介しました • MOCO を使うことで、日々の MySQL 運用が少し楽になるかも、と思っ ていただけたら幸いです • MOCO を試してみたい方はこちらからどうぞ! • https://cybozu-go.github.io/moco/index.html • 不具合がありましたら issue 登録お願いします • https://github.com/cybozu-go/moco • 質問/疑問点ありましたら @MySQL_MyNA へ!

Slide 65

Slide 65 text

開発の裏話

Slide 66

Slide 66 text

開発の裏話 • 正直な感想としては… • ステートフルアプリのオペレーターの自作は絶対回避推奨! • Kubernetes の深い知識が必要 • Kubernetes 専門家として知るべき 47 のこと • https://ymmt.hatenablog.com/entry/k8s-things • MySQL の深い知識が必要 • 技術顧問の @yoku0825 さんにお世話になりました • https://blog.cybozu.io/entry/2019-11-yoku0825 • ステートが多く、開発が難航 • 全体で約1年半ほど開発 開発者の声

Slide 67

Slide 67 text

Thank you