MariaDB Galera Cluster を Ubuntu 14.04 にインストール


2015年 04月 07日

少し前の話になるのですが、MariaDB Galera Cluster を、Azure 仮想マシンの Ubuntu 14.04 にインストールしてみたときの手順を備忘録として。完全同期型でどのサーバーもマスターになるというのに心惹かれて導入してみました。
結論からいえば、参考にした「Installing MariaDB Galera Cluster on Debian/Ubuntu」のページに記載されている手順を、そのままコピペでいけたのですけれど、あちらは Ubuntu 12.04 使用だし、日本語のテキストも少し需要があるかもしれないということで、このブログにアップしてみます。
まず、Azure 上に Ubuntu 14.04 の仮想マシンを 2 台、仮想ネットワーク (今回の例では 172.16.  のアドレス設定) 内に新規作成します。以下、1 台目の内部アドレスは 172.16.0.4 で、2 台目は 172.16.0.5 です。作成時点では SSH のポート以外は開けていません。
また、Web サーバーになる予定の仮想マシンも Ubuntu 14.04 で作成しておきます。これのアドレスは 172.16.0.6 です。

仮想マシンが作成されたら、1 台目に ssh ログインして、root 権限で以下を実行します。


# apt-get install python-software-properties
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com
0xcbcb082a1bb943db
# add-apt-repository 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/ubuntu
precise main'
# apt-get update

# DEBIAN_FRONTEND=noninteractive apt-get install -y rsync galera
mariadb-galera-server

設定したリポジトリから、rsync、galera、mariadb-galera-server のパッケージが問題なくインストールできました。2 台目にも ssh ログインして、同様にインストールします。

それから 1 台目の仮想マシン上で、/etc/mysql/conf.d/galera.cnf を編集します。

# vi /etc/mysql/conf.d/galera.cnf
[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
#galera settings
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="my_wsrep_cluster"
wsrep_cluster_address="gcomm://172.16.0.4,172.16.0.5"
wsrep_sst_method=rsync

wsrep_cluster_name はネタ元のままにしています。wsrep_cluster_address は、今回は 2 台構成にしているので、1 台目と 2 台目の仮想ネットワーク内部の IP アドレスを指定しました。それから、インストール時に稼働中になっていた DB サーバーをいったん停止して、–wsrep-new-cluster のオプションをつけて再起動します。

# service mysql stop
* Stopping MariaDB database server mysqld                                             [ OK ]
# service mysql start --wsrep-new-cluster
* Starting MariaDB database server mysqld                                               [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.

この時点でクラスターのサイズを確認すると、以下のようになります。

# mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size"
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 1            |
+--------------+

ついでにデータベースを 1 つ作成して、Web サーバーになる予定の 172.16.0.6 からアクセスできるように設定してみました。以下はまだ、1 台目の DB サーバー上での操作です。

# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 5.5.41-MariaDB-1~precise-wsrep-log mariadb.org binary
distribution, wsrep_25.11.r4026

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.03 sec)

MariaDB [(none)]> GRANT ALL ON testdb.* TO tuser@"172.16.0.6" IDENTIFIED BY
"password";
Query OK, 0 rows affected (0.33 sec)

実際のパスワードはさすがに “password” ではなかったのですが、おいといて。次に 2 台目の DB サーバーに ssh ログインして、そちらの /etc/mysql/conf.d/galera.cnf も編集します。

# vi /etc/mysql/conf.d/galera.cnf
[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
#galera settings
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="my_wsrep_cluster"
wsrep_cluster_address="gcomm://172.16.0.4,172.16.0.5"
wsrep_sst_method=rsync

編集したら、1 台目と異なりオプションなしで DB を起動します。”ERROR 1045 (28000): Access denied for user ‘debian-sys-maint’@’localhost’ (using password: YES)” という気になるメッセージは後述の手順で出ないようにします。”cluster size” を確認してみると、期待通り “2” となっています。

# service mysql start
* Starting MariaDB database server mysqld                            [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.
# ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost'
(using password: YES)
# mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size"
FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE
VARIABLE_NAME="wsrep_cluster_size"
+--------------+
| cluster size |
+--------------+
| 2            |
+--------------+

しかし、このままだと、ネタ元に書いてある通り、停止時に [fail] となってしまったりします。以下は、この時点で実際に 2 台目で “service mysql stop” (と “service mysql start” ) を実行した結果です。

# service mysql stop
* Stopping MariaDB database server mysqld                            [fail]
# service mysql start
* Starting MariaDB database server mysqld                            [ OK ]

これを直すには、1 台目から /etc/mysql/debian.cnf を持ってきて、2 台目の /etc/mysql/debian.cnf にコピーします。それ以降は、”service mysql stop” の実行結果が [fail] ではなく [ OK ] となります。

# service mysql stop
* Stopping MariaDB database server mysqld                            [ OK ]
# service mysql start
* Starting MariaDB database server mysqld                            [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.
#

さて、1 台目と 2 台目の DB サーバーが稼働している状態で、今度は Web サーバーになる予定の 172.16.0.6 から、どう見えるかも確認しておきます。Azure の管理画面で「エンドポイント」を選び、DB サーバー側の MySQL のポートを開けておきます。それから 172.16.0.6 に ssh ログインして、以下のようにコマンド行から DB への接続を確認します。

$ mysql -u tuser -p -h "172.16.0.5" testdb
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 35
Server version: 5.5.41-MariaDB-1~precise-wsrep-log mariadb.org binary
distribution, wsrep_25.11.r4026

Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [testdb]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+
2 rows in set (0.00 sec)

MariaDB [testdb]> quit;
Bye
$

先ほど mysql コマンドで “create database testdb;” を実行したのは 1 台目の 172.16.0.4 の方でしたが、2 台目の 172.16.0.5 を接続先にして、無事 testdb を見ることができています。