0

VagrantとAnsibleでMySQLのHA構成を試す

VagrantとAnsibleでMySQLのHA構成を試す

MySQLのマスター1台、スレーブ2台、mysql-master-haのマネージャ1台の計4台構成です。

4台すべてを起動するとトータルで3.5GBほどメモリを使用しますので、ご注意ください。

手順は全部Ansibleで自動化してもよかったのですが、
それだとフェイルオーバーの動作がよくわからないかと思ったので、レプリケーション、HA構成の設定は手動です。

HA構成にはmysql-master-haを使用します。

■準備

VirtualBox、Vagrant、Ansibleはあらかじめインストールしておき、
ターミナル上でコマンドが実行できるようにしておいてください。

OSはCentOSを使用します。

以下のコマンドでCentOS6.5のボックスを追加します。

$ vagrant box add centos65 http://www.lyricalsoftware.com/downloads/centos65.box

適当なディレクトリで今回使うファイル一式をcloneします。
vagrant upですべてのサーバーが起動し、MySQL、mysql-master-haのインストールが行われます。
4台すべてのセットアップが終わるまで待ちます。

$ git clone https://github.com/hakuro/vagrant-mysql-ha.git
$ cd vagrant-mysql-ha
$ vagrant up

■レプリケーション設定

■my.cnfの設定

MySQL5.6には準同期のレプリケーションがありますが、今回は特に設定を行いません。
MySQLのマスター、スレーブ2台それぞれのmy.cnfにserver_idとlog-binの設定を追加します。

$ vagrant ssh mysql_master
$ sudo tee -a /etc/my.cnf <<EOT
[mysqld]
server_id=10
log-bin=mysql-bin
sync_binlog=1
EOT
$ sudo service mysqld restart
$ exit

$ vagrant ssh mysql_slave1
$ sudo tee -a /etc/my.cnf <<EOT
[mysqld]
server_id=11
log-bin=mysql-bin
sync_binlog=1
EOT
$ sudo service mysqld restart
$ exit

$ vagrant ssh mysql_slave2
$ sudo tee -a /etc/my.cnf <<EOT
[mysqld]
server_id=12
log-bin=mysql-bin
sync_binlog=1
EOT
$ sudo service mysqld restart
$ exit

*注*
以降、下記記載ルールとします。

vagrant sshは省略
マスター上の操作は「on master
スレーブ上の操作は「on slave
HAマネージャ上の操作は「on manager

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

レプリケーション用のユーザを作成します。
on master and slave

$ mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'repl';

■マスターのバイナリログのファイル名とポジションの確認

マスターのバイナリログのファイル名とポジションを表示させ、FileとPositionをメモしておきます。
通常はマスターをバックアップし、スレーブに適用する必要がありますが、セットアップ直後なので必要ないです。
on master

mysql> SHOW MASTER STATUS;
+---------------------+----------+--------------+------------------+-------------------+
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------+
| mysql-bin.XXXXXX  |      YYY |              |                  |                   |
+---------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

■スレーブをマスターに接続

メモしたバイナリログのファイル名とポジションを以下の「mysql-bin.XXXXXX」、「YYY」に当てはめて実行する。
その後、レプリケーションを開始する。
on slave

$ mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='192.168.50.10', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=YYY;
mysql> start slave;
mysql> show slave status\G
- - -

略

Slave_IO_Running
Slave_SQL_Running
共に「YES」になっていること。

- - -

問題なければスレーブをread_onlyにしておきます。
on slave

mysql> SET GLOBAL read_only = 1;

■マスターにVIPを付与する

マスターがフェイルオーバーした前後でアプリケーションがアクセスすべきIPは変化しない必要があります。
マスターのサーバーに仮想IPを付与することで、これを解決します。
フェイルオーバー時には新たなマスターになったスレーブにこの仮想IPが付与されます。
on master

$ sudo ifconfig eth1:1 192.168.50.100
$ ifconfig

■mysql-master-haの設定

MySQLのrootユーザで他のサーバーからログインできるようにする

そのままの設定ではMySQLが動作しているサーバー以外からrootユーザでログインできないため、
ログインできるように設定します。
ログイン元のIPを制限しないのはセキュリティ的に問題がありますが、今回は手元の仮想環境なので特に制限しません
on master

$ mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

■sshの公開鍵認証

各DBサーバー間で相互に公開鍵ログインできるようにし、
mysqlユーザがパスワードなしでsudoできるようにします。
on master and slave

$ sudo usermod -G wheel mysql
$ sudo su - mysql
$ ssh-keygen -b 1024 -t rsa
$ cat ~/.ssh/id_rsa.pub | sudo tee -a /vagrant/authorized_keys

HAマネージャのサーバーにはmysqlユーザがいないので
vagrantユーザが公開鍵でログインできるようにします。
on manager

$ ssh-keygen -b 1024 -t rsa
$ cat ~/.ssh/id_rsa.pub | sudo tee -a /vagrant/authorized_keys

各サーバの公開鍵が/vagrant/authorized_keysにそろったので、
これを$HOME/.ssh以下にコピーし、パーミッションの設定をします。
on master and slave

$ sudo cp /vagrant/authorized_keys /var/lib/mysql/.ssh/authorized_keys
$ sudo chown mysql:mysql /var/lib/mysql/.ssh/authorized_keys
$ sudo chmod 700 /var/lib/mysql/.ssh/authorized_keys

on manager

$ sudo cp /vagrant/authorized_keys /home/vagrant/.ssh/authorized_keys
$ sudo chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys
$ sudo chmod 700 /home/vagrant/.ssh/authorized_keys

■mysql-master-haの設定

DBサーバー上にmha用の作業ディレクトリも作っておきます。
on master and slave

$ sudo mkdir -p /var/log/masterha/app1
$ sudo chown -R mysql:mysql /var/log/masterha

HAマネージャのサーバーの設定をします。
mha用の作業ディレクトリを作成し、フェイルオーバー時にVIP等の張り替えをするperlスクリプトを配置し、
mysql-master-haの設定ファイルも配置します。
on manager

$ sudo mkdir -p /var/log/masterha/app1
$ sudo chown -R vagrant:vagrant /var/log/masterha
$ sudo cp /vagrant/mha/master_ip_failover /usr/local/bin/master_ip_failover
$ sudo chmod 755 /usr/local/bin/master_ip_failover

$ sudo touch /etc/masterha_default.cnf
$ sudo mkdir -p /etc/masterha
$ sudo tee -a /etc/masterha/app1.cnf <<EOT
[server default]
user=root
password=root
ssh_user=mysql
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
remote_workdir=/var/log/masterha/app1

repl_user=repl
repl_password=repl

master_ip_failover_script=/usr/local/bin/master_ip_failover

[server1]
hostname=192.168.50.10

[server2]
hostname=192.168.50.11
candidate_master=1

[server3]
hostname=192.168.50.12
no_master=1

■動作チェッック

sshの疎通、レプリケーションをチェックします。
on manager

$ masterha_check_ssh --conf=/etc/masterha/app1.cnf
$ masterha_check_repl --conf=/etc/masterha/app1.cnf

■マネージャの起動

バックグラウンドで起動します。
on manager

$ nohup masterha_manager --conf=/etc/masterha/app1.cnf < /dev/null >> /var/log/masterha/app1/console.log 2>&1 &

あとはマスター上のMySQLを落としてみるなりして、
マスター、スレーブが切り替わるか試してみましょう。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です