CentOS7 MariaDB10.1で Galera Cluster (systemd、SELinux対応)

# MariaDBのクラスタリング
`galera`というプラグインでクラスタリング対応されているそうな。
`10.1`ではデフォルトでgalera clusterに対応しているようなので、インストール後、ノードの設定だけで割とすんなり使えます。

初めて設定したのでメモ程度です。ご指摘あればよろしくお願いしますm(_ _)m

# MariaDB10.1リポジトリ追加

[MariaDB本家手順](https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.1)通りに。

```bash:
$ sudo vi /etc/yum.repos.d/MariaDB.repo
```

```text:/etc/yum.repos.d/MariaDB.repo
# MariaDB 10.1 CentOS repository list - created 2016-11-28 09:22 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

# インストール
１０.1ではそのままデフォルトでgarelaに対応しているそうなので、通常手順でインストールするだけ。

```bash:
$ sudo yum install MariaDB-server MariaDB-client
```

CentOS7.2のMariaDB5.5とか入っている場合は、そのまま

```bash:
$ sudo yum update mariadb
```

でアップグレードできるようです。

# 設定

必須の項目は本家の[mandatory settings](https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/#mandatory-settings)にあるので、これを参考に設定します。

## ノードの設定

```bash:
$ sudo vi /etc/my.cnf.d/server.cnf
```

```text:/etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# カンマ区切りでノードのアドレスを指定
wsrep_cluster_address=gcomm://ノード１のアドレス,ノード２のアドレス
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=IPアドレス
```

## firewallポート開放

firewalldで3306:mysql, 4567:replication, 4444:rsyncの３ポートを開放します。

レプリケーション用のネットワークを構成している場合は、そのネットワーク・インターフェースが登録されているゾーンを指定します（ゾーン名がinternalの場合は`--zone=internal`を指定）

```bash:
sudo firewall-cmd --add-port=3306/tcp --add-port=4567/tcp --add-port=4444/tcp --permanent
sudo firewall-cmd --reload
```

# SELinux対応
selinuxの設定については、[galeraのほうに記載](http://galeracluster.com/documentation-webpages/selinux.html)があるので、こちらを参考にしました。

面倒なので、用途に応じてどうぞ。

* permissiveにする（お試し用）
* mysqld_tタイプをpermissiveにする（お手軽）
* ポリシーをインストールする （上記よりセキュア）

## permissiveにする
とりあえず一時的に試したいだけなら、`Permissive`にしてしまえば動作します。

```bash:
$ sudo setenforce 0
$ sudo getenforce
Permissive
```

再起動したら戻ります。恒久的にpermissiveにするなら、`/etc/selinux/config`を書き換えます。

```bash:
$ sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
```

## mysqldをpermissiveにする

とりあえずmysqldのコンテキストのタイプ、`mysqld_t`permissiveにしてしまうお手軽方法。
SELinux全体をpermissiveにするよりはマシということで。

なお、`semanage`コマンドを使用しますので、入っていない場合はyumでインストールしてください。

```bash:
$ sudo yum install policycoreutils-python
```

mysqld_tをpermissiveに追加

```
$ sudo semanage permissive -a mysqld_t
```

なお、戻すときは

```
$ sudo semanage permissive -d mysqld_t
```


## Enforceに対応

許可が完全かどうかちょっと自信がありません…クラスタ再起動したら弾かれちゃったり、いろいろ試行錯誤してminimalを探ってこの状態です。

### rsyncのアクセスなどの許可

booleanで有効にします。

```
sudo setsebool -P nis_enabled on
```

### initrc_tmpアクセス許可
`semanage`とteのMakefileを使用しますので、入っていない場合は以下でこれらをインストールしてください。

```bash:
$ sudo yum install policycoreutils-python selinux-policy-devel
```

initrc_tmpへアクセスするコンテキストが許可するポリシーを追加します。
モジュールのソースを記述します。

```
$ vi mariadb_galera.te
```

```text:mariadb_galera.te
module mariadb_galera 1.0;

require {
    type initrc_tmp_t;
    type mysqld_t;
    type rsync_exec_t;
    class file { getattr open read execute execute_no_trans};
    class file open;
    class process setpgid;
}

#============= mysqld_t ==============
allow mysqld_t initrc_tmp_t:file open;
allow mysqld_t self:process setpgid;
allow mysqld_t rsync_exec_t:file { getattr open read execute execute_no_trans};
```

コンパイルしてインストールします。

```
$ make -f /usr/share/selinux/devel/Makefile
$ sudo semodule -i mariadb_galera.pp
```

## ノード起動

最初に起動するノードで、新規クラスターを起動します。
MariaDB 10.1.18から、新規ノードを起動するスクリプトが用意されているので、それを実行するだけ。

```bash:
$ sudo galera_new_cluster
$ systemctl status mariadb | grep Active
   Active: active (running) since 日 2016-11-00 00:00:00 JST; 0min ago
```

2番目以降のノードはふつうにsystemdで起動します。

```
$ sudo systemctl start mariadb
$ systemctl status mariadb | grep Active
   Active: active (running) since 日 2016-11-00 00:00:00 JST; 0min ago
```

# 確認

１番目のノードで、データベース`sample`を作成してみます。

```mysql:
MariaDB [(none)]> create database sample;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| test               |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]>exit;
```

２番目のノードで、先ほど作成したデータベース`sample`を確認

```mysql:
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| test               |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> exit;
```


**参考**
[設定（本家）](http://galeracluster.com/documentation-webpages/?id=mysql_galera_configuration)
[Getting Started(本家)](https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/)
[systemdで起動(本家)](https://mariadb.com/kb/en/mariadb/systemd/)