MySQLで途中からSlaveをたててレプリケーションを開始する手順
2017-04-04 | カテゴリ >> サーバー小ネタ(Linux)

もともとあったDB(MySQL)をMasterにして、他のサーバにたてたMySQLをSlaveとしてレプリケーションをとりはじめる方法です。
ちなみにMySQL5.7で実施。

備忘録も兼ねてエントリなのですが、MasterのデータをSlaveにまるごとコピーする方法が
ネットで調べると /var/lib/mysql/DB_NAME の中身をまるごとコピーする方法が載っていたりして、うまく行かなかったので
mysqldumpでやった方法を掲載。

Master側サーバで作業

まずはmy.cnfにMasterとしての設定を追記
$ sudo vi /etc/my.cnf

[mysqld]
~~
log-bin=mysql-bin  #追記
server-id=1001     #追記

もちろん、server-idは好きな数字でいい。
何故かネットで探すと1001とかがよく出てくる。

設定反映

$ sudo systemctl restart mysqld.service

レプリケーションユーザ作成

master側にレプリケーション側からつなぎにくる際のユーザを作成する。
mysqlにログインして下記コマンドを実行

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'<Slaveサーバホスト名>' IDENTIFIED BY 'xxxxx';

※意味は、repl ユーザはスレーブサーバからREPLICATIONをしにくるけど、その権限を許可 的な
 IDENTIFIED BYの後は適宜Passwordを決めて入れておく。

DBをDump

masterのDBをSlaveにコピーする。
当初、 /var/lib/mysql/DB_NAME の中身をまるごとcopyする記事を見て試したが、copyしてはいけないファイル等もあるらしくうまく行かなかった。
mysqldumpが無難だし、覚えておけばWordPressのバックアップのリカバリとかも冷静に実施できそうだからいいんじゃないかなぁ

まずはmysqlにログインした状態で、書き込み禁止にしておく

>mysql flush tables with read lock;

次にログポジションを確認しておく

mysql> show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000226
         Position: 766090
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

↑これをメモしておく。
このバイナリファイルの番号と、ログポジションの番号をレプリケーション設定のコマンドを流す際に使う。

エクスポート実行(これはターミナル)
DB_NAMEを DB_NAME.dumpという名前でカレントディレクトリに出力する場合のコマンドは以下

$ mysqldump -u root -pXXXXX -r DB_NAME.dump --single-transaction DB_NAME

※XXXXはパスワード

これをSlave側サーバへ送っておく(どこでもいいけど、とりあえず/tmpへ)

$ scp DB_NAME.dump <Slaveサーバホスト名>:/tmp

ロックを解除

ログポイントがわかったので、その時点まではmysqldumpでcopy。
以降はレプリケーション開始以降にやってもらうので、lockは外す。

mysql> unlock tables;

Slave側サーバ作業

まずは同じくmy.cnfを修正
slave側はたったの1行

[mysqld]
 ~
server-id=1002   #これだけ追記

同じく番号は適当。

設定反映

$ sudo systemctl restart mysqld.service

DB作成

レプリケーションしたいDatabaseを作成
(たぶん、同じ名前じゃないとダメだと思う)

mysqlにログインして実施
mysql> create database DB_NAME;

DBインポート

さっきscpで送ったヤツを早速インポート
これはターミナルで実行

$ mysql -u root -p XXXXX DB_NAME < /tmp/DB_NAME.dump

ディレクトリのcopyよりも簡単だし、確実に実施できて良い感じ。
こんなあっさりなんだと感動すら覚えた。

レプリケーション設定を流す

Slave側のMySQLでCHANGE MASTERコマンドを実行。
さっきMASTERでメモしたバイナリの番号とログポジションを書く。

CHANGE MASTER TO
           MASTER_HOST='<MASTERサーバのホスト名>',
           MASTER_USER='repl',
           MASTER_PASSWORD='XXXXX',
           MASTER_LOG_FILE='mysql-bin.000226',   #さっきメモったやつ
           MASTER_LOG_POS=762418;      #さっきメモったやつ

レプリケーション開始

引き続きMySQLにログインした状態で下記のコマンドを発行すればレプリケーションが開始される。

mysql> start slave;

うまくいったか確認

mysql> show slave status\G
とりあえず、、

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

の2行が両方YesだったらOKらしい。
今日は最初、ログポジション間違えたりして
Slave_IO_RunningがConnectingになったり、
Slave_SQL_RunningがNOになったりしてバタバタしました。

とりあえずMasterで適当なレコードを更新してSlave側でも更新が反映されてるのを見れたので、もう今日は寝ます。
オヤスミなさい。

 

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn
2017-04-04 | カテゴリ >> サーバー小ネタ(Linux) 

関連記事

Comment





Comment



*