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
MOCO で始める MySQL on Kubernetes
Search
sft8192
March 30, 2022
Technology
0
690
MOCO で始める MySQL on Kubernetes
sft8192
March 30, 2022
Tweet
Share
Other Decks in Technology
See All in Technology
Application Development WG Intro at AppDeveloperCon
salaboy
0
190
開発生産性を上げながらビジネスも30倍成長させてきたチームの姿
kamina_zzz
2
1.7k
Lexical Analysis
shigashiyama
1
150
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
990
New Relicを活用したSREの最初のステップ / NRUG OKINAWA VOL.3
isaoshimizu
2
600
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
140
個人でもIAM Identity Centerを使おう!(アクセス管理編)
ryder472
3
200
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
200
複雑なState管理からの脱却
sansantech
PRO
1
140
Terraform Stacks入門 #HashiTalks
msato
0
350
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
3.8k
Featured
See All Featured
A designer walks into a library…
pauljervisheath
204
24k
Adopting Sorbet at Scale
ufuk
73
9.1k
Fireside Chat
paigeccino
34
3k
A Modern Web Designer's Workflow
chriscoyier
693
190k
RailsConf 2023
tenderlove
29
900
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Music & Morning Musume
bryan
46
6.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
How STYLIGHT went responsive
nonsquared
95
5.2k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Producing Creativity
orderedlist
PRO
341
39k
Transcript
MOCO で始める MySQL on Kubernetes 藤田 俊貴 日本 MySQL ユーザ会
自己紹介 • 藤田 俊貴 • サイボウズ株式会社 • SRE/DBRE • クラウドサービスの運用に従事
• MySQL 8.0 への移行が完了しました ~さようなら全ての MySQL 5.7~ • https://blog.cybozu.io/entry/2021/05/24/175000
はじめに • Kubernetes 用 MySQL オペレータ 「MOCO」の紹介をします • MOCO を使うことで、日々の
MySQL 運用が少し楽になるかも、 と思っていただけたら幸いです • 質問等は随時 @MySQL_MyNA へお願いします • 開発者の ymmt も待機しておりますので、お気軽にどうぞ!
MySQL の運用忙しい問題
MySQL の運用 • 日頃から多くのタスクが発生 • サーバ故障時の切り替え作業 • 負荷に応じたスケーリング • データの復元
• 障害対応 ・・・
MySQL の運用 • 全て手動で実施するのはとても大変 • 故障機材の切り替え • インスタンスのラック分散配置 • レプリケーションの設定
• オペレーションミスの可能性 ・・・ • 安定運用するためになるべく自動化したい
そこで本日は・・・
Kubernetes を使った MySQL の自動運用を紹介!
MySQL on Kubernetes
Kubernetes とは • コンテナ化されたワークロードやサービスを管理するための オープンソースプラットフォーム • 宣言的な構成管理と自動化を促進する manifest container 宣言!
この状態を 維持する controller Node: 物理/仮想マシン Pod: Docker コンテナの集合体
宣言的に管理? • Kubernetes では「あるべき姿」を宣言すると、その状態に近 づけるよう自動的に制御する container 壊れたから別の機材で コンテナを立ち上げるよ controller container
Node: 物理/仮想マシン Pod: コンテナの集合体
Kubernetes が得意なこと StatefulSet: 状態管理API Service: エンドポイントを提供 黄色いNode に 配置してください Pod
の順序と一意性を 保証します Pod のIPアドレスを 提供します • 柔軟な Pod のスケジューリング • StatefulSet による安定した Pod の更新 • Service による接続先の自動切換えと負荷分散
MySQL on Kubernetes で 実現できそうなこと • Pod のラック分散配置 • Pod
を稼働させる Node を柔軟に指定 • 機材故障の自動フェイルオーバー • フェイルオーバー先の機材は自動で選定 • 安定した Pod の更新 • Pod の順序関係を保証するので必ずレプリカノードから更新 • 接続先の自動切換え • エンドポイントの IPアドレス は Service で管理 ・・・
MySQL のよくある構成 REPLICA PRIMARY REPLICA プライマリ1台 レプリカ2台の レプリケーション構成
宣言的に管理 REPLICA PRIMARY REPLICA この状態を自動で 維持してほしい この状態を 維持するよ
宣言的に管理 REPLICA PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ この状態を 維持するよ
宣言的に管理 REPLICA PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ この状態を 維持・・・
空き機材を 探してきて
宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを
復旧する MySQL 何もワカラン 空き機材を 探してきて
宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを
復旧する MySQL 何もワカラン 空き機材を 探してきて レプリケーションも自動的に維持してほしい
Kubernetes Operator を使って自律運用する
Kubernetes Operator とは • 特定のアプリケーションに特化した Controller Operator (MySQL レプリケーション) Node:
物理/仮想マシン Pod: Docker コンテナの集合体 MySQL完全に 理解した この状態に してください manifest
Kubernetes Operator とは • 特定のアプリケーションに特化した Controller Operator (MySQL レプリケーション) この状態に
してください manifest レプリケーション 構成を構築します container PRIMARY container REPLICA Node: 物理/仮想マシン Pod: Docker コンテナの集合体
Kubernetes Operator とは • 特定のアプリケーションに特化した Controller container container PRIMARY REPLICA
Operator (MySQL レプリケーション) この状態に してください manifest container REPLICA 機材が故障したら 自動的に空き機材へ フェイルオーバーします Node: 物理/仮想マシン Pod: Docker コンテナの集合体
MySQL を自動運用する Operator が欲しい
サイボウズの事情 • オンプレミス環境に Kubernetes ベースの新インフラを構築 • 既存インフラ上のアプリを新しいインフラへ移行する • 約500台の MySQL
インスタンスを運用 既存インフラ基盤 新インフラ基盤 cybozu.com の新データセンター「Neco」が稼働開始 https://blog.cybozu.io/entry/2019/09/05/090000 Kubernetes 上で MySQL を運用したい
MySQL を新基盤で運用するために要件を洗い出し
要件を満たす Operator が無かったので自作した https://blog.cybozu.io/entry/moco#なぜ-MOCO-を開発したのか
MOCO とは • サイボウズが開発した Kubernetes 用 MySQL オペレータ • Loss-less
semi-synchronous レプリケーションを採用 • MySQL クラスタを構築し自動運用する • 1,000 以上のクラスタを管理できるようなスケーラブルな アーキテクチャ https://github.com/cybozu-go/moco
MOCO の特徴 • 多彩かつ高度な機能を提供 クラスタの自動構築 自動フェイルオーバー 自動/手動スイッチオーバー 接続の自動切換えと負荷分散 MySQL Shell
を利用した 高速バックアップ 任意の時点のデータを リストアできる PiTR mysqld_exporter による 各種メトリクス取得 クラスタ間レプリケーション
MOCO を使うと日々のMySQL 運用が少しだけ楽になります?
MySQL のレプリケーション構成を作りたい
レプリケーション構成の手動構築 • MySQL インスタンスを作成 • プライマリインスタンスと必要な数だけレプリカインスタンスを作成 • レプリケーションの設定 • レプリケーション用にユーザ作成
• 権限設定 • dump&restore or CLONE • プライマリサーバ情報のパラメータ設定 • レプリケーション開始 ・・・ レプリケーション構成を 構築したい
レプリケーション構成の自動構築 • loss-less semi-synchronous replication 方式で レプリケーション構成を構築 • mysqld インスタンス数を設定可能
(1,3,5) • 自分でビルドした mysql コンテナイメージも指定可能 container PRIMARY container REPLICA container REPLICA manifest apply レプリケーション構成 を構築したい
レプリケーション構成の自動構築 Manifest ファイルを apply するだけ
機材故障による障害から復旧したい
手動フェイルオーバー • 例えば機材が故障した場合 • レプリケーションを停止して設定を初期化 • 空き機材を探して用意 • MySQL ノードを1台追加してセットアップ
• 新プライマリと新レプリカでレプリケーション設定 • レプリケーション再開 ・・・ 機材を入れ替えて レプリケーション 再開する
自動フェイルオーバー • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える container PRIMARY container REPLICA container
REPLICA Node が1台 故障した
自動フェイルオーバー container PRIMARY container REPLICA IO_THREAD 停止 IO_THREAD 停止 フェイルオーバー
container PRIMARY IO_THREAD 停止して フェイルオーバーを実行 • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える
自動フェイルオーバー container PRIMARY container REPLICA レプリカを追加して再開 フェイルオーバー container PRIMARY 追加!
container REPLICA • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える
自動フェイルオーバー 自動で PRIMARY が 切り替わる
Pod が稼働する Node を自動で選択したい
手動スケジューリング • 例えばフェイルオーバー時、フェイルオーバー先の機材として 適切なものを手動で探す レプリケーション構成 のインスタンスは ラック分散したい PRIMARY REPLICA ラック1
ラック2 ラック3
手動スケジューリング • 例えばフェイルオーバー時、フェイルオーバー先の機材として 適切なものを手動で探す PRIMARY REPLICA 少し 混んでる 満員御礼 空いてる
空いてる 混んでる 満員御礼 少し 混んでる ラック1 ラック2 ラック3 レプリケーション構成 のインスタンスは ラック分散したい
手動スケジューリング • 例えばフェイルオーバー時、フェイルオーバー先の機材として 適切なものを手動で探す PRIMARY REPLICA 少し 混んでる 満員御礼 空いてる
混んでる 満員御礼 少し 混んでる ラック1 ラック2 ラック3 レプリケーション構成 のインスタンスは ラック分散したい
自動スケジューリング • Pod を割り当てる条件を柔軟に指定可能 ラック1 ラック2 ラック3 PRIMARY REPLICA manifest
apply レプリケーション構成 のインスタンスは ラック分散したい 与えられた条件に従って 適切に Pod を配置
自動スケジューリング • Pod を割り当てる条件を柔軟に指定可能 ラック1 ラック2 ラック3 PRIMARY REPLICA manifest
apply フェイルオーバー時も 適切な Node を自動で選択 レプリケーション構成 のインスタンスは ラック分散したい
MySQL をバージョンアップしたい
手動ローリングアップデート • レプリカの MySQL を更新する • レプリカをプライマリに昇格する • 新しくレプリカを追加する MySQL
のバージョン を上げたい PRIMARY REPLICA REPLICA 更新! 更新!
手動ローリングアップデート • レプリカの MySQL を更新する • レプリカをプライマリに昇格する • 新しくレプリカを追加する PRIMARY
PRIMARY REPLICA 更新! 更新! REPLICA 追加! スイッチオーバー MySQL のバージョン を上げたい
自動ローリングアップデート • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする container PRIMARY container REPLICA container
REPLICA manifest apply MySQL のバージョン を上げたい
自動ローリングアップデート • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする container PRIMARY container REPLICA container
REPLICA manifest apply 更新! MySQL のバージョン を上げたい
自動ローリングアップデート container PRIMARY container REPLICA container REPLICA manifest apply 更新!
更新! • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする MySQL のバージョン を上げたい
自動ローリングアップデート container REPLICA container PRIMARY container REPLICA manifest apply 更新!
更新! スイッチオーバー • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする MySQL のバージョン を上げたい
自動ローリングアップデート container REPLICA container PRIMARY container REPLICA manifest apply 更新!
更新! 更新! • マニフェストを更新すると自動でローリングアップデートを行う • レプリカインスタンスから順番にアップデートする MySQL のバージョン を上げたい
自動ローリングアップデート 自動で バージョンアップ
負荷分散したい
• Read と Write でアプリケーションが使うデータベースを切り替える • IP が変わったら何らかの仕組みで更新する よくある負荷分散 Application
Write Read PRIMARY REPLICA 192.168.0.101 192.168.0.102 192.168.0.101 192.168.0.102
• 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
• 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
• 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
• 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
MOCO の負荷分散と 接続の自動切換え 接続先が 自動で切り替わる
MOCO を使うと日々のMySQL 運用が少しだけ楽になります!
というわけで • Kubernetes 用 MySQL オペレータ 「MOCO」を紹介しました • MOCO を使うことで、日々の
MySQL 運用が少し楽になるかも、と思っ ていただけたら幸いです • MOCO を試してみたい方はこちらからどうぞ! • https://cybozu-go.github.io/moco/index.html • 不具合がありましたら issue 登録お願いします • https://github.com/cybozu-go/moco • 質問/疑問点ありましたら @MySQL_MyNA へ!
開発の裏話
開発の裏話 • 正直な感想としては… • ステートフルアプリのオペレーターの自作は絶対回避推奨! • Kubernetes の深い知識が必要 • Kubernetes
専門家として知るべき 47 のこと • https://ymmt.hatenablog.com/entry/k8s-things • MySQL の深い知識が必要 • 技術顧問の @yoku0825 さんにお世話になりました • https://blog.cybozu.io/entry/2019-11-yoku0825 • ステートが多く、開発が難航 • 全体で約1年半ほど開発 開発者の声
Thank you