MariaDB 10.0 Galera ClusterをCentOS7にインストール

## 参考

* [MariaDB Galera Clusterを試す (1) « さくらインターネット研究所](http://research.sakura.ad.jp/2013/02/14/mariadb-galera-cluster-1/)
* [dbts2013:MariaDB Galera Cluster 活用例](http://www.slideshare.net/jshimi777/maria-db-galeracluster)
* [CentOS 7 に MariaDB Galera Cluster を入れる | あたがわの日記](http://blog.atgw.jp/archives/2931)

## 注意点

* Galera Clusterは`最低3台`で構成すること。
* 2014/12/13時点でCentOS7用10.1のパッケージが用意されていない。

# インストール

```bash:MariaDBのリポジトリ登録
cat > /etc/yum.repos.d/MariaDB.repo <<...
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
...
```

```bash:インストール
yum install --enablerepo=mariadb -y MariaDB-{Galera-server,Client} galera
```

## パスワード設定

```bash:ランダムなパスワード設定
service mysql start
mysqladmin -u root password 'eib5Eim9'
mysqladmin -u root -h `hostname` password 'eib5Eim9'
service mysql stop
```

# クラスタ設定(1台目)

構成は以下として進める。

* 仮想IP:192.168.1.110 (keepalived)
* 1台目:192.168.1.111
* 2台目:192.168.1.112
* 3台目:192.168.1.113

```bash:/etc/my.cnf.d/my_custom.cnf&nbsp;(1台目の設定)
[mysqld]
# 以下4行は変更すると起動できない
# see: http://research.sakura.ad.jp/2013/02/14/mariadb-galera-cluster-1/
default_storage_engine=InnoDB
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1

# galera
wsrep_cluster_name=DBCLUSTER
wsrep_provider='/usr/lib64/galera/libgalera_smm.so'
wsrep_sst_method=rsync
wsrep_cluster_address=gcomm://192.168.1.111,192.168.1.112,192.168.1.113
wsrep_slave_threads=4  # CPUコア数の2倍、書き込み接続数の1/4
wsrep_node_address=192.168.1.111  # 自身のIPアドレスを入力

# log
log_bin=mysql-bin
expire_logs_days=365 # 365日前のログは削除
slow_query_log=ON
long_query_time=1

character-set-server = utf8
innodb_file_per_table = 1
```

## binlog から テキストに変換

```bash:
mysqlbinlog mysql-bin.000004
```

----

```bash:初期ノード起動。他は居ないので--wsrep_cluster_address=gcomm://オプションつける。
sudo service mysql start --wsrep_cluster_address=gcomm://
```

```bash:2台目
sudo service mysql start --wsrep_cluster_address=gcomm://192.168.1.111
```

```bash:3台目
sudo service mysql start --wsrep_cluster_address=gcomm://192.168.1.111,192.168.1.112
```

----

```bash:状態確認
mysql -uroot -peib5Eim9
```

```mysql:クラスタの状態を確認
show status like 'wsrep_local_state_comment';
# Syncedを確認
show status like 'wsrep_cluster_status';
# Primaryを確認
```

```mysql:全部見るのは以下
show status like 'wsrep%';
```

# クラスタ設定(2台目,3台目)

1台目同様に設定を済ませておく。

```bash:wsrep_cluster_address=gcomm://192.168.100.4に接続される。
sudo service mysql start
```

```bash:状態確認しましょう
mysql -uroot -peib5Eim9
```

```mysql:クラスタの状態を確認
MariaDB [(none)]> show status like 'wsrep_local_state_comment';
# Syncedを確認
MariaDB [(none)]> show status like 'wsrep_cluster_status';
# Primaryを確認
MariaDB [(none)]> show status like 'wsrep_incoming_addresses';
+--------------------------+---------------------------------------+
| Variable_name            | Value                                 |
+--------------------------+---------------------------------------+
| wsrep_incoming_addresses | 192.168.1.112:3306,192.168.1.113:3306 |
+--------------------------+---------------------------------------+
# IPが上記のように2つ表示されることを確認。
```

# 動作確認

```mysql:2台目
MariaDB [(none)]> create database testdb;
MariaDB [(none)]> use testdb;
Database changed
MariaDB [testdb]> create table tbl (name text,phone text, addr text);
Query OK, 0 rows affected (0.67 sec)

MariaDB [testdb]> insert into tbl ( name, phone, addr ) values ('yamada', '03-5555-6666', 'Asia/Tokyo');
Query OK, 1 row affected (0.08 sec)
```


```mysql:1台目
MariaDB [testdb]> select * from tbl;
+--------+--------------+------------+
| name   | phone        | addr       |
+--------+--------------+------------+
| yamada | 03-5555-6666 | Asia/Tokyo |
+--------+--------------+------------+
1 row in set (0.00 sec)

MariaDB [testdb]> insert into tbl ( name, phone, addr ) values ('yamada2', '03-5555-6666', 'Asia/Tokyo');
Query OK, 1 row affected (0.18 sec)
```

```mysql:2台目
MariaDB [testdb]> select * from tbl;
+---------+--------------+------------+
| name    | phone        | addr       |
+---------+--------------+------------+
| yamada  | 03-5555-6666 | Asia/Tokyo |
| yamada2 | 03-5555-6666 | Asia/Tokyo |
+---------+--------------+------------+
2 rows in set (0.00 sec)
```

## クラスタ台数が増えてきた時

```bash:/etc/my.cnf.d/my_custom.cnf
wsrep_cluster_address=gcomm://192.168.1.111,192.168.1.112,192.168.1.113,192.168.1.114
```

のように列挙すればよい。

## binlog注意点

statementが実行されたDBサーバのみbinlogが記録される。

# スプリットブレイン状態になった時の対処

スプリットブレイン状態になった場合[ERROR 1047 (08S01): Unknown command](http://yoku0825.blogspot.jp/2014/01/galera-arbitratorgarbd.html)のようにデータの不整合を起こさないようにクエリを全く受け付けなくなる。

/var/log/mysql/〜.err を確認すると以下ログが記載されている。

```bash:/var/log/mysql/〜.err
140611  5:16:47 [ERROR] WSREP: Local state seqno (12121) is greater than group seqno (11603): states diverged. Aborting to avoid potential data loss. Remove '/var/lib/mysql//grastate.dat' file and restart if you wish to continue. (FATAL)
```

```bash:grastate.datを削除してからmariadb起動
rm -f /var/lib/mysql/grastate.dat
service mysql restart
```