Database JUNKY

MySQL,MariaDBを中心としたブログです

Mariadb10.2 Galera Clusterで即席クラスタ環境を構築する!!

Mariadb10.2 Include Galera Cluster

日々のデータベース運用の中で、一番大変なのが、パフォーマンスチューニング。 チューニングの大半は、索引チューニングを行うか、SLAVE サーバをスケールアウトして、負荷分散するかの2つを行いうのが(私的には)一番おおくやるやり方なのですが。 更新負荷については、かなりハードルが高いのが現状です。基本的に更新系はスケールアウトできないし。かといってスケールアップすると、それなりにお金かかるしで、どうしても躊躇しちゃいます。参照のスケールアウトはするのにね。。って。。。あ

更新もスケールアウトすればいいんじゃん

ってことで、クラスタをはじめてやってみることにしました。 MySQL Clusterですと使ったことはないのですが、なんか、いろいろと制約がありそうで 既存の構成を維持しずらいので今回は、MariaDBで組み込まれている、Galera Clusterを入れてみようと思います

Galera Cluster とは

ちょっとみる限りですと、クラスターというより、マルチマスタレプリケーションのように見えますね。ただ、一般的な非同期レプリケーションではなく、同期レプリケーションです。データの同期は、rsyncで行なっているっぽいです。 Galera Clusterの利点としては、構造がシンプルなので特に違和感なく利用できそうってことです。

Amazon Web Services企業導入ガイドブック -企業担当者が知っておくべきAWSサービスの全貌から、セキュリティ概要、システム設計、導入プロセス、運用まで-

Amazon Web Services企業導入ガイドブック -企業担当者が知っておくべきAWSサービスの全貌から、セキュリティ概要、システム設計、導入プロセス、運用まで-

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

MariaDB&MySQL全機能バイブル

MariaDB&MySQL全機能バイブル

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE)

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE)

インストール

今回、amazon linux で検証しますが、redhat系のものであれば基本同様の設定作業で実装できるのではないかと思います。さわりしか今回書きません。ごめんなさい。

MariaDBリポジトリ設定

cat << '_EOT_' > /etc/yum.repos.d/mariadb.repo

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

_EOT_

MariaDB関係 list

# yum list MariaDB*
Loaded plugins: priorities, update-motd, upgrade-helper
4 packages excluded due to repository priority protections
Available Packages
MariaDB-backup.x86_64                                          10.2.8-1.el6                                    mariadb
MariaDB-cassandra-engine.x86_64                                10.2.8-1.el6                                    mariadb
MariaDB-client.x86_64                                          10.2.8-1.el6                                    mariadb
MariaDB-common.x86_64                                          10.2.8-1.el6                                    mariadb
MariaDB-compat.x86_64                                          10.2.8-1.el6                                    mariadb
MariaDB-connect-engine.x86_64                                  10.2.8-1.el6                                    mariadb
MariaDB-devel.x86_64                                           10.2.8-1.el6                                    mariadb
MariaDB-gssapi-server.x86_64                                   10.2.8-1.el6                                    mariadb
MariaDB-oqgraph-engine.x86_64                                  10.2.8-1.el6                                    mariadb
MariaDB-server.x86_64                                          10.2.8-1.el6                                    mariadb
MariaDB-shared.x86_64                                          10.2.8-1.el6                                    mariadb
MariaDB-test.x86_64                                            10.2.8-1.el6                                    mariadb
MariaDB-tokudb-engine.x86_64                                   10.2.8-1.el6                                    mariadb
mariadb-connector-java.noarch                                  1.3.6-1.5.amzn1                                 amzn-main

Install MariaDB

# yum group install "development tools" # 必要ないかな?
# yum install MariaDB-server MariaDB-shared MariaDB-devel MariaDB-common MariaDB-compat MariaDB-client
# yum install galera

MariaDBの開始

# /etc/init.d/mysql start

アカウントの作成

SET password for root@localhost=password('rootpasswd');
SET password for root@127.0.0.1=password('rootpasswd'); 

DELETE FROM mysql.user where user != 'root';

GRANT ALL PRIVILEGES  on *.* to sysadm@'%' IDENTIFIED BY 'sysadmpasswd';

GRANT SELECT,INSERT,UPDATE,DELETE,FILE,EXECUTE,SHOW DATABASES,SHOW VIEW,CREATE TEMPORARY TABLES on *.* to app@'%' IDENTIFIED BY 'applicationpasswd';

GRANT REPLICATION SLAVE ON *.* TO slave@'%' IDENTIFIED BY 'slavepasswd'; 

DELETE FROM mysql.user where user = '';
DELETE FROM mysql.user where password = '';

FLUSH PRIVILEGES ;

MariaDBの起動は確認できました。

環境設定

yumでのインストールですと、

/etc/my.cnf.d/server.cnf

にgarelaのセクションがあります。ここの設定をすることで容易にクラスター環境ができるわけです。Galera Clusterの環境変数がいっぱいあってわけわかめですが、一個一個見ると、結構シンプルだと思いますので、順を追って説明したいと思います

当方以下のような構成でやってみたいと思います。

実験環境

# IP ADDRESS REMARKS
1 10.0.1.111 MASTER-NODE
2 10.0.1.112 CHILD-NODE
3 10.0.1.113 CHILD-NODE

3台がミニマムっぽいのでぎりぎり3台で設定してみました。あと、便宜上、REMARKSに、MASTERとかCHILDとか書きましたが、実際クラスターなのであんまし関係ないです(単にわかりやすくするために書きました)

server.cnf

上記の設定をserver.cnfに記述したものを以下で抜粋しました。

10.0.1.111

こちらがマスターノードの設定になります。今回、一番最初に起動するデータベースサーバです

# cat /etc/my.cnf.d/server.cnf | grep wsrep
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address='gcomm://'
wsrep_cluster_name='CLUSTERGRP'
wsrep_node_name='V4-NODE00'
wsrep_node_address = 10.0.1.111
#wsrep_slave_threads=1

binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

10.0.1.112

子ノードの設定は、基本的に同じなので、ipの部分を適宜置き換えてください

以下は、10.0.1.112の例になります

# cat /etc/my.cnf.d/server.cnf | grep wsrep
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address='gcomm://10.0.1.111,10.0.1.113'
wsrep_cluster_name='CLUSTERGRP'
wsrep_node_name='V4-NODE01'
wsrep_node_address = 10.0.1.112
#wsrep_slave_threads=1

binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

server.cnf補足説明

wsrep_on

wsrep(Write set replication project)を有効にするかどうかの設定を行います wsrepの細かな定義は私もよくわかりませんが、一般的にいうMySQLの非同期レプリケーションとは違い、完全同期型のマルチマスターレプリケーションだよってことだと思います。当然のことながら、Galera Clusterはこの設定をONにします

wsrep_on=ON

wsrep_provider

上記wsrepレプリケーションを実行する為のライブラリパスを指定します。 yumでインストールした際は、ここに入ってました

# pwd
/usr/lib64/galera
# ll
total 35768
-rwxr-xr-x 1 root root 36623451 Apr 27 13:04 libgalera_smm.so

binlog_format

ステートメントレベルのレプリケーションではなく、行レベルのレプリケーションを利用する必要があります。なので、ここは、rowを指定してください。通常のmysqlですと、mixedだったはずなので。。(たしか。。)

binlog_format=ROW

default_storage_engine

Galera Clusterは、MyISAM等の悲トランザクション型のストレージエンジンは残念ながら利用できません。こちらは、InnoDBを選択する必要があります

default_storage_engine=InnoDB

innodb_autoinc_lock_mode

オートインクリメント値のロックモードです。 許可される値は、「従来」を表す 0、「連続」 を表す 1、または 「インターリーブ」 を表す 2 です。Galera Clusterでは、2に固定しておく必要があります。ちなみに、インターリーブってなんだろ?って思って調べたかぎりでは、なんとなーくだけど、その時の状態によってかならずしも連続した数字を割り当てないよってことに見えますw デフォルトですと、この値は、1の”連続”でこの設定ですと、デッドロックの危険性があるとのことです

innodb_autoinc_lock_mode=2

wsrep_cluster_address

ノードに参加しているIPアドレスを指定します。ちなにに、親玉のマスターノードと子ノードで今回は記載を変えております

  • マスターノードの場合
wsrep_cluster_address='gcomm://'
  • その他の、子ノード

自身以外の全てのノードを指定します、例えば、自身が10.0.1.112だとしたら以下のような記述になります

wsrep_cluster_address='gcomm://10.0.1.111,10.0.1.113'

wsrep_cluster_name

ちょっと前後しちゃいましたが、クラスタ構成のグループ名を決めます

wsrep_cluster_name='CLUSTERGRP'

wsrep_node_name

サーバー自身の任意のノード名を指定してください、上記wsrep_cluster_name内でユニークになるように名前をつけてください

wsrep_node_name='NODE01'

wsrep_node_address

自身のip addressを設定します

wsrep_node_address = 10.0.1.112

作業を簡略化するために、東方は、マスターノードのサーバ設定が完了したところで、AMIを作成し、変更がある部分のみ修正して子ノードを作成しました

動作検証

ここまできたら、あとはちゃんとクラスタリングされているの?どこのノードにデータが書き込まれても、全ノード同期されるの?という部分を確認してみたいと思います

Galera Clusterの開始

Galera Clusterを起動します

Master nodeの起動

クラスタの最初のノードでは –wsrep-new-cluster で起動します

# /etc/init.d/mysql start --wsrep-new-cluster

最初に起動したClusterは、0になっているはずです

# mysql -u root -p -e "show status like 'wsrep_local_index';"
Enter password:
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+

Chiild nodeの起動

最初のノード以外では –wsrep-new-cluster オプションは必要ありません

# /etc/init.d/mysql start 

次に起動したClusterは、0以外になっているはずです

# mysql -u root -p -e "show status like 'wsrep_local_index';"
Enter password:
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 1     |
+-------------------+-------+

以上、今回は設定の部分までを簡単に説明しました。あとは、アプリは、ホストに関係なく、書き込みができるようになっていると思います。

実は。。私もこの先を進めていないので、細かな部分については次の機会に説明しようと思います