###前提・実現したいこと
現在、Webサーバが使用するDBが、2台で準同期でレプリケーションされるように設定されています。
レプリケーション環境の構築とDBリストアの経験が無く、調べながらやっているのですが、質問は3点あるのですが、リストア時の注意点等御存じの方がいらっしゃいましたら、ご教授頂きたいです。
【1】DB1台であれば、DBに何か障害があってデータを戻す際には、バックアップのdumpファイルからリストアで良いと考えていますが、レプリケーション環境の場合、注意すべき点はありますでしょうか。
レプリケーション環境であれば、両方のDBサーバが故障した時か、DBに間違った更新を掛けたなどでDBを戻したい時だと考えています。
【2】Master/Slave両方動いている状態で、DBをバックアップから戻す場合、Master側で1日毎に以下のコマンドでdumpを作成したものをMaster側でリストアするだけで良いのでしょうか。
・リストア
/usr/bin/mysql -u root -p < dumpall_yyyyMMdd.sql
※実際はbashスクリプトで実行してdumpを作成した後、別環境にscpで送っています。
/usr/bin/mysqldump --defaults-extra-file=/root/db_backup/.conf -A > dumpall_yyyyMMdd.sql
【3】DBの障害時には以下のパターンと対処を考えていますが、他に考慮すべき点等ありますでしょうか。
■想定障害パターンと対処 DB1:Master DB2:Slave パターン1.DB2側の故障(Webサーバ・DB1側の影響はなし) =>DB2環境を再構築し、準同期レプリケーション設定までを行うことで、レプリケーションされる。 パターン2.DB1側の故障(Webサーバ・DB2側の影響はある) =>DB2をMasterに昇格し、Webサーバが向いているDBをDB2に変更する。 DB1 mysqlサービス停止 # systemctl stop mysqld DB2 Slave→Master昇格 mysql> stop slave; mysql> reset master; mysql> exit DB2 設定ファイル変更 # vim /etc/my.cnf rpl_semi_sync_master_enabled = 1 #rpl_semi_sync_slave_enabled = 1 =>DB1が復旧したら、レプリケーションを再構築するため、 [1]DB2側でDBをロック mysql> FLUSH TABLES WITH READ LOCK; [2]show master status;でmaster statusの値を確認 [3]MySQLのスナップショットを取得 # cd /var/lib # tar cvzf /tmp/mysql-snapshot.tar.gz ./mysql [4]ロックを解除し、取得したスナップショットをDB1へ転送。 mysql> UNLOCK TABLES; # scp -i /root/key.pem /tmp/mysql-snapshot.tar.gz root@10.0.1.1:/tmp/ [5]DB1のmysqlを停止し、MySQLのデータファイルを削除 # systemctl stop mysqld # rm -rf /var/lib/mysql [6]DB2から転送したスナップショットを解凍 # cd /tmp # tar xvzf mysql-snapshot.tar.gz # mv mysql /var/lib/ [7]uuidが記載されているファイルを削除 # rm -f /var/lib/mysql/auto.cnf [8]DB1の設定ファイル変更(rpl_semi_sync_slave_enabled = 1にする)、MySQL起動 [9]DB1のSlave設定として[2]で確認したmaster statusの値を設定 ※この時点でDB1:Slave・DB2:Masterとなる
###該当のソースコード
■Master側: # vim /etc/my.cnf ##追記 character-set-server = utf8 ## Binary Log log-bin = mysql-bin # Replication server-id = 1 slave_compressed_protocol = 1 relay-log = mysql-relay-bin rpl_semi_sync_master_enabled = 1 #rpl_semi_sync_slave_enabled = 1 log-error=/var/log/mysql/mysqld.log ■Slave側: # vim /etc/my.cnf ##追記 character-set-server = utf8 # Binary Log log-bin = mysql-bin # Replication server-id = 2 slave_compressed_protocol = 1 relay-log = mysql-relay-bin #rpl_semi_sync_master_enabled = 1 rpl_semi_sync_slave_enabled = 1 log-error=/var/log/mysql/mysqld.log ■非同期レプリケーション設定 Master側: # mysql -u root -p レプリケーション用ユーザ作成 mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.0.1.1' IDENTIFIED BY 'pass'; mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.0.1.2' IDENTIFIED BY 'pass'; Slave側: # mysql -u root -p レプリケーション用ユーザ作成 mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.0.1.1' IDENTIFIED BY 'pass'; mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.0.1.2' IDENTIFIED BY 'pass'; ■準同期レプリケーション設定 Master側: mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; Slave側: mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
###試したこと
非同期レプリケーション設定後に、レプリケーション動作確認として以下のことを実施、動作を確認しています。
1 テスト用database作成 Master側で作成 create database test01; create table test01.personal(id int, name varchar(20)); insert into test01.personal(id, name) values(1, 'testuser1'); 2 Slave側で確認 select * from test01.personal; 3 Master側でdatabase削除 mysql> drop database test01; 4 Slave側でdatabase確認 test01が無いことを確認 mysql> show databases; Slave→Master昇格(■想定障害パターンと対処のパターン2と同様の操作を実施)
###補足情報(言語/FW/ツール等のバージョンなど)
CentOS7.3
MySQL 5.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/08 02:19