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

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です