PerconaXtraDBCluster構築（CentOS7）

# 前書き
他にもさんざん記事はあるけど、とりあえず動かして覚えてみようって感じでやったので自分の備忘録的なものです。
あとで重複してる部分あるので１台目の調整終わったあとに複製しちゃった方が楽です。

# PerconaXtraDBCuster(以下PXC)とは
簡単に言うとデータベースをクラスタリング化して冗長構成にできる超便利なやつ

# サーバ構成
- １台目
  - 192.168.200.101
  - DONOR（最初にmysqlを起動するサーバ）
- ２台目
  - 192.168.200.102
  - JOINER
- ３台目
  - 192.168.200.103
  - JOINER

# １台目（DONOR）の構築手順
共通部分なので1台構築したあとに複製したりテンプレート化すると楽です
## PXCのインストール
```script:shell
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install Percona-XtraDB-Cluster-57
```

##conf設定
```script:/etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.200.101,192.168.200.102,192.168.200.103
wsrep_node_address=192.168.200.101
wsrep_node_name=pxc-cluster-node-1
wsrep_sst_auth="sstuser:!sstuser!"
server_id=1
```
設定変更箇所のみ記載

##mysql（DONOR）の起動
```script:shell
systemctl start mysql@bootstrap.service
```
最初に起動するサーバはDONORとして起動する必要があるので```@bootstrap.service```を付加する

##PXCユーザの作成
```script:shell(rootの仮パスワードの取得)
cat /var/log/mysqld.log|grep 'temporary password'
```
```script:mysql
set password for root@'localhost'=password('pswd');          // rootパスワードの変更
create user sstuser@'localhost' identified by '!sstuser!';   // ユーザの作成
grant all on *.* to sstuser@'localhost';                     // 権限の設定
```
##初期ノード状態の確認
```script:mysql
show status like 'wsrep_%';
+----------------------------------+-----------------------------------------------+
| Variable_name                    | Value                                         |
+----------------------------------+-----------------------------------------------+
| wsrep_local_state_uuid           | 6cc326c9-6606-11e7-bcc4-eedf9394e505          |
| wsrep_protocol_version           | 7                                             |
| wsrep_last_committed             | 4                                             |
| wsrep_replicated                 | 0                                             |
| wsrep_replicated_bytes           | 0                                             |
| wsrep_repl_keys                  | 0                                             |
| wsrep_repl_keys_bytes            | 0                                             |
| wsrep_repl_data_bytes            | 0                                             |
| wsrep_repl_other_bytes           | 0                                             |
| wsrep_received                   | 2                                             |
| wsrep_received_bytes             | 157                                           |
| wsrep_local_commits              | 0                                             |
| wsrep_local_cert_failures        | 0                                             |
| wsrep_local_replays              | 0                                             |
| wsrep_local_send_queue           | 0                                             |
| wsrep_local_send_queue_max       | 1                                             |
| wsrep_local_send_queue_min       | 0                                             |
| wsrep_local_send_queue_avg       | 0.000000                                      |
| wsrep_local_recv_queue           | 0                                             |
| wsrep_local_recv_queue_max       | 2                                             |
| wsrep_local_recv_queue_min       | 0                                             |
| wsrep_local_recv_queue_avg       | 0.500000                                      |
| wsrep_local_cached_downto        | 0                                             |
| wsrep_flow_control_paused_ns     | 0                                             |
| wsrep_flow_control_paused        | 0.000000                                      |
| wsrep_flow_control_sent          | 0                                             |
| wsrep_flow_control_recv          | 0                                             |
| wsrep_flow_control_interval      | [ 100, 100 ]                                  |
| wsrep_flow_control_interval_low  | 100                                           |
| wsrep_flow_control_interval_high | 100                                           |
| wsrep_flow_control_status        | OFF                                           |
| wsrep_cert_deps_distance         | 0.000000                                      |
| wsrep_apply_oooe                 | 0.000000                                      |
| wsrep_apply_oool                 | 0.000000                                      |
| wsrep_apply_window               | 0.000000                                      |
| wsrep_commit_oooe                | 0.000000                                      |
| wsrep_commit_oool                | 0.000000                                      |
| wsrep_commit_window              | 0.000000                                      |
| wsrep_local_state                | 4                                             |
| wsrep_local_state_comment        | Synced                                        |
| wsrep_cert_index_size            | 0                                             |
| wsrep_cert_bucket_count          | 22                                            |
| wsrep_gcache_pool_size           | 1320                                          |
| wsrep_causal_reads               | 0                                             |
| wsrep_cert_interval              | 0.000000                                      |
| wsrep_ist_receive_status         |                                               |
| wsrep_ist_receive_seqno_start    | 0                                             |
| wsrep_ist_receive_seqno_current  | 0                                             |
| wsrep_ist_receive_seqno_end      | 0                                             |
| wsrep_incoming_addresses         | 192.168.200.101:3306                          |
| wsrep_desync_count               | 0                                             |
| wsrep_evs_delayed                |                                               |
| wsrep_evs_evict_list             |                                               |
| wsrep_evs_repl_latency           | 3.468e-06/7.9036e-06/1.7387e-05/5.13667e-06/5 |
| wsrep_evs_state                  | OPERATIONAL                                   |
| wsrep_gcomm_uuid                 | 69a42564-6610-11e7-a37e-67c3d19bd18f          |
| wsrep_cluster_conf_id            | 1                                             |
| wsrep_cluster_size               | 1                                             |
| wsrep_cluster_state_uuid         | 6cc326c9-6606-11e7-bcc4-eedf9394e505          |
| wsrep_cluster_status             | Primary                                       |
| wsrep_connected                  | ON                                            |
| wsrep_local_bf_aborts            | 0                                             |
| wsrep_local_index                | 0                                             |
| wsrep_provider_name              | Galera                                        |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>             |
| wsrep_provider_version           | 3.20(r7e383f7)                                |
| wsrep_ready                      | ON                                            |
+----------------------------------+-----------------------------------------------+
```


wsrep_local_state_commentが```Synced```
wsrep_incoming_addressesが自分のノードIPが表示されていれば正常に初期ノードとして動いているっぽいです




# ２、３台目（JOINER）の構築手順
## PXCのインストール
```script:shell
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install Percona-XtraDB-Cluster-57
```

##conf設定
```script:/etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.200.101,192.168.200.102,192.168.200.103
wsrep_node_address=192.168.200.102   # n台目毎にノードIP変えましょう
wsrep_node_name=pxc-cluster-node-2   # n台目毎にノード名変えましょう
wsrep_sst_auth="sstuser:!sstuser!"
server_id=2                          # n台目名にID変えましょう
```

##mysql（JOINER）の起動
```script:shell
systemctl start mysql
```
正常に起動した時点で１台目のDBと同期されるため、rootのパスワードも１台目で設定したものと同じになります。

##動作確認
### どれか１つのサーバでDB作成してみる
```script:mysql(192.168.200.101)
create database testdb;
```

### DB作成したのとは別のサーバで作成したDBが存在することを確認する
```script:mysql(192.168.200.102)
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
```

#再起動方法
とりあえず１台ずつ順番に起動確認しながらやれば問題ないっぽい。
また、１台目も一度クラスタリング化されれば全てのサーバが落ちない限りは```mysql@bootstrap.service```で起動せず、```mysql```で起動できるようになります。
状態をあわせるためにも一度起動し直しておいたほうが予期せぬ動作踏みづらくなって良いかと

```script:shell
systemctl stop mysql@bootstrap.service
systemctl start mysql
```

#その他（なんか引っかかった時とかに見てね
##２台目以降のmysql起動時にコケる
SELinuxが有効になってる可能性があるので全サーバで設定するなりSELinuxを切るなりしましょう
（楽だけどサーバの公開状態によっては切るのはオススメしません）
自分がVagrantでやったときはbox指定に```centos/7```を指定してたらデフォルトで有効になっててハマりました

```script:shell
getenforce    // SELinuxのステータス確認
setenforce 0  // SELinuxを一時的に無効にする
setenforce 1  // SELinuxを一時的に有効にする
```