クラスタ構築(2)MySQL/MariaDBレプリケーション

前回PacemakerCorosync を用いてクラスタ環境のセットアップを行った。今回は、MySQL/MariaDBをリソースに設定し、レプリケーション設定を行う。

MySQL/MariaDBレプリケーション

レプリケーションの実行環境を以下のように定義する。

項目 内容
マスター 192.168.0.11
スレーブ 192.168.0.12
対象データベース mydatabase
レプリケーションユーザ repl
レプリケーションユーザパスワード replpass

レプリケーションユーザは、REPLICATION SLAVE もしくは REPLICATION CLIENT の権限を必要とする。なお、Pacemaker と Corosyncでレプリケーションを行う場合は、これに加えて、GRANT, SUPER, RELOAD, PROCESS の権限も必要とする。

レプリケーション設定

マスターDBに対して以下の操作を行う。

  • server-idの設定
vi /etc/my.cnf

# レプリケーション対象DBの指定
replicate-do-db=mydatabase
# サーバ固有のIDを設定
server-id=1
# バイナリログを出力
log-bin=mysql-bin
  • データベースをロック
FLUSH TABLES WITH READ LOCK;
  • データベースの内容をダンプファイルに吐き出し
mysqldump --skip-lock-tables -h 192.168.0.11 -u repl -preplpass mydatabase > /tmp/database.sql
  • バイナリログの状態を確認
    スレーブDBにマスターDBのバイナリログの位置を指定するために事前に確認しておく。
SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      245 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

スレーブDBに対して以下の操作を行う。

  • server-idの設定
vi /etc/my.cnf

# レプリケーション対象DBの指定
replicate-do-db=mydatabase
# サーバ固有のIDを設定
server-id=2
# バイナリログを出力
log-bin=mysql-bin
# マスターDBの更新もバイナリログに記録する
log_slave_updates
  • 既存のDBを削除と再作成
DROP DATABASE IF EXISTS mydatabase;
CREATE DATABASE IF NOT EXISTS mydatabase;
  • ダンプファイルの読み込み
    さきほどダンプしたマスターDBのダンプファイルをスレーブDBに読み込ませる。
mysql -u repl -h 192.168.0.12 -preplpass mydatabase < /tmp/database.sql
  • マスターDBの指定
CHANGE MASTER TO MASTER_HOST='192.168.0.11', MASTER_USER='repl', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=245;
  • スレーブの開始
SLAVE START;

最後にマスターDBで以下の操作を行う

  • データベースのロックを解除
UNLOCK TABLES;

Pacemaker と Corosyncを用いたレプリケーション設定

Pacemaker と Corosync を用いてレプリケーションを設定する場合は、以下の手順で行う。

  • DBリソースの登録
    mariadb-replという名前でDBリソースを登録する。
pcs resource create mariadb-repl ocf:heartbeat:mysql binary=/usr/bin/mysqld_safe pid=/var/run/mariadb/mariadb.pid datadir=/var/lib/mysql log=/var/log/mariadb/mariadb.log replication_user=repl replication_passwd=replpass op start interval=0 timeout=120s op stop interval=0 timeout=120s op monitor interval=20s timeout=30s op monitor interval=10s role=Master timeout=30s op monitor interval=30s role=Slave timeout=30s op promote interval=0 timeout=120s op demote interval=0 timeout=120s op notify interval=0 timeout=90s
  • レプリケーションリソースの登録
    mariadb-cloneという名前でレプリケーションリソースを登録する。
pcs resource master mariadb-clone mariadb-repl master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true"
  • リソース制約の設定
    192.168.0.11がマスターDBとなるようにリソース制約を設定する。
pcs constraint location mariadb-clone prefers 192.168.0.11

MySQLに外部サーバ定義を登録する

リンクテーブルを作成するときなど、FEDERATED ストレージエンジンで使用する外部サーバーを定義する際には、CREATE SERVERコマンドを使用する。外部サーバを定義するとmysql.serversテーブルにカラムが追加されるが、SQL文で直接mysql.serversにカラムを追加すると正常に動作しないので注意が必要である。

CREATE SERVER server_name FOREIGN DATA WRAPPER mysql OPTIONS (USER 'hoge', PASSWORD 'hogehoge', HOST '192.168.0.x', DATABASE 'database_name');

以下のように追加するのはよくないぽい。

INSERT INTO `mysql`.`servers` (`Server_name` ,`Host` ,`Db` ,`Username` ,`Password` ,`Port` ,`Socket` ,`Wrapper` ,`Owner`)VALUES ('server_name', '192.168.x.1', 'database_name', 'hoge', 'hogehoge', '0', '', '1', 'mysql', '');