mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

MariaDB - レプリケーション設定(GTID 使用)!

[ サーバ構築 ] [ Linux, MariaDB ]

こんばんは。

従来からあるレプリケーションとは異なる GTID(Global Transaction ID) を使用したレプリケーション設定の記録です。

MySQL とは実装自体が異なるため、MySQL と若干設定の異なる部分もあります。

0. 前提条件

  • Master 側、Slave 側ともに MariaDB 10.0.20 を想定。
  • Master 側は既存のサーバ、Slave 側は今回新規に構築したばかりのサーバを想定。
    (Slave 側も既存のサーバの場合は、 “ibdata1”, “ib_logfile0”, “ib_logfile1” ファイルを削除(DISCARD)する作業が必要かも)
  • レプリケーション用のユーザは “repl” を想定。
  • ストレージエンジンは InnoDB を想定。
  • GTID(Global Transaction ID) がどんなものであるかは、ここでは説明しない。
  • 以下の説明で出現する設定ファイルは、環境によりパスやファイル名が異なるかもしれないので、適宜置き換えること。

1. [Master] 設定ファイルの編集

MariaDB 設定ファイル “/etc/mysql/conf.d/mariadb.cnf” を編集する。

/etc/mysql/conf.d/mariadb.cnf
1
2
3
4
5
server-id = 1           # <= ネットワーク内で重複しないよに設定
log-bin = mariadb-bin   # <= バイナリログを設定(名前は任意)
bind-address = 0.0.0.0  # <= 変更(Slave 側からもアクセスできるようにする)
                        #    もしくは、`::`
                        #    もしくは、コメントアウト

2. [Master] MariaDB サーバの再起動

1
# systemctl restart mysql

3. [Master] レプリケーション用ユーザの作成

MariaDB サーバに root でログインし、レプリケーション用(Slave 側から Master 側にログインするための)ユーザを作成する。

1
2
> GRANT REPLICATION SLAVE ON *.* TO repl@'Slave 側のホスト名 or IP アドレス' IDENTIFIED BY 'repl のパスワード';
> FLUSH PRIVILEGES;

4. [Master] DB ダンプファイルの出力

全データベースのダンプファイルを出力する。

1
# mysqldump -u root -p --all-databases --single-transaction --master-data=2 > master.sql

--master-data=2 は、ダンプファイルに -- CHANGE MASTER TO MASTER_LOG_FILE=... を出力するオプション。

5. [Master] GTID の取得

前項で取得したダンプファイルの -- CHANGE MASTER TO MASTER_LOG_FILE=... を確認し、バイナリログファイル名とポジションを控える。(ダンプファイルのサイズが大きい場合は、テキストエディタで開くのに注意!)

1
2
# head -n 30 master.sql | grep MASTER_LOG_FILE
-- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000009', MASTER_LOG_POS=330;

そして、MariaDB サーバに root でログイン後に以下を実行して GTID ポジションを取得し、控えておく。

1
2
3
4
5
6
+--------------------------------------------+
| BINLOG_GTID_POS('mariadb-bin.000009', 330) |
+--------------------------------------------+
| 0-2-10521                                  |
+--------------------------------------------+
1 row in set (0.03 sec)

6. [Slave] DB ダンプファイルのリストア

Master 側で出力した DB ダンプファイルを何かしらの方法で Slave 側へ移動し、リストアする。

1
# mysql -u root -p < master.sql

7. [Slave] 設定ファイルの編集

MariaDB 設定ファイル “/etc/mysql/conf.d/mariadb.cnf” を編集する。

/etc/mysql/conf.d/mariadb.cnf
1
2
server-id = 2          # <= ネットワーク内で重複しないように設定
log-bin = mariadb-bin  # <= バイナリログを設定(名前は任意)

8. [Slave] MariaDB サーバの再起動

1
# systemctl restart mysql

9. [Slave] レプリケーションの設定

MariaDB サーバに root でログインし、以下のように実行する。

1
2
3
4
5
6
7
8
9
> SET GLOBAL gtid_slave_pos = '0-2-10521';  # <= 3 で取得した GTID を指定
Query OK, 0 rows affected (0.32 sec)

> CHANGE MASTER TO
    -> master_host = 'Master 側のホスト名 or IPアドレス',
    -> master_user = 'repl',
    -> master_password = 'repl のパスワード',
    -> master_use_gtid = slave_pos;
Query OK, 0 rows affected (0.23 sec)

10. [Slave] レプリケーションの開始

続けて、以下のように実行する。

1
2
> START SLAVE;
Query OK, 0 rows affected (0.18 sec)

ちなみに、レプリケーションを停止するには、以下のように実行する。

1
> STOP SLAVE;

ステータスは以下で確認できる。

1
> SHOW SLAVE STATUS\G

11. 動作確認

Master 側への INSERT, UPDATE, DELETE 等が Slave 側にも反映されることを確認する。

12. レプリケーションの完全停止設定

レプリケーションの完全に停止(一時的な停止でなく、機能そのものを削除)するには、 Slave 側で以下を実行後に MariaDB サーバを再起動すればよい。

1
2
> STOP SLAVE;
> RESET SLAVE ALL;

RESET SLAVE だと HOST, USER, PASSWORD はリセットされない)

ちなみに、MySQL の古いバージョンだと、以下を実行後に MariaDB サーバを再起動すればよい。(当方、未確認)

1
2
3
> STOP SLAVE;
> RESET SLAVE;
> CHANGE MASTER TO MASTER_HOST='';

また、このレプリケーション停止設定をしなければ、 STOP SLAVE をしても MariaDB サーバ再起動時に Slave が開始されてしまう。

13. 参考サイト


GTID を使用したレプリケーションにはメリット・デメリットがあります。
よく理解した上で運用すると、サーバ運用が効率化されるのではないでしょうか。

以上。

Comments