Share
Embed
Transcript
67 slides
-
自己紹介 • 藤田 俊貴 • サイボウズ株式会社 • 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 の運用 • 全て手動で実施するのはとても大変 • 故障機材の切り替え • インスタンスのラック分散配置 • レプリケーションの設定
• オペレーションミスの可能性 ・・・ • 安定運用するためになるべく自動化したい -
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 で管理 ・・・ -
宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを
復旧する MySQL 何もワカラン 空き機材を 探してきて -
宣言的に管理 REPLICA PRIMARY PRIMARY REPLICA この状態を自動で 維持してほしい 機材が故障して しまったら・・・ レプリケーションを
復旧する MySQL 何もワカラン 空き機材を 探してきて レプリケーションも自動的に維持してほしい -
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 コンテナの集合体 -
サイボウズの事情 • オンプレミス環境に Kubernetes ベースの新インフラを構築 • 既存インフラ上のアプリを新しいインフラへ移行する • 約500台の MySQL
インスタンスを運用 既存インフラ基盤 新インフラ基盤 cybozu.com の新データセンター「Neco」が稼働開始 https://blog.cybozu.io/entry/2019/09/05/090000 Kubernetes 上で MySQL を運用したい -
MOCO とは • サイボウズが開発した Kubernetes 用 MySQL オペレータ • Loss-less
semi-synchronous レプリケーションを採用 • MySQL クラスタを構築し自動運用する • 1,000 以上のクラスタを管理できるようなスケーラブルな アーキテクチャ https://github.com/cybozu-go/moco -
MOCO の特徴 • 多彩かつ高度な機能を提供 クラスタの自動構築 自動フェイルオーバー 自動/手動スイッチオーバー 接続の自動切換えと負荷分散 MySQL Shell
を利用した 高速バックアップ 任意の時点のデータを リストアできる PiTR mysqld_exporter による 各種メトリクス取得 クラスタ間レプリケーション -
レプリケーション構成の手動構築 • MySQL インスタンスを作成 • プライマリインスタンスと必要な数だけレプリカインスタンスを作成 • レプリケーションの設定 • レプリケーション用にユーザ作成
• 権限設定 • dump&restore or CLONE • プライマリサーバ情報のパラメータ設定 • レプリケーション開始 ・・・ レプリケーション構成を 構築したい -
レプリケーション構成の自動構築 • loss-less semi-synchronous replication 方式で レプリケーション構成を構築 • mysqld インスタンス数を設定可能
(1,3,5) • 自分でビルドした mysql コンテナイメージも指定可能 container PRIMARY container REPLICA container REPLICA manifest apply レプリケーション構成 を構築したい -
手動フェイルオーバー • 例えば機材が故障した場合 • レプリケーションを停止して設定を初期化 • 空き機材を探して用意 • MySQL ノードを1台追加してセットアップ
• 新プライマリと新レプリカでレプリケーション設定 • レプリケーション再開 ・・・ 機材を入れ替えて レプリケーション 再開する -
自動フェイルオーバー container PRIMARY container REPLICA IO_THREAD 停止 IO_THREAD 停止 フェイルオーバー
container PRIMARY IO_THREAD 停止して フェイルオーバーを実行 • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える -
自動フェイルオーバー container PRIMARY container REPLICA レプリカを追加して再開 フェイルオーバー container PRIMARY 追加!
container REPLICA • プライマリインスタンスに障害が発生した時に、最新の状態 であるレプリカインスタンスを自動的にプライマリインスタ ンスに切り替える -
手動スケジューリング • 例えばフェイルオーバー時、フェイルオーバー先の機材として 適切なものを手動で探す 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
のバージョン を上げたい 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 -
というわけで • 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年半ほど開発 開発者の声