読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

MySQLの準同期レプリケーション

MySQL
レプリケーションとは「replication:複製」の意味通り、マスターデータをスレーブに複製、同期することで負荷分散や耐障害性の向上を目的とした技術です。 通常レプリケーション(asynchronous replication)と準同期レプリケーション(semisynchronous replication)がありますが、後者のほうがマスターとスレーブ間での齟齬が生じないのでこちらを実装します。 ◆動作環境 マスター側 IP: 192.168.234.132 スレーブ側 IP: 192.168.234.135 とします。 レプリケーション設定 ■マスター側プラグインのインストールとレプリケーション用ユーザ追加 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ユーザ名「repl」、パスワード「pw」で新規ユーザの作成 ※本番環境にあわせて変更してください mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'pw'; 新規ユーザの権限の設定 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ②/etc/my.cnf の編集 $ sudo emacs /etc/my.cnf [mysqld] log-bin=mysql-bin server-id=1 sync_binlog=1 innodb_flush_log_at_trx_commit=1 rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1500 expire_logs_days=14 設定したら一旦mysql を再起動します。 $ sudo /etc/init.d/mysql restart ③ログ位置の確認 mysql> SHOW MASTER STATUS; log-master.png File名、Position名は後々使うのでメモしておきましょう。今回は File:mysql-bin.000001 Position:107 です。 ■スレーブ側プラグインのインストール mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ②/etc/my.cnf の編集 $ sudo emacs /etc/my.cnf [mysqld] server-id=2 rpl_semi_sync_slave_enabled=1 編集したら一旦 mysql を再起動します。 $ sudo /etc/init.d/mysql restart ③マスターを指定 IP、MySQLレプリケーション用ユーザ名・パス、ログファイル名、ログ位置の情報が必要です。 mysql> CHANGE MASTER TO MASTER_HOST='192.168.234.132', MASTER_USER='repl', MASTER_PASSWORD='pw', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107; ④マスターと同期開始 mysql> STOP SLAVE IO_THREAD; mysql> START SLAVE IO_THREAD; mysql> START SLAVE; ◆動作確認1 ■マスター側 mysql> SHOW PROCESSLIST\G confirm-master.png START SLAVEした時点で、上記のreplユーザのプロセスが起動します。 ■スレーブ側 mysql> SHOW SLAVE STATUS\G confirm-slave.png Slave_IO_Running, Slave_SQL_Running が「Yes」なら、スレーブ側のスレッドは立ち上がっており、レプリケーションが動作していることになります。 Seconds_Behind_Master でスレーブ側で最後に実行されたクエリがマスター側から何秒遅れていたかを表示しており、レプリケーション完了までの目安になります。 ◆動作確認2 ■マスター側 マスター側で適当にデータベースを作成し、それがスレーブ側でも自動で作成されるか確認します。 データベースの作成 mysql> CREATE DATABASE hoge; 確認 mysql> SHOW DATABASES; comfirm-repl.png ■スレーブ側 スレーブ側で同期されているか確認 mysql> SHOW DATABASES; comfirm-repl.png 同期できていることが確認できます。 ◆補足 my.cnfの設定の詳細です。 log-bin=mysql-bin  バイナリログを生成 server-id=1  サーバ固有のIDの指定 sync_binlog=1 innodb_flush_log_at_trx_commit=1  バイナリログの欠損を防ぐための設定。1回バイナリログへ更新を行うことでディスクへのフラッシュを行う。 ※負荷が高くなる。更新が遅くなる rpl_semi_sync_master_enabled=1  準同期レプリケーションマスター動作を有効 rpl_semi_sync_master_timeout=1500  準同期レプリケーションで、更新時、SLAVEが応答しない時のタイムアウト時間を1.5秒に設定 expire_logs_days=14  ログの保持を保証する期間(日)。0以外の値にすると、ログローテーション・サーバ再起動のタイミングで自動削除 ソース: [MySQL] Semisynchronous Replication (半同期レプリケーション?)を試してみた MySQL5.5で準同期レプリケーション構築 MySQL レプリケーションの設定