MariaDB Galera Clusterをインストールしてデータベースをクラスター化

新サービスのサーバー構成を考えているときの覚書。

環境: CentOS 6.5 x86_64, MariaDB Galera Server 10.0.13

前の記事も参考に。

サービス全体のサーバー構成。

server_structure

ロードバランサー02やWeb02がいればさらに安心できる。

ちなみにMariaDB Galera Clusterの最小ノード数は「3」。今回はデータベースをクラスター化するまで。

 

参考サイト

 

目次

  1. YUM経由でインストール
  2. 起動と設定
  3. 2台目以降のノード設定
  4. クラスターに参加

 


1.YUM経由でインストール

公式サイトを参考にYUMのリポジトリを追加する。

[web01]# vi /etc/yum.repos.d/MariaDB.repo

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

 

インストール実行
[web01]# yum search MariaDB
[web01]# yum install MariaDB-Galera-server

epelリポジトリを使ったので、前の記事を参考に登録した方がいいかも。

クラスター構成なので常に稼働する前提。メンテナンスで停止するときは手動で起動するため自動起動はしないようにしておく。
[web01]# chkconfig mysql off

 

 


2.起動と設定

公式ドキュメントに従う。

設定ファイルを編集
[web01]# vi /etc/my.cnf.d/server.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

thread_handling = pool-of-threads
max_connections = 500

# Tuning
sort_buffer_size = 1MB
read_rnd_buffer_size = 1MB
join_buffer_size = 1MB
query_cache_size=16M

#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name=hoge-cluster
wsrep_cluster_address=gcomm://
wsrep_node_name=WEB01
wsrep_node_address=192.168.0.2
wsrep_slave_threads=8
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

「wsrep_provider」「wsrep_cluster_address」はなくても良さそうだけど、コメントアウトしたら動かなかった。

最初のノードとして起動する。起動スクリプトを読むと「bootstrap」を指定すると「--wsrep-new-cluster」として実行してくれるみたい。
[web01]# /etc/rc.d/init.d/mysql bootstrap

セキュリティの初期設定
[web01]# mysql_secure_installation

起動状態を確認
[web01]# mysql -u root -p

> SHOW GLOBAL VARIABLES LIKE 'wsrep_%';

MySQLコンソール終了
> quit

 

各ノードとの通信に使うポートを開ける。
参考:Galera Cluster Address - MariaDB Knowledge Base
参考:習うより慣れろ! iptablesテンプレート集(1):ステートフルパケットフィルタを使ったサービスの公開 (2/6) - @IT
[web01]# vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 192.168.0.0/24 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4567 -s 192.168.0.0/24 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4444 -s 192.168.0.0/24 -j ACCEPT

ちなみに4444はrsyncが使う。

反映。確認。
[web01]# /etc/rc.d/init.d/iptables reload
[web01]# /etc/rc.d/init.d/iptables status

 


3.2番目以降のノード設定

インストールまでは一緒。

自動起動しないようにしておく。
[app01]# chkconfig mysql off

設定ファイルを編集
[app01]# vi /etc/my.cnf.d/server.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
thread_handling = pool-of-threads
max_connections = 500

# Tuning
sort_buffer_size = 1MB
read_rnd_buffer_size = 1MB
join_buffer_size = 1MB
query_cache_size=16M

#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name=hoge-cluster
wsrep_cluster_address=gcomm://
wsrep_node_name=APP01
wsrep_node_address=192.168.0.3
wsrep_slave_threads=8
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

赤文字以外は一緒。

 

ーーー ここから。後で気付いたクラスターに参加するので不要な設定

クラスターに参加せず起動
[app01]# /etc/rc.d/init.d/mysql start

セキュリティの初期設定
[app01]# mysql_secure_installation

Web01上のphpMyAdminからログインできるユーザーを作成する。
参考:MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.4.5 MySQL への新規ユーザの追加
[app01]# mysql -p -u root mysql

> GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY 'admin#1sec' WITH GRANT OPTION;
> GRANT ALL PRIVILEGES ON *.* TO admin@'192.168.0.%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION;

> select host, user from user;

> quit

。。。とやったけど、同期後(クラスターに参加後)はWEB01で上書きされるのでWEB01で設定しておけば大丈夫だった。

ーーー ここまで。後で気付いたクラスターに参加するので不要な設定

 

次はファイヤーウォール(iptables)を設定。WEB01と同じ。ローカルIP以外はアクセス不可にする。
[app01]# vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 192.168.0.0/24 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4567 -s 192.168.0.0/24 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4444 -s 192.168.0.0/24 -j ACCEPT

iptablesを反映して確認。
[app01]# /etc/rc.d/init.d/iptables reload
[app01]# /etc/rc.d/init.d/iptables status

 

Web01上のphpMyAdminからApp01のデータベースを確認できるようにしておく。
[web01]# cd /home/httpd/httpdocs/phpMyAdmin/
[web01]# cp config.sample.inc.php config.inc.php
[web01]# vi config.inc.php

/*
* First server(WEB01)
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;

/*
* Second server(APP01)
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = '192.168.0.3';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;

下記にアクセスするとCookie用のランダム文字列を生成してくれる。

phpMyAdminから各サーバーに接続できることを確認。

 


4.クラスターに参加

APP01上で作業。まずは一旦停止。
[app01]# /etc/rc.d/init.d/mysql stop

クラスターのノードとして起動。gcommに指定するノードはクラスターに参加しているノードであればどれでもいいらしい。自動的に他のノードにも伝搬される。
[app01]# /etc/rc.d/init.d/mysql start --wsrep_cluster_address=gcomm://192.168.0.2

エラーになった場合はログを確認
[app01]# less /var/lib/mysql/app01.hoge.com.err

成功した場合は状態を確認
[app01]# mysql -p -u root

> SHOW STATUS LIKE 'wsrep_%';

| wsrep_local_state_comment    | Synced
| wsrep_incoming_addresses     | 192.168.0.2:3306,192.168.0.3:3306

phpMyAdminから、WEB01上でテーブルを作ってからAPP01上で削除したりして同期されるか確認。

この設定だと起動するときに「wsrep_cluster_address」オプションを付けないとクラスターに参加しないので注意。

一度クラスターを構成してしまえば、全てがプライマリなので最初にbootstrapで起動したノード(WEB01)も「wsrep_cluster_address」を付けて再起動する必要がある。

全てがプライマリという感覚がマスター・スレイブに慣れていると最初戸惑う。「どれがマスター?」と考えてしまう。

 

< 2014/09/25 Modified >
注意事項。詳しくは公式ドキュメントを参考に。MariaDB Galera Cluster - Known Limitations - MariaDB Knowledge Base

  • InnoDBしか同期しない。MyISAMはInsertしたあと他のNodeに反映されない。
  • 全てのテーブルはPrimary Keyも持つ必要がある。

 

< Related Posts >