MHAを手動実行させてマスターを入れ替えてみる

*半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。*

# 前提条件
MHA環境下にあるレプリケーションが組んであるDBサーバが2台以上あること
※ MHAの導入・DBサーバ（MySQL）の準備は下記を参考にしてください
[CentOS6.5にMySQL5.5.38をインストールする手順](http://qiita.com/shotaTsuge/items/7f02fb684233188c51e1)
[MySQLでレプリケーションを組んでみる](http://qiita.com/shotaTsuge/items/87e872e6522e6cd8cea9)
[MySQLのmasterとslaveの手動切り替え](http://qiita.com/shotaTsuge/items/83e4387d6c8488677e17)
[MySQL-MHAを導入してみる]
(http://qiita.com/shotaTsuge/items/7cd21707cdbaa336a822)

# 今回の目的
- マスターサーバが生きている状態で、特定のスレーブサーバをマスターに昇格したい
- マスターサーバが生きている状態で、特定のスレーブサーバをマスターに昇格して元マスターを新マスターのスレーブに入れ替えたい

# 今回使用するコマンド
[masterha_master_switch](https://code.google.com/p/mysql-master-ha/wiki/masterha_master_switch)

# 実施
## 特定のスレーブサーバをマスターに昇格させる

### 設定ファイルの確認
```
$ cat /etc/mha.cnf
[server default]
# mha用に作成したmysqlユーザ情報
user=mha
password=mha

# mysqlのレプリ用ユーザ
repl_user=repli
repl_password=repli

# ログ・作業ディレクトリパス情報
# mysql-mha-managerのディレクトリパス
manager_workdir=/var/lib/mha
manager_log=/var/log/mha/mha.log

# mysqldb(master-slave)のディレクトリパス
remote_workdir=/var/lib/mha

# バイナリログのディレクトリパス
master_binlog_dir=/var/lib/mysql

# ssh接続ユーザ
ssh_user=mysql
# 現マスター
[server1]
hostname=XXX.XXX.XXX.XX1

# 新マスター
[server2]
hostname=XXX.XXX.XXX.XX2

[server3]
hostname=XXX.XXX.XXX.XX3

```

### masterha_master_switchコマンドで指定したサーバをマスターに昇格させる

```
#################################################################################
# 事前にMHAサーバにSSHでログインして、mysqlユーザになっていること
# 事前にMHAプロセスは停止しておく事
#################################################################################
# new_master_hostに次にマスターにしたいサーバのIPを入力する
-bash-4.1$ masterha_master_switch --master_state=alive --conf=/etc/mha.cnf --new_master_host=XXX.XXX.XXX.XX2

# 問題なければyesと入力します
It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on XXX.XXX.XXX.XX1(XXX.XXX.XXX.XX1:3306)? (YES/no): yes

# 次のマスターが指定したサーバ（ポート）でいいか聞かれるのでyesと入力する
Starting master switch from XXX.XXX.XXX.XX1(XXX.XXX.XXX.XX1:3306) to XXX.XXX.XXX.XX2(XXX.XXX.XXX.XX2:3306)? (yes/NO): yes

# 今回は仮想IPの切り替えを行わないので、問題ないのでyesと入力します
master_ip_online_change_script is not defined. If you do not disable writes on the current master manually, applications keep writing on the current master. Is it ok to proceed? (yes/NO): yes

# completed successfullyと出れば完了です
Switching master to XXX.XXX.XXX.XX2(XXX.XXX.XXX.XX2:3306) completed successfully.
```

### 確認
```
$ mysql -uroot -e "show slave status\G"
$ mysql -uroot -e "show master status\G"
```


## 特定のスレーブサーバをマスターに昇格させて元マスターを新マスターのスレーブにする

### 設定ファイルの確認
※特定のスレーブサーバをマスターに昇格させる時と変更がないので省略します

### masterha_master_switchコマンドで指定したサーバをマスターに昇格させて元マスターを新マスターのスレーブにする

```
#################################################################################
# 事前にMHAサーバにSSHでログインして、mysqlユーザになっていること
# 事前にMHAプロセスは停止しておく事
#################################################################################
# new_master_hostに次にマスターにしたいサーバのIPを入力する
# --orig_master_is_new_slaveをオプションをつけて元マスターを新マスターのスレーブにさせる
-bash-4.1$ masterha_master_switch --master_state=alive --conf=/etc/mha.cnf --new_master_host=XXX.XXX.XXX.XX2  --orig_master_is_new_slave

# 問題なければyesと入力します
It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on XXX.XXX.XXX.XX1(XXX.XXX.XXX.XX1:3306)? (YES/no): yes

# 次のマスターが指定したサーバ（ポート）でいいか聞かれるのでyesと入力する
Starting master switch from XXX.XXX.XXX.XX1(XXX.XXX.XXX.XX1:3306) to XXX.XXX.XXX.XX2(XXX.XXX.XXX.XX2:3306)? (yes/NO): yes

# 今回は仮想IPの切り替えを行わないので、問題ないのでyesと入力します
master_ip_online_change_script is not defined. If you do not disable writes on the current master manually, applications keep writing on the current master. Is it ok to proceed? (yes/NO): yes

# completed successfullyと出れば完了です
Switching master to XXX.XXX.XXX.XX2(XXX.XXX.XXX.XX2:3306) completed successfully.
```

### 確認
```
$ mysql -uroot -e "show slave status\G"
$ mysql -uroot -e "show master status\G"
```

## まとめ
以下のドキュメントを見ると他にも仮想IPの付け替えも実施出来たりする様なので、興味がある人は是非試してみて下さい。
[masterha_master_switch](https://code.google.com/p/mysql-master-ha/wiki/masterha_master_switch)
とりあえず言える事は、masterha_master_switchコマンドを知ってるとマスター切り替え作業の時とかに便利なんで覚えておくといいと思います！
実際に、本番稼動中DBサーバのマスター切り替え（+仮想IP付け替え）とかでも使ってます。
※本番稼動中のDBサーバで実施する際は、ちゃんと事前に検証してくださいね!!