×
最新の人気コンテンツ情報をまとめた
メールマガジンをお届けします

ページトップへ
Bluemixを使っているとMySQLまたはMySQL互換のサービスは、「ClearDB」のみです。Bluemixからオーダーできる「ClearDB」は、ClearDBのダッシュボード画面からクラスタ環境がAmazon Web Servicesベースであり、リージョンがUS-Eastであることがわかります。Bluemixとは別環境ですし、日本国内のデータセンターにあるわけでもないため、そのままではMySQLまたはMySQL互換のデータベースが必要なケースでは、Bluemixは使い難いです。
そこで、MySQLを必要とするWebアプリケーションをBluemix上で導入し易くするために、旧SoftLayer、現在のBluemix Infrastructure(略称:Bluemix IaaS)上に、MySQL互換のクラスタ環境を構築する手順をご紹介します。

<構築イメージ>

MySQLまたはMySQL互換を必要とするWebアプリケーションで、他のデータベースに対応していないものは意外にあります。
たとえば、地方自治体や教育機関に圧倒的なシェアの「NetCommons」、自治体向けCMSやグループウェアなどを提供する「Joruri」シリーズ、マーケティングオートメーションの「Mautic」、Webアプリケーションフレームワークの「Drupal」、請求書発行・管理システムの「抹茶請求書」や「Invoice Ninja」、中小規模企業向けのCRMやERPなどもMySQLのみサポートというのも少なくないです。

使用したサーバー

ここでは、下記のスペックのサーバーをBluemix IaaS(旧SoftLayer)にて用意しました。最小構成で検証する場合は、HAProxyを含むWebサーバー用に1台、MariaDB Serverを動かすサーバーを2台にしてください。クラスタ環境を構築するための「MariaDB Galera Cluster」の推奨は、MariaDB Serverが3台以上です。

<共通スペック>
種別:Cloud Server パブリック
OS:Ubuntu14.04-64 Minimal
CPU:1コア × 2.0GHz
メモリ:1GB
ストレージ:25GB
IPアドレス:パブリック IP と プライベート IP を1つずつ
ネットワーク速度:100 Mbps

<各ホスト名>
HAProxyを含むWebサーバー:bluemix-web ← 余裕があればHAProxy用にサーバーは独立させます。
DBサーバー:1台目 node1, 2台目 node2, 3台目 node3...のように用意。最低 2台、推奨は3台以上。

<各IPアドレス>
HAProxyを含むWebサーバー:パブリック IP 169.50.1.20, プライベートIP 10.12.18.14
各DBサーバー
1台目 プライベートIP 10.12.18.20
2台目 プライベートIP 10.12.18.21
3台目 プライベートIP 10.12.18.22
とします。

クラスタ環境に用いるDBサーバーの準備

DBサーバーで使用するソフトウェアやポート設定は共通ですから、下記のシェルスクリプトを用いて、ざくっとDBサーバーに必要なソフトウェアを入れてしまいます。DBには、MariaDB Serverを用います。MariaDB Serverには、クラスタ環境を構築する「MariaDB Galera Cluster」が含まれます。
# nano setup.sh
下記をコピー&ペーストし、Ctrlキー + xキーを押し、yキーで保存します。
#!/bin/bash

apt-get update -y && apt-get upgrade -y
apt-get install wget unzip nano software-properties-common curl git -y
echo "Asia/Tokyo" | tee /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
add-apt-repository 'deb [arch=amd64,i386] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.1/ubuntu trusty main'
apt-get update -y && apt-get install mariadb-server rsync sysv-rc-conf -y
service mysql stop
ufw allow 22/tcp
ufw allow 3306/tcp
ufw allow 4444/tcp
ufw allow 4567/tcp
ufw allow 4568/tcp
実行権限を適用し、シェルスクリプトを実行します。
# chmod a+x setup.sh
# ./setup.sh
途中、データベースの管理者パスワードの入力を求められますので入力します。
完了後、下記のコマンドを実行し、yキーを押しますとファイアウォールが有効になります。その後、再起動します。
# ufw enable
# reboo
この順序で、最低2台立ち上げます。
2台以上実行しましたら、MariaDB Serverの設定を変更します。
# nano /etc/mysql/my.cnf
bind-address=127.0.0.1 に、#を追加して無効化します。
# bind-address=127.0.0.1
また、[galera]以下を次のように変更・追記します。wsrep_cluster_address=に記述するIPの数は、立ち上げたMariaDBサーバーと同じになります。
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://node1のプライベートIP,node2のプライベートIP,node3のプライベートIP...."
# 例 wsrep_cluster_address="gcomm://10.12.18.20,10.12.18.21,10.12.18.22"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_sst_method=rsync
wsrep_sst_auth=root:共通シェルスクリプト実行時に設定したDBの管理者パスワード
wsrep_cluster_name="galeracluster"
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
Ctrlキー + xキーを押し、yキーで保存します。
この作業も、起動したDB用仮想サーバーの数だけ実施します。

<1台目と2台目以降、MariaDB Serverの個別設定と起動>
1台目は、クラスタ環境の最初の1台のため、次のコマンドを実行します。
# service mysql start --wsrep-new-cluster
HAProxyで用いるDBの監視ユーザーを作成します。
# mysql -u root -p
MariaDB [(none)]> create user haproxy;
MariaDB [(none)]> grant usage on *.* to 'haproxy'@'%';
MariaDB [(none)]> exit
また、MariaDB Server導入時に自動登録された「debian-sys-maint」のパスワードをメモしておきます。
# cat /etc/mysql/debian.cnf

2台目以降は、1台目と異なり同じ作業を繰り返します。
下記を実行し、メモしておいた1台目の「debian-sys-maint」のパスワードを用い、パスワードを書き換えます。
# nano /etc/mysql/debian.cnf
Ctrlキー + xキーを押し、yキーで保存します。
次に、MariaDB Serverを起動します。
# service mysql start
HAProxyで用いるDBの監視ユーザーを作成します。
# mysql -u root -p
MariaDB [(none)]> create user haproxy;
MariaDB [(none)]> grant usage on *.* to 'haproxy'@'%';
MariaDB [(none)]> exit
2台目以降では、1台目を除く起動した台数分だけの作業を行います。

HAProxyの準備

MariaDB Galera Clusterによるクラスタ環境を準備しましたので、用意したHAProxy含むWebサーバー用のサーバーから、クラスタ化したデータベースに接続する設定手順についてお話します。
先ず、MariaDB-clientとHAProxy、Apache2をインストールします。Apache2は必須ではありませんが、Drupalなどを動かそうとしている場合は、Apache2とともにPHPやRubyなどもインストールされることでしょう。
1つ1つコマンドを打ち込むことが面倒なので、シェルスクリプトを作成してまとめてインストールします。
# nano setup.sh
下記をコピー&ペーストし、Ctrlキー + xキーを押し、yキーで保存します。
#!/bin/bash

apt-get update -y && apt-get upgrade -y
apt-get install wget unzip nano software-properties-common curl git -y
echo "Asia/Tokyo" | tee /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
add-apt-repository 'deb [arch=amd64,i386] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.1/ubuntu trusty main'
apt-get update -y && apt-get install mariadb-client sysv-rc-conf apache2 haproxy -y
ufw allow 22/tcp
ufw allow 3306/tcp
実行権限を適用し、シェルスクリプトを実行します。
# chmod a+x setup.sh
# ./setup.sh
次に、HAProxyの設定に準備したクラスタ化した各DBサーバーのプライベートIPなどを追記します。
# nano /etc/haproxy/haproxy.cfg
表示された最下部に追記します。追記内容は、Galera Clusterのオンラインヘルプを参考にしています。
listen galera HAProxy含むWebサーバーのプライベートIP:3306
   balance source
   mode tcp
   option tcpka
   option mysql-check user haproxy
   server node1 1台目のMariaDBサーバー プライベートIP:3306 check weight 1
   server node2 2台目のMariaDBサーバー プライベートIP:3306 check weight 1
server node3 3台目のMariaDBサーバー プライベートIP:3306 check weight 1
追記例
listen galera 10.12.18.14:3306
   balance source
   mode tcp
   option tcpka
   option mysql-check user haproxy
   server node1 10.12.18.20:3306 check weight 1
   server node2 10.12.18.21:3306 check weight 1
   server node3 10.12.18.22:3306 check weight 1
server node2以降は、設定したDBサーバーの数だけ記述します。
Ctrlキー + xキーを押し、yキーで保存し、HAProxyを起動します。
# sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy
# sysv-rc-conf haproxy on
# service haproxy start

動作確認

最後に動作確認を行います。
1台目のDBサーバーにアクセスし、下記コマンドを実行します。
# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE sample_db;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON sample_db.* TO user1@'%' IDENTIFIED BY '1qaz2wsx';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit
2台目のDBサーバーにアクセスし、1台目で作ったユーザーでアクセスできるか確認します。
# mysql -u user1 -p 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sample_db          |
+--------------------+
2 rows in set (0.00 sec)
MariaDB [(none)]> exit
3台目でも同様に確認します。クラスタ環境ができていれば、複製されているはずです。
次に、HAPoxyを含むWebサーバーにアクセスし、プライベートIPに向けてMariaDBに接続します。10.12.18.14は、ここで使用しているHAPoxyを含むWebサーバーのプライベートIPです。
# mysql -h 10.12.18.14 -u user1 -p
show databases; を実行すると、1台目のDBサーバーで作ったデータベースが表示されています。
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sample_db          |
+--------------------+
2 rows in set (0.00 sec)
次に接続しているDBサーバーのホスト名も見てみましょう。
MariaDB [(none)]> show variables like 'hostname';
+---------------+----------------------+
| Variable_name | Value |
+---------------+----------------------+
| hostname | node2.mycloud.com |
+---------------+----------------------+
1 row in set (0.00 sec)
のように表示されます。node2と出ていますから、2台目のDBサーバーを止め、再び「show variables like 'hostname';」を実行します。
MariaDB [(none)]> show variables like 'hostname';
+---------------+----------------------+ | Variable_name | Value | +---------------+----------------------+ | hostname | node1.mycloud.com | +---------------+----------------------+ 1 row in set (0.00 sec)
node1、つまり1台目のDBサーバーに切り替わったことがわかります。再び、show databases; を実行すると、1台目のDBサーバーで作ったデータベースが表示されています。
MariaDB [(none)]> show databases;
+--------------------+
| Database       |
+--------------------+
| information_schema |
| sample_db          |
+--------------------+
2 rows in set (0.00 sec)

まとめ

HAProxyへの冗長化対策については、垂直スケールで対応しつつ、それでも処理しきれなければ並行スケールも考慮に入れることになります。一から組むことで、ベアメタルサーバーによる高可用性を確保したMySQL互換のクラスタ環境を用意することや、また運用するデータセンターを選べるというのも大きなメリットです。

メジャーな一部のWeb(業務)アプリケーションには、初期セットアップ時の段階では、MySQL互換のクラスタ環境を使用することできず、クラスタとして動く前の段階でセットアップし、セットアップ後にクラスタ環境に切り替える必要があるものなどがありますから、一からMySQL互換のクラスタ環境を組む機会が無いわけではありません。
とはいえ、DBサーバーの台数が増えてくると運用保守がつらいので、BluemixにIBM純正のMySQL互換サービスが出てくることを切に願っています。