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
870
MOCO で始める MySQL on Kubernetes
sft8192
March 30, 2022
Tweet
Share
Other Decks in Technology
See All in Technology
食べログが挑む!飲食店ネット予約システムで自動テスト無双して手動テストゼロを実現する戦略
hagevvashi
1
160
フロントエンドも盛り上げたい!フロントエンドCBとAmplifyの軌跡
mkdev10
2
230
Amazon CloudWatch Application Signals ではじめるバーンレートアラーム / Burn rate alarm with Amazon CloudWatch Application Signals
ymotongpoo
5
290
IVRyにおけるNLP活用と NLP2025の関連論文紹介
keisukeosone
0
180
JPOUG Tech Talk #12 UNDO Tablespace Reintroduction
nori_shinoda
1
110
近年の PyCon 情勢から見た PyCon APAC のまとめ
terapyon
0
280
Cursor AgentによるパーソナルAIアシスタント育成入門―業務のプロンプト化・MCPの活用
os1ma
7
1.9k
Spice up your notifications/try!Swift25
noppefoxwolf
2
340
LangfuseでAIエージェントの 可観測性を高めよう!/Enhancing AI Agent Observability with Langfuse!
jnymyk
0
170
Re:VIEWで書いた「Compose で Android の edge-to-edge に対応する」をRoo Codeで発表資料にしてもらった
tomoya0x00
0
260
MCPを活用した検索システムの作り方/How to implement search systems with MCP #catalks
quiver
1
530
プロダクト開発におけるAI時代の開発生産性
shnjtk
2
190
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
640
Site-Speed That Sticks
csswizardry
5
480
What's in a price? How to price your products and services
michaelherold
245
12k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
Designing Experiences People Love
moore
141
24k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
Optimising Largest Contentful Paint
csswizardry
36
3.2k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Speed Design
sergeychernyshev
29
880
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.2k
Visualization
eitanlees
146
16k
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