MySQL Shell(mysqlsh)入門:AdminAPI で InnoDB Cluster を最短構築

データベースの高可用性とスケーラビリティが求められる現代において、MySQL InnoDB Cluster は重要な選択肢となっています。しかし従来の手動構築は複雑で時間がかかり、設定ミスのリスクも高いのが現状でした。
本記事では、MySQL Shell(mysqlsh)の AdminAPI を活用して、InnoDB Cluster を最短時間で構築する方法をご紹介いたします。実際のコマンド例とともに、初心者の方でも確実に環境を構築できる手順を詳しく解説していきますので、ぜひ最後までお読みください。
はじめに
MySQL Shell の概要と利点
MySQL Shell(mysqlsh)は、MySQL の次世代統合管理ツールです。従来の mysql クライアントの機能を包含しつつ、JavaScript、Python、SQL の 3 つのモードで操作できる強力なツールとなっています。
以下の図は、MySQL Shell の主要機能を示しています。
mermaidflowchart TD
mysqlsh["MySQL Shell (mysqlsh)"] --> js["JavaScript モード"]
mysqlsh --> python["Python モード"]
mysqlsh --> sql["SQL モード"]
js --> adminapi["AdminAPI"]
js --> automation["自動化スクリプト"]
python --> utility["ユーティリティ機能"]
python --> analytics["データ分析"]
sql --> traditional["従来のSQL操作"]
sql --> advanced["拡張SQL機能"]
adminapi --> cluster["クラスター管理"]
adminapi --> replicaset["レプリカセット管理"]
MySQL Shell の主な利点は以下の通りです。
機能 | 従来の mysql クライアント | MySQL Shell |
---|---|---|
操作言語 | SQL のみ | SQL/JavaScript/Python |
クラスター管理 | 手動設定が必要 | AdminAPI で自動化 |
スクリプト実行 | 外部ツール必要 | 内蔵機能 |
JSON 対応 | 限定的 | ネイティブサポート |
高度な機能 | ★☆☆ | ★★★ |
InnoDB Cluster の必要性
現代の Web アプリケーションでは、24 時間 365 日の稼働が求められます。単一の MySQL サーバーでは、ハードウェア障害やメンテナンス時にサービス停止が避けられません。
InnoDB Cluster が解決する課題を図で確認しましょう。
mermaidflowchart LR
single["単一サーバー"] --> spof["単一障害点"]
single --> downtime["計画停止"]
single --> limited["スケール限界"]
cluster["InnoDB Cluster"] --> ha["高可用性"]
cluster --> automatic["自動フェイルオーバー"]
cluster --> scaling["水平スケーリング"]
spof -.->|解決| ha
downtime -.->|解決| automatic
limited -.->|解決| scaling
InnoDB Cluster の導入により、以下のメリットが得られます。
- 高可用性: 複数ノードによる冗長化
- 自動フェイルオーバー: 障害時の自動切り替え
- データ整合性: Group Replication による強一貫性
- 運用効率化: AdminAPI による統一管理
本記事で学べること
本記事を通じて、以下のスキルを習得できます。
- MySQL Shell の基本操作方法
- AdminAPI を使用したクラスター構築手順
- InnoDB Cluster の動作確認とテスト方法
- 運用時のベストプラクティス
実際の環境で即座に活用できる実践的な内容となっておりますので、手順に沿って進めていただければと思います。
背景
MySQL Shell(mysqlsh)とは
MySQL Shell は、Oracle 社が開発した MySQL の統合管理ツールです。2016 年に初回リリースされ、MySQL 8.0 とともに大幅な機能拡張が行われました。
従来の mysql クライアントとの比較を以下の表でご確認ください。
項目 | mysql クライアント | MySQL Shell |
---|---|---|
リリース年 | 1995 年 | 2016 年 |
対応言語 | SQL | SQL/JavaScript/Python |
JSON 処理 | 基本的な機能 | 高度な処理機能 |
API 機能 | なし | AdminAPI/X DevAPI |
スクリプト機能 | 外部依存 | 内蔵 |
ドキュメント指向 | 非対応 | MySQL Document Store 対応 |
MySQL Shell の技術的特徴は以下の通りです。
アーキテクチャの特徴
sql-- 従来のアプローチ(mysql クライアント)
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1;
START SLAVE;
上記のような複雑な手動設定が必要でした。
MySQL Shell のアプローチ
javascript// AdminAPI を使用した簡潔な設定
var cluster = dba.createCluster('myCluster');
cluster.addInstance('192.168.1.11:3306');
cluster.addInstance('192.168.1.12:3306');
このように、AdminAPI により劇的にシンプルな操作が可能になります。
InnoDB Cluster の基本概念
InnoDB Cluster は、以下の 3 つのコンポーネントで構成される高可用性ソリューションです。
mermaidflowchart TD
cluster["InnoDB Cluster"] --> gr["Group Replication"]
cluster --> router["MySQL Router"]
cluster --> shell["MySQL Shell"]
gr --> primary["Primary ノード"]
gr --> secondary1["Secondary ノード 1"]
gr --> secondary2["Secondary ノード 2"]
router --> read["読み取り負荷分散"]
router --> write["書き込みルーティング"]
shell --> adminapi["AdminAPI"]
shell --> monitoring["監視機能"]
Group Replication Group Replication は、InnoDB Cluster の中核技術です。従来のマスター・スレーブレプリケーションとは異なり、マルチマスター構成でデータの強一貫性を保証します。
特徴 | 従来のレプリケーション | Group Replication |
---|---|---|
構成 | マスター・スレーブ | マルチマスター |
一貫性 | 結果整合性 | 強一貫性 |
自動フェイルオーバー | 手動またはツール依存 | 自動 |
分散合意 | なし | Paxos アルゴリズム |
MySQL Router MySQL Router は、アプリケーションと MySQL クラスター間の透過的なプロキシとして動作します。
主な機能
javascript// Router による自動ルーティング設定例
router.configure({
read_write_split: true,
max_connections: 1000,
connection_pool: true,
});
AdminAPI の役割と機能
AdminAPI は、MySQL Shell の JavaScript モードで使用できる、クラスター管理専用の API です。
主要な機能分類
カテゴリ | 主な機能 | 使用頻度 |
---|---|---|
クラスター作成 | createCluster() | ★★★ 高 |
インスタンス管理 | addInstance(), removeInstance() | ★★★ 高 |
状態確認 | status(), describe() | ★★★ 高 |
設定変更 | setOption(), setInstanceOption() | ★★☆ 中 |
高度な操作 | rejoinInstance(), rescan() | ★☆☆ 低 |
基本的な API 使用例
javascript// クラスターに接続
var cluster = dba.getCluster('myCluster');
// 状態確認
cluster.status();
// インスタンス追加
cluster.addInstance('user@hostname:3306');
// 設定変更
cluster.setOption('clusterName', 'newClusterName');
AdminAPI の強力な点は、複雑な内部処理を抽象化し、直感的なメソッド名で操作できることです。従来は数十行の SQL コマンドが必要だった操作が、1 行の JavaScript で実現できるようになりました。
課題
従来の MySQL 高可用性構成の複雑さ
従来の MySQL 高可用性構成では、多数の設定ファイルと複雑な手順が必要でした。レプリケーション設定だけでも、以下のような煩雑な作業が求められていたのです。
マスター側の設定例
ini# my.cnf (マスター側設定)
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
relay-log-recovery = ON
スレーブ側の詳細設定
sql-- スレーブサーバーでの複雑な初期設定
CHANGE MASTER TO
MASTER_HOST = '192.168.1.10',
MASTER_USER = 'replication_user',
MASTER_PASSWORD = 'secure_password',
MASTER_AUTO_POSITION = 1,
MASTER_CONNECT_RETRY = 10,
MASTER_RETRY_COUNT = 86400;
START SLAVE;
-- 状態確認のための複数コマンド
SHOW SLAVE STATUS\G
SHOW MASTER STATUS\G
SELECT * FROM performance_schema.replication_group_members;
このような設定には以下の問題がありました。
問題点 | 影響度 | 発生頻度 | 対処の困難さ |
---|---|---|---|
設定ファイルの分散 | ★★★ | ★★★ | ★★★ |
手順の複雑さ | ★★★ | ★★★ | ★★☆ |
エラー時の原因特定 | ★★★ | ★★☆ | ★★★ |
バージョン間の差異 | ★★☆ | ★☆☆ | ★★★ |
複雑さを示す処理フロー図
mermaidflowchart TD
start["構築開始"] --> config1["マスター設定ファイル編集"]
config1 --> restart1["マスター再起動"]
restart1 --> user["レプリケーションユーザー作成"]
user --> backup["データベースバックアップ"]
backup --> transfer["スレーブへデータ転送"]
transfer --> config2["スレーブ設定ファイル編集"]
config2 --> restart2["スレーブ再起動"]
restart2 --> restore["データリストア"]
restore --> replication["レプリケーション開始"]
replication --> verify["動作確認"]
verify --> monitor["監視設定"]
verify -.->|エラー時| troubleshoot["トラブルシューティング"]
troubleshoot --> manual["手動復旧作業"]
この図からも分かる通り、従来の方法では 10 以上のステップと複数回の再起動が必要でした。
手動設定によるリスクと工数
手動設定には、ヒューマンエラーのリスクが常につきまといます。実際の運用現場で頻発する問題を以下にまとめました。
典型的な設定ミスとその影響
sql-- よくある設定ミス例
-- 1. server-id の重複
-- マスター: server-id = 1
-- スレーブ: server-id = 1 ← 重複エラー
-- 2. GTID設定の不整合
-- マスター: gtid-mode = ON
-- スレーブ: gtid-mode = OFF ← 不整合
-- 3. レプリケーションユーザーの権限不足
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
-- REPLICATION CLIENT権限が不足している場合
エラー対処に要する時間の統計
エラー種別 | 発生率 | 平均解決時間 | 最大解決時間 |
---|---|---|---|
設定ファイルミス | 40% | 2 時間 | 8 時間 |
権限関連エラー | 25% | 1 時間 | 4 時間 |
ネットワーク関連 | 20% | 30 分 | 3 時間 |
データ不整合 | 10% | 4 時間 | 24 時間 |
その他 | 5% | 1 時間 | 6 時間 |
これらの問題により、本来の開発業務に集中できない状況が生まれていました。
運用管理の負荷
構築後の運用フェーズでも、多くの課題がありました。日常的な監視作業だけでも、以下のような複雑なコマンドが必要でした。
複雑な監視コマンド例
sql-- レプリケーション状態の詳細確認
SELECT
MEMBER_ID,
MEMBER_HOST,
MEMBER_PORT,
MEMBER_STATE,
MEMBER_ROLE,
MEMBER_VERSION
FROM performance_schema.replication_group_members;
-- 遅延状況の確認
SELECT
CHANNEL_NAME,
SERVICE_STATE,
LAST_ERROR_NUMBER,
LAST_ERROR_MESSAGE,
LAST_ERROR_TIMESTAMP
FROM performance_schema.replication_connection_status;
-- トランザクション情報の確認
SELECT
RECEIVED_TRANSACTION_SET,
LAST_APPLIED_TRANSACTION
FROM performance_schema.replication_applier_status_by_coordinator;
運用負荷の内訳
mermaidflowchart TD
operations["日常運用タスク"] --> monitoring["監視業務<br/>(40%)"]
operations --> maintenance["メンテナンス<br/>(25%)"]
operations --> troubleshooting["障害対応<br/>(20%)"]
operations --> backup["バックアップ管理<br/>(10%)"]
operations --> others["その他<br/>(5%)"]
monitoring --> manual["手動チェック"]
monitoring --> scripts["監視スクリプト作成"]
monitoring --> alerts["アラート設定"]
maintenance --> updates["定期アップデート"]
maintenance --> config["設定変更"]
maintenance --> cleanup["ログクリーンアップ"]
運用チームの工数の約 65%が監視と障害対応に費やされており、本来注力すべき改善活動に時間を割けない状況でした。
解決策
MySQL Shell と AdminAPI による自動化
MySQL Shell の AdminAPI は、これまでの課題を根本的に解決する革新的なアプローチを提供します。複雑な手動設定を 1 つの API コールで完結させることができるのです。
従来との比較:自動化の効果
mermaidflowchart LR
traditional["従来の手動構築"] --> steps1["10+ ステップ"]
traditional --> time1["4-8 時間"]
traditional --> errors1["高いエラー率"]
adminapi["AdminAPI自動化"] --> steps2["3-5 ステップ"]
adminapi --> time2["30-60 分"]
adminapi --> errors2["低いエラー率"]
steps1 -.->|90%削減| steps2
time1 -.->|85%削減| time2
errors1 -.->|95%削減| errors2
AdminAPI の自動化機能
AdminAPI は以下の処理を自動で実行します。
javascript// 1行でクラスター作成(内部で自動実行される処理)
var cluster = dba.createCluster('production');
/*
自動実行される処理:
- Group Replication設定の最適化
- GTIDモードの有効化
- レプリケーションユーザーの作成
- セキュリティ設定の適用
- 初期データの同期
*/
自動設定される項目一覧
設定項目 | 従来の手動設定 | AdminAPI 自動設定 |
---|---|---|
server-id | 手動で一意値設定 | 自動で一意値生成 |
GTID 設定 | my.cnf で個別設定 | 自動で最適値設定 |
Group Replication | 複数パラメータ手動 | 自動で最適化 |
レプリケーションユーザー | SQL で個別作成 | 自動作成・権限付与 |
セキュリティ設定 | 個別に設定必要 | 自動でベストプラクティス適用 |
シンプルな構築手順
AdminAPI を使用することで、クラスター構築が驚くほどシンプルになります。基本的な 3 ステップで完了します。
基本構築フロー
mermaidflowchart TD
step1["Step 1:<br/>環境準備"] --> step2["Step 2:<br/>クラスター作成"]
step2 --> step3["Step 3:<br/>ノード追加"]
step3 --> complete["構築完了"]
step1 --> check1["MySQLインスタンス確認"]
step1 --> check2["ネットワーク疎通確認"]
step2 --> create["dba.createCluster()"]
step2 --> config["自動設定適用"]
step3 --> add1["cluster.addInstance()"]
step3 --> add2["自動同期開始"]
実際のコマンド例
javascript// Step 1: 接続確認
shell.connect('admin@192.168.1.10:3306');
// Step 2: クラスター作成(1行で完了)
var cluster = dba.createCluster('myCluster', {
adoptFromGR: false,
force: false,
interactive: true,
});
// Step 3: セカンダリノード追加(各ノード1行ずつ)
cluster.addInstance('admin@192.168.1.11:3306');
cluster.addInstance('admin@192.168.1.12:3306');
// 構築完了確認
cluster.status();
このように、わずか数行のコードでエンタープライズ級の高可用性クラスターが構築できます。
統合された管理機能
AdminAPI は構築だけでなく、運用管理も統一的に行えます。これまで複数のツールや複雑な SQL が必要だった作業を、一貫した API で実行できるのです。
統合管理の全体像
mermaidflowchart TD
adminapi["AdminAPI"] --> creation["作成管理"]
adminapi --> monitoring["監視管理"]
adminapi --> maintenance["保守管理"]
adminapi --> security["セキュリティ管理"]
creation --> create["createCluster()"]
creation --> add["addInstance()"]
creation --> remove["removeInstance()"]
monitoring --> status["status()"]
monitoring --> describe["describe()"]
monitoring --> check["checkInstanceState()"]
maintenance --> rejoin["rejoinInstance()"]
maintenance --> rescan["rescan()"]
maintenance --> reboot["rebootClusterFromCompleteOutage()"]
security --> reset["resetRecoveryAccountsPassword()"]
security --> config["setOption()"]
主要な管理コマンド例
javascript// 詳細なクラスター状態確認
cluster.status({ extended: 1 });
// 問題のあるインスタンスの自動復旧
cluster.rejoinInstance('admin@192.168.1.11:3306');
// クラスター設定の動的変更
cluster.setOption('clusterName', 'production-cluster');
// 全体の再スキャンと問題検出
cluster.rescan();
// セキュリティ設定の更新
cluster.resetRecoveryAccountsPassword();
管理作業の工数削減効果
管理タスク | 従来の方法 | AdminAPI | 削減率 |
---|---|---|---|
状態確認 | 複数 SQL クエリ | 1 つの API コール | 90% |
ノード追加 | 20 分の手順 | 2 分の作業 | 90% |
障害復旧 | 手動調査・復旧 | 自動検出・復旧 | 80% |
設定変更 | ファイル編集・再起動 | 動的変更 | 95% |
セキュリティ更新 | 個別サーバー作業 | 一括更新 | 85% |
これらの統合機能により、運用チームは定型作業から解放され、より価値の高い業務に集中できるようになります。
具体例
環境準備と前提条件
InnoDB Cluster を構築する前に、適切な環境準備が重要です。以下の要件を満たしていることを確認しましょう。
システム要件
項目 | 最小要件 | 推奨要件 | 備考 |
---|---|---|---|
MySQL バージョン | 8.0.17 以上 | 8.0.最新版 | Group Replication 対応必須 |
メモリ | 4GB 以上 | 8GB 以上 | ノードあたり |
ストレージ | 100GB 以上 | SSD 推奨 | IOPS 性能重要 |
ネットワーク | 1Gbps | 10Gbps | ノード間通信 |
OS | Linux/Windows | Linux 推奨 | 検証済みディストリビューション |
ネットワーク設定の確認
各ノード間の通信が正常に行えることを確認します。
bash# ポート疎通確認(各ノードで実行)
# MySQL標準ポート
nc -zv 192.168.1.11 3306
nc -zv 192.168.1.12 3306
# Group Replicationポート(MySQL port + 10000)
nc -zv 192.168.1.11 13306
nc -zv 192.168.1.12 13306
# MySQL X Protocolポート
nc -zv 192.168.1.11 33060
nc -zv 192.168.1.12 33060
MySQL インスタンスの基本設定
各ノードで以下の設定を確認・適用します。
ini# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基本設定
server-id = 1 # ノードごとに一意の値
bind-address = 0.0.0.0
port = 3306
# Group Replication用設定
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
# パフォーマンス設定
innodb-buffer-pool-size = 2G
innodb-log-file-size = 256M
innodb-flush-log-at-trx-commit = 1
sync-binlog = 1
必要なユーザーアカウントの作成
クラスター管理用のユーザーアカウントを作成します。
sql-- 各MySQLインスタンスで実行
CREATE USER 'clusteradmin'@'%' IDENTIFIED BY 'SecurePassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'clusteradmin'@'%' WITH GRANT OPTION;
GRANT BACKUP_ADMIN ON *.* TO 'clusteradmin'@'%';
GRANT CLONE_ADMIN ON *.* TO 'clusteradmin'@'%';
GRANT CONNECTION_ADMIN ON *.* TO 'clusteradmin'@'%';
GRANT REPLICATION_SLAVE_ADMIN ON *.* TO 'clusteradmin'@'%';
GRANT ROLE_ADMIN ON *.* TO 'clusteradmin'@'%';
FLUSH PRIVILEGES;
MySQL Shell 基本操作
MySQL Shell の基本操作を習得することで、AdminAPI を効果的に活用できます。
MySQL Shell の起動と接続
bash# MySQL Shell の起動
mysqlsh
# 直接接続での起動
mysqlsh --uri clusteradmin@192.168.1.10:3306
# 接続情報を指定しての起動
mysqlsh --host=192.168.1.10 --port=3306 --user=clusteradmin
操作モードの切り替え
javascript// JavaScript モードに切り替え(デフォルト)
\js
// Python モードに切り替え
\py
// SQL モードに切り替え
\sql
// 接続状態の確認
\status
// 現在の接続情報表示
session
基本的な接続操作
javascript// セッション接続の確立
shell.connect('clusteradmin@192.168.1.10:3306');
// 複数の接続方法
var session1 = mysql.getSession(
'clusteradmin@192.168.1.10:3306'
);
var session2 = shell.openSession(
'clusteradmin@192.168.1.11:3306'
);
// 接続状態の確認
session.isOpen();
// 接続の切断
session.close();
DBA オブジェクトの基本操作
javascript// dba オブジェクトの利用開始
dba;
// インスタンスの設定チェック
dba.checkInstanceConfiguration(
'clusteradmin@192.168.1.10:3306'
);
// インスタンスの設定適用
dba.configureInstance('clusteradmin@192.168.1.10:3306');
// 利用可能なクラスターの確認
dba.getClusters();
InnoDB Cluster 構築手順
実際のクラスター構築を段階的に進めていきます。以下の手順で確実に環境を構築できます。
Phase 1: プライマリノードでのクラスター作成
javascript// Step 1: プライマリノードに接続
shell.connect('clusteradmin@192.168.1.10:3306');
// Step 2: インスタンス設定の確認と適用
dba.configureInstance('clusteradmin@192.168.1.10:3306', {
interactive: true,
restart: true,
});
// Step 3: クラスターの作成
var cluster = dba.createCluster('ProductionCluster', {
clusterName: 'ProductionCluster',
exitStateAction: 'READ_ONLY',
memberWeight: 50,
consistency: 'BEFORE_ON_PRIMARY_FAILOVER',
expelTimeout: 0,
autoRejoinTries: 3,
});
// Step 4: 作成確認
cluster.status();
Phase 2: セカンダリノードの追加
javascript// セカンダリノード1の追加
cluster.addInstance('clusteradmin@192.168.1.11:3306', {
password: 'SecurePassword123!',
recoveryMethod: 'clone',
waitRecovery: 2,
memberWeight: 50,
});
// セカンダリノード2の追加
cluster.addInstance('clusteradmin@192.168.1.12:3306', {
password: 'SecurePassword123!',
recoveryMethod: 'clone',
waitRecovery: 2,
memberWeight: 50,
});
// 全ノード追加後の状態確認
cluster.status({ extended: 1 });
Phase 3: 設定の最適化
javascript// クラスターレベルの設定最適化
cluster.setOption('clusterName', 'ProductionCluster');
cluster.setOption('exitStateAction', 'READ_ONLY');
// 個別インスタンスの設定調整
cluster.setInstanceOption(
'192.168.1.10:3306',
'memberWeight',
100
);
cluster.setInstanceOption(
'192.168.1.11:3306',
'memberWeight',
50
);
cluster.setInstanceOption(
'192.168.1.12:3306',
'memberWeight',
50
);
// 設定変更の確認
cluster.describe();
構築完了時の状態表示例
javascript// 最終的な状態確認コマンド
cluster.status({ extended: 2 });
/* 期待される出力例:
{
"clusterName": "ProductionCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "192.168.1.10:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"192.168.1.10:3306": {
"address": "192.168.1.10:3306",
"memberRole": "PRIMARY",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"192.168.1.11:3306": {
"address": "192.168.1.11:3306",
"memberRole": "SECONDARY",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"192.168.1.12:3306": {
"address": "192.168.1.12:3306",
"memberRole": "SECONDARY",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
}
}
*/
動作確認とテスト
クラスター構築後は、正常に動作することを確認する必要があります。以下のテストを実行して、高可用性機能が正しく動作することを検証しましょう。
基本的な動作確認
javascript// 1. クラスター全体の状態確認
cluster.status({ extended: 2 });
// 2. 各ノードの詳細情報確認
cluster.describe();
// 3. Group Replication の状態確認
session.runSql(
'SELECT MEMBER_HOST, MEMBER_PORT, MEMBER_STATE, MEMBER_ROLE ' +
'FROM performance_schema.replication_group_members'
);
データ同期のテスト
sql-- プライマリノードでテストデータベース作成
CREATE DATABASE cluster_test;
USE cluster_test;
CREATE TABLE sync_test (
id INT AUTO_INCREMENT PRIMARY KEY,
message VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- テストデータの挿入
INSERT INTO sync_test (message) VALUES
('Test message 1'),
('Test message 2'),
('Test message 3');
javascript// セカンダリノードでデータ同期確認
var secondary = mysql.getSession(
'clusteradmin@192.168.1.11:3306'
);
secondary.runSql('SELECT * FROM cluster_test.sync_test');
// 結果が一致することを確認
フェイルオーバーテスト
フェイルオーバー機能の動作を確認します。
javascript// 1. 現在のプライマリノード確認
cluster.status();
// 2. プライマリノードの故意停止(テスト環境のみ)
// 実際の環境では注意が必要
var primarySession = mysql.getSession('clusteradmin@192.168.1.10:3306');
primarySession.runSql("SHUTDOWN");
// 3. フェイルオーバー後の状態確認(30秒後程度)
setTimeout(() => {
cluster.status();
}, 30000);
// 4. 新しいプライマリでの書き込みテスト
INSERT INTO cluster_test.sync_test (message) VALUES ('After failover test');
パフォーマンステスト
javascript// 読み取り専用クエリの負荷分散確認
for (let i = 0; i < 10; i++) {
let result = session.runSql(
'SELECT COUNT(*) as record_count FROM cluster_test.sync_test'
);
print(`Query ${i + 1}: ${result.fetchOne()[0]} records`);
}
// 書き込みクエリのプライマリ集約確認
for (let i = 0; i < 5; i++) {
session.runSql(`INSERT INTO cluster_test.sync_test (message)
VALUES ('Performance test ${i + 1}')`);
}
ネットワーク分断テスト
bash# ネットワーク分断のシミュレーション(Linux環境)
# セカンダリノード1台を一時的に分離
# 192.168.1.11 ノードで実行
sudo iptables -A INPUT -s 192.168.1.10 -j DROP
sudo iptables -A INPUT -s 192.168.1.12 -j DROP
# 30秒後に復旧
sleep 30
sudo iptables -F
# MySQL Shell でクラスター状態確認
cluster.status();
テスト結果の期待値
テスト項目 | 期待結果 | 確認方法 |
---|---|---|
データ同期 | 全ノードで同一データ | SELECT 結果比較 |
自動フェイルオーバー | 30 秒以内で完了 | cluster.status() |
分断ノード復旧 | 自動再参加 | 自動回復確認 |
読み取り負荷分散 | セカンダリノードに分散 | 接続先確認 |
書き込み処理 | プライマリノードに集約 | 実行ノード確認 |
これらのテストがすべて正常に完了すれば、InnoDB Cluster の構築と動作確認が完了です。
まとめ
構築のポイント整理
MySQL Shell AdminAPI を活用した InnoDB Cluster 構築において、成功の鍵となる重要なポイントをまとめます。
技術的なポイント
カテゴリ | 重要度 | 注意事項 | 推奨設定 |
---|---|---|---|
ネットワーク設定 | ★★★ | 全ポートの疎通確認 | 専用ネットワーク推奨 |
MySQL 設定 | ★★★ | GTID/binlog 設定必須 | 自動設定を活用 |
ユーザー権限 | ★★★ | 十分な権限付与 | 専用管理ユーザー作成 |
リソース配分 | ★★☆ | メモリ・ディスク容量 | 推奨値以上を確保 |
セキュリティ | ★★☆ | SSL/認証設定 | 本番環境では必須 |
運用面でのポイント
mermaidflowchart TD
operation["運用のベストプラクティス"] --> monitoring["継続的監視"]
operation --> backup["バックアップ戦略"]
operation --> maintenance["定期メンテナンス"]
operation --> documentation["ドキュメント化"]
monitoring --> automated["自動監視設定"]
monitoring --> alerting["アラート設定"]
monitoring --> logging["ログ管理"]
backup --> regular["定期バックアップ"]
backup --> testing["復旧テスト"]
backup --> offsite["オフサイト保管"]
maintenance --> updates["定期アップデート"]
maintenance --> optimization["性能最適化"]
maintenance --> cleanup["ログローテーション"]
AdminAPI 活用のメリット総括
従来の手動構築から AdminAPI への移行による改善効果をまとめます。
改善項目 | 改善前 | 改善後 | 改善率 |
---|---|---|---|
構築時間 | 4-8 時間 | 30-60 分 | 85%短縮 |
エラー発生率 | 20-30% | 2-5% | 90%削減 |
必要スキルレベル | 上級者 | 中級者 | アクセシビリティ向上 |
運用工数 | 週 20 時間 | 週 5 時間 | 75%削減 |
障害復旧時間 | 2-4 時間 | 10-30 分 | 85%短縮 |
運用時の注意点
本番環境での運用においては、以下の点に特に注意が必要です。
監視とアラート設定
javascript// 定期的な健全性チェック
function healthCheck() {
try {
var clusterStatus = cluster.status();
if (clusterStatus.defaultReplicaSet.status !== 'OK') {
console.log(
'警告: クラスター状態が正常ではありません'
);
console.log(JSON.stringify(clusterStatus, null, 2));
}
// パフォーマンスメトリクスの確認
var metrics = session.runSql(`
SELECT
MEMBER_HOST,
MEMBER_STATE,
MEMBER_ROLE
FROM performance_schema.replication_group_members
WHERE MEMBER_STATE != 'ONLINE'
`);
if (metrics.hasData()) {
console.log('警告: オフラインノードが検出されました');
}
} catch (error) {
console.log(
'エラー: 健全性チェックに失敗しました',
error
);
}
}
// 定期実行設定(例:5分間隔)
setInterval(healthCheck, 300000);
バックアップ戦略
bash# MySQL Shellを使用したバックアップ
mysqlsh -- util dump-schemas cluster_test \
--outputUrl=/backup/cluster_test_$(date +%Y%m%d_%H%M%S) \
--threads=4 \
--compress \
--showProgress
# 定期バックアップスクリプト例
#!/bin/bash
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
# クラスター全体のバックアップ
mysqlsh --uri clusteradmin@localhost:3306 --password \
-- util dump-instance $BACKUP_DIR/full_$DATE \
--excludeSchemas=sys,mysql,information_schema,performance_schema
# 古いバックアップの削除(7日以上前)
find $BACKUP_DIR -name "full_*" -mtime +7 -exec rm -rf {} \;
セキュリティ考慮事項
javascript// 定期的なパスワード更新
cluster.resetRecoveryAccountsPassword();
// SSL設定の確認
cluster.checkInstanceState(
'clusteradmin@192.168.1.10:3306'
);
// 監査ログの有効化
session.runSql("SET GLOBAL audit_log_policy='ALL'");
緊急時対応手順
緊急事態に備えて、以下の手順を事前に準備しておくことを強く推奨します。
javascript// 完全停止からの復旧手順
function emergencyRecovery() {
try {
// 1. 最新のデータを持つノードの特定
// 2. そのノードからクラスターを再起動
var cluster = dba.rebootClusterFromCompleteOutage(
'ProductionCluster'
);
// 3. 他のノードの再参加
cluster.rejoinInstance(
'clusteradmin@192.168.1.11:3306'
);
cluster.rejoinInstance(
'clusteradmin@192.168.1.12:3306'
);
// 4. 状態確認
cluster.status();
} catch (error) {
console.log('緊急復旧中にエラーが発生しました:', error);
// エスカレーション手順に従う
}
}
適切な計画と継続的な監視により、MySQL InnoDB Cluster は企業の重要なデータベースインフラとして安定した運用が可能になります。AdminAPI の活用により、従来は専門家でなければ困難だった高可用性データベースの構築・運用が、より多くのエンジニアにとって実現可能になったことは、大きな技術革新といえるでしょう。
関連リンク
- article
MySQL Shell(mysqlsh)入門:AdminAPI で InnoDB Cluster を最短構築
- article
MySQL Optimizer Hints 実測比較:INDEX_MERGE/NO_RANGE_OPTIMIZATION ほか
- article
MySQL ロック待ち・タイムアウトの解決:SHOW ENGINE INNODB STATUS の読み解き方
- article
MySQL オプティマイザ概説:実行計画が決まるまでの舞台裏
- article
MySQL 基本操作徹底解説:SELECT/INSERT/UPDATE/DELETE の正しい書き方
- article
MySQL 入門:5 分でわかる RDBMS の基本とインストール完全ガイド
- article
【2025 年 10 月版】 Claude Sonnet 4.5 登場! Claude Pro でも使える!Claude Code のアップデート手順まで紹介
- article
Turborepo で Zustand スライスをパッケージ化:Monorepo 運用の初期設定
- article
Nuxt を macOS + yarn で最短構築:ESLint/Prettier/TS 設定まで一気通貫
- article
キャッシュ比較:WordPress で WP Rocket/LiteSpeed/W3TC を検証
- article
Nginx を macOS で本番級に構築:launchd/ログローテーション/権限・署名のベストプラクティス
- article
WebSocket を NGINX/HAProxy で終端する設定例:アップグレードヘッダーとタイムアウト完全ガイド
- blog
iPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
- blog
Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
- blog
【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
- blog
Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
- blog
Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
- blog
フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来