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;