Galera Cluster分断実験（Percona編）


# はじめに
Galera Clusterを色々分断してみた実験のレポートです。

みなさんはGalera Cluster使ってますか？
手軽にMulti Masterのレプリケーションが実現できて便利ですよね！
負荷分散もラクチンです。

会社でGalera Clusterて3つに分断したときとかどうなるんやろうねーみたいな話があったので実験してみました。

# 目的
何種類かのパターンでネットワーク分断を発生させてみて、Galera Clusterの挙動が下で説明するハンドリング通りになっているか確認します。

# ネットワーク分断のハンドリング
Galera Clusterにおけるネットワーク分断のハンドリングはQuorumベースの方法で行われています。

ネットワークの分断が発生すると、minorityパーティションのノードではトランザクションをコミットできなくなり、majorityパーティションが生き残ります。
スプリットブレイン対策ですね。

50%より多くのノードが属しているパーティションがmajorityとなります。
なので、2ノードのクラスタや4ノードのクラスタで半々（50%）に分断されるとどちらのパーティションもminorityとなります。

#### 参考
* [Introduction to Galera](http://www.slideshare.net/henrikingo/introduction-to-galera)

# 方法
## ミドルウェア
今回はPercona ExtraDB Clusterを使用しました。
バージョンは、Perconaが5.6、Galeraは3.7です。

ゲストOSはCentOS 6.5です。

## ネットワーク構成

ネットワーク構築が簡単なので、実験にはVagrantを使用しました。
仮想マシン1台をPercona1ノードとして立ち上げ、仮想マシンのNICをホストマシンのNICにブリッジします。

ホストマシンのNICはスイッチに接続し、LANケーブルを引っこ抜いてネットワーク分断を発生させます。

図にするとこんな感じです。

![Galera Cluster 分断実験.001.png](https://qiita-image-store.s3.amazonaws.com/0/43208/b3209e00-b118-f86d-95bf-3c97b5f0b781.png "Galera Cluster 分断実験.001.png")


今回は6ノード3分断までやりました。
2分断が5パターン、3分断が6パターンです。

今回使用した`Vagrantfile`と`my.cnf`はgistにおいてあります。
https://gist.github.com/nownabe/ad27584f7d9b03c0a73c

## 死活判定
クラスタが生きてるか死んでるかの判断は、次のコマンドで確認しました。

```mysql
mysql> select * from mysql.user;
```

分断前はこのコマンドが全ノードで成功することを確認します。
分断後、状態の遷移が落ち着いてからコマンドを実行して分断時の挙動を確認します。

また、今回は同時にネットワークを復旧させた時の死活も確認しました。
復旧は単にケーブルをSWに挿し直すだけです。


# 結果
それぞれのパターンでの実験結果を、図で示します。

「分断」列は分断後の各ノードでの死活確認結果です。
「復旧」列は復旧後の各ノードでの死活確認結果です。
（×はコマンド失敗、○は成功です）

## 2ノード / 2分断
![Galera Cluster 分断実験.002.png](https://qiita-image-store.s3.amazonaws.com/0/43208/76b48932-22f3-695b-49d7-7eb0d3462027.png "Galera Cluster 分断実験.002.png")

## 3ノード / 2分断
![Galera Cluster 分断実験.003.png](https://qiita-image-store.s3.amazonaws.com/0/43208/a0f1d741-1d8c-ebcb-2351-33b3bef4cc9c.png "Galera Cluster 分断実験.003.png")

## 4ノード / 2分断
![Galera Cluster 分断実験.004.png](https://qiita-image-store.s3.amazonaws.com/0/43208/ac99369d-7fa2-d711-eb4a-3077d32f0167.png "Galera Cluster 分断実験.004.png")

## 4ノード / 2分断
![Galera Cluster 分断実験.005.png](https://qiita-image-store.s3.amazonaws.com/0/43208/5c434396-6099-3440-5f19-08770c7d2ac5.png "Galera Cluster 分断実験.005.png")

## 5ノード / 2分断
![Galera Cluster 分断実験.006.png](https://qiita-image-store.s3.amazonaws.com/0/43208/ffaabb4e-2694-3548-0051-98999df07bb4.png "Galera Cluster 分断実験.006.png")

## 3ノード / 3分断
![Galera Cluster 分断実験.007.png](https://qiita-image-store.s3.amazonaws.com/0/43208/6f9a81bd-afd6-eed1-67c4-9f8ee26667c8.png "Galera Cluster 分断実験.007.png")

## 4ノード / 3分断
![Galera Cluster 分断実験.008.png](https://qiita-image-store.s3.amazonaws.com/0/43208/ce1e81a6-6e07-96d8-c3af-b56438ef3b66.png "Galera Cluster 分断実験.008.png")

## 5ノード / 3分断
![Galera Cluster 分断実験.009.png](https://qiita-image-store.s3.amazonaws.com/0/43208/df1376e8-5bcb-63d9-7618-dbcf37d00efd.png "Galera Cluster 分断実験.009.png")

## 5ノード / 3分断
![Galera Cluster 分断実験.010.png](https://qiita-image-store.s3.amazonaws.com/0/43208/19172f0d-4020-70b5-6584-4931abc7caab.png "Galera Cluster 分断実験.010.png")

## 6ノード / 3分断
![Galera Cluster 分断実験.011.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d392ae4e-7cd4-0bf9-fccd-5e5a873c231c.png "Galera Cluster 分断実験.011.png")

## 6ノード / 3分断
![Galera Cluster 分断実験.012.png](https://qiita-image-store.s3.amazonaws.com/0/43208/bc13c7e5-5a52-f9cb-4cef-2f3703e8703e.png "Galera Cluster 分断実験.012.png")

# 考察
なんの変哲もない結果になりました。
分断後でも50％より多いノードが属していればそのクラスタは生き続けます。
一貫性重視の動作ですね。
RDB使う用途を考えると、安心して使えそうです。

ただ、実際運用してるとGaleraは色々癖があるので注意が必要です。
今回はDBへのアクセスが一切ない状態で実験しましたが、書き込みがあると整合性の部分で色々と問題が起きそうです。
起動、停止、再起動なんかもかなり注意しないとしょっちゅう問題が起きたりします。

また、majorityができないような3分断から、majorityができるような2分断に復旧（例：1,2,2→3,2）、ということをやってみたら全員死んだままでした。

まだまだ、奥が深いです。。

# おわりに
最近はなんでもかんでも仮想化ですが、こういう実験がパッとできるので物理も大事ですね。