[MariaDB]CentOS6.6+MariaDBのクラスタ版を試してみる その1

ice_logo-5dcea9e47b780ff52f75c3c3304d54827f56211e
MySQLから新標準DBになりつつあるMariaDB
今回はそのクラスタ版であるMariaDB Galera Clusterを試してみたいとおもいます。
MySQLにもクラスタ版はありましたが、ちょっと設定が面倒な用で敬遠していましたが、調べたところこちらは意外と簡単なようなのでためしに動かしてみようとおもいました。
今回はCentOS6.6を使いました。
準備
MariaDBはMySQLの派生バージョンなので、インターフェースはみんなMySQLと同じです。つまり、共存できません。
インストール前にすべてのMySQLモジュールをいったん削除しましょう。
今回は、OSごと新規にインストールしなおしました。

今回はyumを使ってインストールを行いますが、CentOS6.6にはMariaDBのリポジトリは用意されていませんので、自分で設定する必要があります。
が!なんと、公式HPで設定ファイルを作ってくれる便利なページがあります!
https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university
このページでOS矢バージョンを選ぶと、下に設定用のテキストが表示されます。
これを、/etc/yum.repos.d/MariaDB.repo というファイルを作って貼り付ければOKです。

ちなみに、2014年11月現在、ver10.1に MariaDB-Galera-serverが入っていなかったので、ver10.0を選択しました。

yumによるインストールは以下のコマンドで行います。
DBの同期にrsyncを使うのでrsyncも一緒に入れておきます。
今回インストールした環境ではsocatというモジュールがなかったのでrpm経由で事前にインストールしました。

#rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
#yum install MariaDB-Galera-server MariaDB-client galera rsync

設定
/etc/my.cnf.d/server.cnf を新規作成し、以下のように書き込みます

[mysqld]
# 必須の設定。変更できない
query_cache_size=0
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
# チューニング
innodb_buffer_pool_size=256M
innodb_log_file_size=16M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_slave_threads=8 #スレッド数 CPU*2ぐらいらしい
# クラスタのための設定
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.0.101,192.168.0.102 #クラスタに参加するIPを書いておく
wsrep_cluster_name='GALERA_CLUSTER001'  #クラスタ名
wsrep_node_address='192.168.0.101'   #自分のIP ユニーク
wsrep_sst_method=rsync

iptablesでポートを閉じている場合は開いておきましょう。
rsyncの起動が必要です。

iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 4567 -j ACCEPT
sudo service iptables save
chkconfig rsync on

1台もない状態での起動の場合(クラスタがない場合)は以下のようにwsrep_cluster_addressを空にして起動します。

service mysql start --wsrep_cluster_address=gcomm://
または
service mysql bootstrap

[問題点]
selinuxが有効の場合は起動できないようです。今回は無効にすることで対応しました。

起動ができたらとりあえずパスワードを設定しましょう
mysqladmin -u root password パスワード
ユーザー用にLAN内のすべてのIPから接続可・全権限付与のユーザーを作ってみます

#mysql -u root -p
#grant all privileges on *.* to user01@"192.168.0.%" identified by 'password';

2台目目以降のサーバーの設定
IPアドレスを変えて同じように設定します。仮想環境だったらイメージをクローンでコピーしてIPアドレスだけ変えて起動すればOK!
ただし、サービスの起動はパラメータ不要でstartするだけでOKです。
以下のように表示されて自動的に同期されるはずです。

#service mysql start
Starting MySQL...SST in progress, setting sleep higher SUCCESS!

勝手にrsyncがかかって他のサーバーと同じ内容になった後に起動します。
データ量が少なければすぐ起動しますが、大量のデータが入っている場合はすぐには起動しません。気長に待ちましょう。

起動したらmysqlにログインして状態を見てみましょう。

MariaDB [(none)] > show status like 'wsrep_%';

wsrep_incoming_addresses にクラスタに参加しているIP一覧が出てきます。

クラスタが起動しない時
原因がさっぱりわからないのですがクラスタが起動しない場合がありました。
接続先ノードでポートを調べてみると4567が動いていませんでした。
これがないと同期されないので、いったん停止して、bootstrap付で起動し直しましょう。

#service mysql stop
#service mysql bootstrap

ポートの状態調べて、下記のように4567が起動しているのを確認したら、クラスタのべつのサーバーを立ち上げましょう。

netstat -ant | grep LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 :::3306                     :::*                        LISTEN
tcp        0      0 :::80                       :::*                        LISTEN

運用環境で立ち上げっぱなしの状態だと大丈夫なのですが、開発環境などで電源を切ったりしている場合は注意が必要なようです。

DB不整合でログにこういったエラーが出た場合は
[ERROR] WSREP: Local state seqno (115) is greater than group seqno (114): states diverged. Aborting to avoid potential data loss. Remove ‘/var/lib/mysql//grastate.dat’ file and restart if you wish to continue. (FATAL)
該当のファイルを削除してリスタートする。

rm -f /var/lib/mysql/grastate.dat
service mysql restart

これで、とりあえず使えるようになりましたが、実際には接続の分散をしないとあまり意味がありません。
アプリケーションレベルで行う方法も一応ありますが、あまりスマートではないので、ロードバランサーを使ってみたいと思います。

つづく

タイトルとURLをコピーしました