CentOS7でGalera Cluster（MariaDB10.1）を構築

# CentOS7でGalera Cluster（MariaDB10.1）

さくらのクラウドを利用して、ローカルネットワーク内でMariaDB10.1系から標準搭載されている、Galera Cluster（MariaDB10.1）を構築しました。

このGalera Clusterはマスター・スレーブ方式のレプリケーションとは異なり、全てのサーバーで読み込み書き込み可能な仕組みとなります。

そのためどのサーバーを更新しても、全てのサーバーに反映されるといったことが特徴です。

この特徴によって、一部のノード（サーバー）がダウンしても他のノードが残っていればサービスが維持できたり、マスターサーバーへの負荷を分散させることができます。

詳しくは、下記のサイトが参考になると思うので、興味がある方はぜひ読んでみてください。

参考：
https://mariadb.com/kb/en/what-is-mariadb-galera-cluster/
https://www.s-style.co.jp/lp/galera/


#前提条件

ローカルネットワークで構築したCentOS7のサーバー4台

- Globalサーバー(eth0:グローバルIPアドレス、eth1:192.168.0.1)
- MariaDB1(eth0:192.168.0.2)
- MariaDB2(eth0:192.168.0.3)
- MariaDB3(eth0:192.168.0.4)
- Globalサーバーのeth1と、MariaDB1,2,3のeth0を繋いだスイッチ


※Galera Clusterのノード数の注意点として、過半数に満たないクラスターに所属するノードは処理を受け付けなくなるため、ノードの構成は奇数台にしなければいけない。
そのため今回は、最小ノード構成数の3台で行います。

参考：
https://www.s-style.co.jp/blog/2018/06/1906/

#ローカルリポジトリを構築しインストール

MariaDB各種サーバーはインターネットと疎通がないため、Globalサーバーでyumリポジトリを構築しなければいけない。

そのためGlobalサーバーでローカルリポジトリ作成後、そのローカルリポジトリーを参照し、MariaDB各種サーバーでGalera Cluster導入に必要なパッケージをインストールする。


##リポジトリとなるディレクトリを作成
```
# mkdir /root/MyRepo
```

##MariaDB10.1を/root/MyRepoにダウンロード
公式サイトを参考に自分の環境に合うMariaDB10.1のリポジトリを追加、/root/MyRepoにダウンロードする。

```
# vi /etc/yum.repos.d/MariaDB.repo

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# yum install -y --downloadonly --downloaddir=/root/MyRepo MariaDB-server MariaDB-client
```

##policycoreutils-pythonを/root/MyRepoにダウンロード
SELinuxでアクセス制限を無効にしないとGaleraClusterの起動に失敗してしまうため、MariaDBのアクセス制限だけを無効にする設定に必要な、policycoreutils-pythonを上記と同様にダウンロード。

```
# yum install -y --downloadonly --downloaddir=/root/MyRepo policycoreutils-python
```

##ローカルリポジトリを構築
createrepoというツールを使い、ローカルリポジトリを作成する。

```
# yum install -y createrepo
# createrepo /root/MyRepo/
```

成功したら、/root/MyRepo/下にrepodataディレクトリが作成されている。

```
# ls /root/MyRepo/repodata/
```

##ローカルリポジトリ参照設定
作成したローカルリポジトリをyumに参照させるために、yumの参照リポジトリ一覧である/etc/yum.repos.d/にrepoファイルを作る。

```
# vi /etc/yum.repos.d/MyRepo.repo

[MyRepo]
name=MyRepo
baseurl=file:///root/MyRepo
gpgcheck=0
```

yumのMyRepoリポジトリに、ダウンロードしたRPMパッケージがあるか確認。

```
# yum list all | grep MyRepo
```

##MariaDB1,2,3にローカルリポジトリを同期

Globalサーバーで作成した、ローカルリポジトリとローカルリポジトリの参照設定をMariaDB1,2,3にssh接続で同期する。

```
# rsync -av -e ssh /root/MyRepo/ root@192.168.0.2:/root/MyRepo/
# rsync -av -e ssh /etc/yum.repos.d/MyRepo.repo/ root@192.168.0.2:/etc/yum.repos.d/MyRepo.repo/

//MariaDB2(192.168.0.3)、MariaDB3(192.168.0.4)にも同様に設定
```

## ローカルリポジトリを参照してインストール
ローカルリポジトリを参照して、MariaDB10.1とpolicycoreutils-pythonをMariaDB1,2,3内でインストールする。

```

# yum install -y --disablerepo=\* --enablerepo=MyRepo MariaDB-server MariaDB-client
# mysql_secure_installation　//MySQLの初期設定

# yum install -y --disablerepo=\* --enablerepo=MyRepo policycoreutils-python

//MariaDB2(192.168.0.3)、MariaDB3(192.168.0.4)にも同様にインストール
```

#Galera Clusterのノード設定
MariaDB1,2,3にGalera Clusterのノード設定を、/etc/my.cnf.d/server.cnfにする。

```
[galera]
# Mandatory settings
# レプリケーションに使うGaleraライブラリのパスを指定
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# wsrep_cluster_addressはノードのIP一覧
wsrep_cluster_address=gcomm://192.168.0.2,192.168.0.3,192.168.0.4
# デフォルト
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
# クラスタリングを有効化するオプション
wsrep_on=ON　
# 管理用のクラスタ名
wsrep_cluster_name=DBCLUSTER 
#自身のノードの名称を示すのでノードごとに変更
wsrep_node_name=DBCLUSTER-NODE1 
#自身のIPを示すのでノードごとに変更
wsrep_node_address=192.168.0.2　
```

wsrepという記述は、Galera Clusterでレプリケーションの設定をするためのもの。

一番最初に立ち上げるサーバには既存サーバが無いため、gcomm:// の記述をする。


#firewallのポート解放

Galera Clusterに必要なポートを解放する必要があるので、firewalldで3306:mysql, 4567:replication, 4444:rsyncのポートを解放。

```
# firewall-cmd --add-port=3306/tcp --add-port=4567/tcp --add-port=4444/tcp --permanent
# firewall-cmd --reload
```

#SELinuxのPermissive設定

アクセス制限を無効にするが警告をだすPermissiveの設定を、MariaDB(MySQL)のみに設定する。

```
# semanage permissive -a mysqld_t
```

#Galera Clusterノード起動
MariaDB2,3が起動していないことを確認し、MariaDB1のノードで新規クラスターを起動する。

```
# galera_new_cluster
```

その後、MariaDB2,3では、通常通り起動。

```
# systemctl start mariadb
```

wsrep_local_state_commentがSyncedになっており、起動したノードがwsrep_incoming_addressesに含まれていることを確認。

```
# mysql -u root -p -e "show status like 'wsrep_%';"

//部分抜粋
+---------------------------+-------------------------------------------------+
| Variable_name             | Value                                           |
+---------------------------+-------------------------------------------------+
| wsrep_local_state_comment | Synced                                          |
| wsrep_incoming_addresses  | 192.168.0.2,192.168.0.3,192.168.0.4             |
+---------------------------+-------------------------------------------------+
```

#最終確認
最後に、それぞれのMariaDBでDBやテーブルを追加しても、他のノードでも反映されているか確認し、成功していたら、CentOS7でGalera Cluster（MariaDB10.1）の構築は終了です。

#参考URL
https://qiita.com/egnr-in-6matroom/items/f6af7318e850206bc424
https://qiita.com/Sa2Knight/items/bec1c24d78719c01a705
https://sky-joker.tech/2016/10/10/mariadb-galera-cluster%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/
https://mariadb.com/kb/en/what-is-mariadb-galera-cluster/
https://www.s-style.co.jp/lp/galera/
https://www.s-style.co.jp/blog/2018/06/1906/
https://serversmanvps.xn--ockc3f5a.com/2017/12/22/mysql%E3%81%A7%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9E%E3%82%B9%E3%82%BF-galera-cluster/