MariaDB で GTID を用いたレプリケーション
ここでは MariaDB の GTID を用いたレプリケーションを説明したいと思う。
DB のレプリケーションとは?
レプリケーションとはレプリカからも想像できると思うが、データベースの複製を行う方法を指す。
勿論、単体のデータベースの複製も行えるが、仮に全てのデータベースの複製を行った場合には「mysql」データベースも含まれるため、ユーザーの追加や権限付与などについても複製が行われるため、実質的にはサーバー環境の複製を行うことが可能になる。
方法論としてはバイナリー形式とステートメント形式(SQL文を逐次転送する)方式がある。
バイナリー形式ではの方がステートメント形式よりも高速で、ステートメント形式ではタイミング次第では矛盾が発生する可能性があるため、基本的には推奨されていない。
また、複製が行われるのはマスター側からスレイブ側にたいしてである。
マスター側で行うこと
データベースのアップグレード
データベースが古い場合なども考慮してアップグレードしておく
# mysql_upgrade |
ゴミ掃除
もしもスレーブ設定がしてあった場合や、スレーブからマスターへ昇格させるには、以前のスレーブ設定を消しておく必要がある。この時、「systemctl stop mariadb」で、MariaDB のサーバーを停止しておく。
# cd /var/lib/mysql # echo -n > multi-master.info # mv *ログ名など* /退避ディレクトリ |
「/etc/my.cnf.d/mariadb-server.cnf」を編集
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mariadb/mariadb.log pid-file=/run/mariadb/mariadb.pid character-set-server = utf8 log_bin = on gtid_domain_id = 1 server_id = 4 log_basename = server4 binlog_format = row read_only = off binlog_ignore_db=mysql |
- log_bin = on
バイナリーログを有効化。 - gtid_domain_id = 1
ドメインIDを「1」にする。(グループ化する場合等に使用) - server_id = 4
同ドメイン内ではユニークな番号を指定。 - log_basename = server4
バイナリーログの名称を指定。(mysqld Options を指定する場合は「-」を「_」に変更) - binlog_format = row
バイナリーログの内容を「ROW」に指定。(「STATEMENT」や「MIXED」も指定できるが「ROW」にする) - read_only = off
読み込み専用を「OFF」にする。(「ON」にしてもあまり効果が無い) - binlog_ignore_db=mysql
mysql データベースはレプリケーションしない。(する場合は記述は不要)
MariaDB の再起動
# systemctl restart mariadb |
レプリケーションユーザーの追加
MariaDB [(none)]> GRANT ALL ON . TO ‘repl’@’%’ DENTIFIED BY ‘PASSWORD’ with grant option; |
レプリケーションユーザーでも良いが、スレイブ側からダンプをとりたいので権限をフルに。
※ レプリケーションユーザーは、必ずスレイブ側からアクセス出来なくてはならない。
スレイブ側で行うこと
マスター側のデータのダンプ
# mysqldump –user=repl –password=PASSWORD –host=MASTER –all-databases –add-drop-database –add-drop-table –master-data –gtid –hex-blob –single-transaction > master_dump.sql |
「PASSWORD」にはレプリケーションユーザーのパスワードを、「MASTER」にはマスターの IP アドレスを指定する。
ダンプファイルの中には以下の内容が含まれるため、設定を省略できる。
CHANGE MASTER TO MASTER_USE_GTID=slave_pos; SET GLOBAL gtid_slave_pos=’1-4-1374569′; |
ダンプファイルの読み込み
# mariadb -u root -p < master_dump.sql |
「/etc/my.cnf.d/mariadb-server.cnf」を編集
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mariadb/mariadb.log pid-file=/run/mariadb/mariadb.pid character-set-server = utf8 log_bin = on gtid_domain_id = 1 server_id = 6 log_basename = slave6 binlog_format = row read_only = on |
「server_id」は同ドメイン内ではユニークな番号を指定。「read_only」は「on」を指定。
MariaDB の再起動
# systemctl restart mariadb |
マスター側への接続指定
CHANGE MASTER ‘接続名’ TO MASTER_HOST = ‘MASTER’, MASTER_USER = ‘repl’, MASTER_PASSWORD = ‘PASSWORD’, MASTER_USE_GTID = slave_pos; |
「PASSWORD」にはレプリケーションユーザーのパスワードを、「MASTER」にはマスターの IP アドレスを指定する。「接続名」には、マスター毎の名前を指定する。
レプリケーションの開始
START SLAVE ‘接続名’; SHOW ALL SLAVES STATUS \G |
参考
- MariaDB Replication
- Replication Commands
- Setting Up Replication
- Global Transaction ID
- CentOS7 + MariaDB でGTIDレプリケーション構築
- MySQL/MariaDB GTID レプリケーション詳細