マスターでの更新情報をバイナリログとしてスレーブに転送、これをSQLに変換しスレーブで実行しデータ同期を行うようだ。バイナリログは逐次スレーブ側に転送される?
BackUpをとるには同じDBを作製しておく必要がある。
DBさえあればテーブル作製、フィールド更新などはレプリケーションしてくれる。
/etc/my.cnf
[mysqld] ## REPLICATION MASTER SETTING ## user = mysql server-id = 1 log-bin character-set-server = utf8
設定内容
SLAVE IP :10.1.4.142
User :repl
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.1.4.142' IDENTIFIED BY '*****';
マスタのバイナリログのどの時点からレプリケートを開始すればよいかスレーブにはわからないからないので、場所を決定するに必要となる。この場所がFileとPosition。
(Master側でDBをLock) <=変更が多くないときは不要かもでも安全のため
mysql> FLUSH TABLES WITH READ LOCK;
logファイルと、logポジションを表示
mysql> SHOW MASTER STATUS; <=(1) +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000024 | 98 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.01 sec)
DBをBackUpしてスレーブ側にコピーしてからUnLock
mysql> UNLOCK TABLES;
/etc/my.cnf
[mysqld] ## REPLICATION SLAVE SETTING server-id = 2 character-set-server = utf8 read-only <=アプリケーションからの変更禁止
以下のCHANGE MASTER TO と STOP/START SLAVE;はDBを追加するごとに必要
一度CHANGE MASTER TO は実行すればOK
mysql> CHANGE MASTER TO -> MASTER_HOST='10.99.99.202', -> MASTER_PORT=3306, <=''は不要 -> MASTER_USER='repl', -> MASTER_PASSWORD='*******', -> MASTER_LOG_FILE='mysql-bin.000024', <=MASTER側で表示したSTATUSの結果を記入 -> MASTER_LOG_POS=98; <=MASTER側で表示したSTATUSの結果を記入。''は不要 Query OK, 0 rows affected (0.04 sec)
/etc/my.cnf に設定してもOKのようだがMASTER_LOG_FILEやMASTER_LOG_POSは逐次変更するのかな? [mysqld] server-id=2 master-host=マスターサーバのアドレス master-user=repl master-password=パスワード master-port=3306
スレーブの起動
mysql> START SLAVE; Query OK, 0 rows affected (0.01 sec)
START SLAVEでマスター側に自分がスレーブであることを知らせるパケットが流れるようだ。これ以降マスタのDBが変更されるごとに、スレーブが更新される。
また、MASTER_LOG_FILEやMASTER_LOG_POSが過去の場所を示すと更新時そのポイントから実行されるので、その場所から以降発行されたSQLが実行される。
たとえば
MASTER側 ID DATA 1 aaaa 2 bbbb 3 cccc <=この場所が指定ポイントA 4 dddd 5 eeee <=SALVE START後挿入B SLAVE側 ポイントAをCHANGE MASTER TO のMASTER_LOG_FILEとMASTER_LOG_POSで指定れSTART SLAVEが実行された場合は ID DATA 4 dddd 5 eeee となる. (ID3も含まれるかも?)
スレーブの状態の表示
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.99.99.202 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000024 Read_Master_Log_Pos: 98 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 235 Relay_Master_Log_File: mysql-bin.000024 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 98 Relay_Log_Space: 235 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 1 row in set (0.00 sec) ERROR: No query specified
項目名 内容 Master_Host マスタのホスト名。 Master_User マスタへの接続に使用するユーザ名。 Master_Port マスタのポート番号。 Connect_retry マスタと接続できなかった場合に、スレーブが再接続を試みるまでの待機秒数。 Master_Log_File スレーブのI/Oスレッドが現在処理中のマスタのバイナリログファイル名。 Read_Master_Log_Pos I/Oスレッドが読み込んだマスタのバイナリログの位置。 Relay_Log_File スレーブのSQLスレッドが現在処理中のスレーブのリレーログファイル名。 Relay_Log_Pos SQL スレッドが実行完了したスレーブのリレーログの位置。 Relay_Master_Log_File SQLスレッドが最後に実行したクエリが記録されていたマスタのバイナリログファイル名。 Slave_IO_Running I/O スレッドが稼働中かどうか。 Slave_SQL_Running SQL スレッドが稼働中かどうか。 Replicate_do_db レプリケートするように指定されているデータベース名。 Replicate_ignore_db レプリケートしないように指定されているデータベース名。 Last_errno 最後に実行したクエリのエラー番号。『0』ならば成功。 Last_error 最後に実行したクエリのエラーメッセージなど。空文字はエラーがないことを示す。 Skip_counter 最後にSQL_SLAVE_SKIP_COUNTERを使用したときの値。使用していなければ『0』になる。 Exec_master_log_pos SQLスレッドが最後に実行したクエリの、マスタのバイナリログでの位置。 Relay_log_space 存在するリレーログファイルのサイズ。単位はバイト。
スレーブの停止
mysql> STOP SLAVE; Query OK, 0 rows affected (0.01 sec)
CHANGE MASTER TO を実行すると以下のファイルができるので、その情報でその後再起動は問題なく動作する。
# less /var/lib/mysql/master.info 14 mysql-bin.000024 98 10.99.99.202 repl ****** 3306 60 0
# less /var/lib/mysql/relay-log.info ./localhost-relay-bin.000002 235 mysql-bin.000024 98
レプリケーションを作製するDBやテーブルの指定
Slaveのmy.cnfに指定
[mysqld]
replicate-do-db | 対象となるデータベース名 | |
replicate-ignore-db | 対象外となるデータベース名 | |
replicate-do-table | 対象となるテーブル名 | 指定方法:データベース名.テーブル名 |
replicate-ignore-table | 対象外となるテーブル名 | 指定方法:データベース名.テーブル名 |
複数あるときは
replicate-do-db = db1
replicate-do-db = db2
のように併記する。
MySQLはデータベース単位でバイナリログに記録する/しないの指定ができ、その内容がBinlog_do_db/Binlog_ignore_dbの欄に表示されます。特に指定していない場合は全てのデータベースがバイナリログの対象
mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: mysql-bin.000024 Position: 3683 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
項目名 内容 File 使用中のバイナリログのファイル名。 Position 使用中のバイナリログの位置情報。 Binlog_do_db バイナリログに記録するように指定されているデータベース名。 Binlog_ignore_db バイナリログに記録しないように指定されているデータベース名。
バイナリログファイルも以下のように確認できるが増えるので適当に削除する。このときはスレーブのステータスのRelay_Log_File (スレーブのSQLスレッドが現在処理中のスレーブのリレーログファイル名)を指定しそれ以前を削除。
mysql> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 14329 | | mysql-bin.000002 | 445 | | mysql-bin.000003 | 3725 | | mysql-bin.000004 | 656 | (略) | mysql-bin.000022 | 253 | | mysql-bin.000023 | 117 | | mysql-bin.000024 | 3683 | +------------------+-----------+ 24 rows in set (0.01 sec)
削除
mysql> PURGE MASTER LOGS TO 'mysql-bin.000023'; Query OK, 0 rows affected (0.06 sec)
mysql> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000023 | 117 | | mysql-bin.000024 | 3683 | +------------------+-----------+ 2 rows in set (0.01 sec)
動作確認
の値がすべて同じ場合はOK
動作確認2
スレーブ
mysql> SHOW PROCESSLIST; +----+-------------+-----------+-------+---------+------------+-----------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+-------+---------+------------+-----------------------------------------------------------------------+------------------+ | 1 | system user | | NULL | Connect | 7708 | Waiting for master to send event | NULL | | 2 | system user | | NULL | Connect | 4284212285 | Has read all relay log; waiting for the slave I/O thread to update it | NULL | | 4 | root | localhost | test2 | Query | 0 | NULL | SHOW PROCESSLIST | +----+-------------+-----------+-------+---------+------------+-----------------------------------------------------------------------+------------------+ 3 rows in set (0.01 sec)
Id 1と2のようなスレッドが二つ動作していること
マスタ
mysql> SHOW PROCESSLIST; +----+------+------------------+-------+-------------+------+----------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+------------------+-------+-------------+------+----------------------------------------------------------------+------------------+ | 21 | root | localhost | test2 | Query | 0 | NULL | SHOW PROCESSLIST | | 23 | repl | 10.1.4.142:56560 | NULL | Binlog Dump | 666 | Has sent all binlog to slave; waiting for binlog to be updated | NULL | +----+------+------------------+-------+-------------+------+----------------------------------------------------------------+------------------+ 2 rows in set (0.00 sec)