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サービスの全貌から、セキュリティ概要、システム設計、導入プロセス、運用まで-
- 作者: 荒木靖宏,大谷晋平,小林正人,酒徳知明,高田智己,瀧澤与一,山本教仁,吉羽龍太郎
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/06/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
- 作者: 玉川憲,片山暁雄,今井雄太,大澤文孝
- 出版社/メーカー: 日経BP社
- 発売日: 2017/04/13
- メディア: 単行本
- この商品を含むブログを見る
Kindle (Newモデル) Wi-Fi、ブラック、キャンペーン情報つきモデル、電子書籍リーダー
- 出版社/メーカー: Amazon
- 発売日: 2016/07/20
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
- 作者: 鈴木啓修,山田奈緒子
- 出版社/メーカー: 技術評論社
- 発売日: 2014/12/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE)
- 作者: 奥野幹也
- 出版社/メーカー: 翔泳社
- 発売日: 2016/08/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Linux # How to Setup a MySQL Replication Now? (English Edition)
- 作者: Marcin Kosobucki
- 出版社/メーカー: Marcin Kosobucki
- 発売日: 2011/06/25
- メディア: Kindle版
- この商品を含むブログを見る
インストール
今回、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 | +-------------------+-------+
以上、今回は設定の部分までを簡単に説明しました。あとは、アプリは、ホストに関係なく、書き込みができるようになっていると思います。
実は。。私もこの先を進めていないので、細かな部分については次の機会に説明しようと思います