DBAtlas · データベース運用アトラス

MySQL InnoDB Cluster (Group Replication) の構築

症状

目標: InnoDB Cluster (Group Replication + MySQL Shell + MySQL Router) を使い、MySQL の自動フェイルオーバー付き高可用性を構築する。

1. 前提条件を満たす

InnoDB Cluster には、すべてのノードで MySQL 8.0+、一意の server_id、GTID モード、InnoDB ストレージエンジンが必要。すべてのインスタンスがネットワーク上で相互に到達可能で、テーブルに主キーがある必要がある。管理用に clusterAdmin ユーザーを用意する。

MySQL

-- my.cnf on each instance:
-- server_id unique, gtid_mode=ON, enforce_gtid_consistency=ON
CREATE USER 'icadmin'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO 'icadmin'@'%' WITH GRANT OPTION;

2. MySQL Shell で各インスタンスを構成する

mysqlsh で dba.configureInstance() を実行すると、各ノードが Group Replication に適した状態になる。不足しているパラメータを修正し、必要に応じて再起動を求める。すべてのノードで繰り返す。

MySQL

-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')

3. クラスタを作成する (シードノード)

1 つのノードに接続し、dba.createCluster() でクラスタを開始する。このノードが最初のプライマリになる。クラスタオブジェクトが返され、以降の追加に使われる。

MySQL

-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')

4. 他のインスタンスをクラスタに追加する

cluster.addInstance() でセカンダリノードを追加する。recoveryMethod には clone (物理クローン、新規ノードに高速) または incremental (GTID 経由) を選ぶ。少なくとも 3 ノードで奇数の過半数と自動フェイルオーバーが得られる。

MySQL

-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})

5. MySQL Router をブートストラップする

MySQL Router はアプリケーションとクラスタの間でルーティングを行う。読み取り/書き込み (6446) と読み取り専用 (6447) のポートを公開し、プライマリが変わるとトラフィックを自動的にリダイレクトする。ブートストラップはクラスタのメタデータから構成を生成する。

MySQL

mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &

6. クラスタの状態を確認し、フェイルオーバーを検証する

cluster.status() は各ノードのロール (R/W プライマリ、R/O セカンダリ) と状態 (ONLINE) を示す。clusterName とトポロジーが正常であるべきである。プライマリを停止し、新プライマリが自動的に選出されることを観察してフェイルオーバーをテストする。

MySQL

-- mysqlsh:
var cluster = dba.getCluster('appCluster')
cluster.status()
-- Members via SQL:
SELECT member_host, member_role, member_state FROM performance_schema.replication_group_members;
DBAtlas で開く →