orenoblog

エンジニアになりたいExcel方眼紙erの物語

HAProxy経由でGalera Cluster MariaDBに接続する

oreですこんばんは。

アプリケーションサーバからGalera Clusterへの接続をどうやって行うか考えており、HAProxyで実装してみました。

以下動作確認結果です-

環境

  • OS

Amazon Linux 2014.09

  • ミドル
ミドル バージョン
ロードバランサ HAProxy 1.5.9
データベース MariaDB-Galera-server-5.5.40-1.el6.x86_64
レプリケーションライブラリ galera-25.3.5-1.rhel6.x86_64
  • サーバ一覧
サーバ IP
HAProxy 10.0.1.50
Galera Cluster#1 10.0.0.187
Galera Cluster#2 10.0.0.97
Galera Cluster#3 10.0.0.246

HAProxy 1.5.9のビルド

Amazon Linuxが標準で提供しているHAProxyは1.4.22だったのでHAProxy 1.5.9をrpmbuildしました。

mockを利用してhaproxyのrpmを作成するスクリプトを公開している方がいたので、こちらを参考にrpmbuildでrpmを作成しました。

boogieshafer/haproxy-rpm · GitHub

※このスクリプトをそのまま使えたらよかったのですがmockが上手く動かず断念.

  • build-haproxy失敗ログ
[ec2-user@ip-10-0-1-50 haproxy-rpm]$ bash build-haproxy.1.5.x.sh
Downloading sources...
Building initial source rpm...
書き込み完了: /usr/src/rpm/SRPMS/haproxy-1.5.9-2.src.rpm
Using mock to build rpm...
INFO: mock.py version 1.1.41 starting...
Start: init plugins
INFO: selinux disabled
Finish: init plugins
Start: run
INFO: Start(/usr/src/rpm/SRPMS/haproxy-1.5.9-2.src.rpm)  Config(amzn-x86_64)
Start: lock buildroot
Start: clean chroot
INFO: chroot (/var/lib/mock/amzn-x86_64) unlocked and deleted
Finish: clean chroot
Finish: lock buildroot
Start: chroot init
Start: lock buildroot
Mock Version: 1.1.41
INFO: Mock Version: 1.1.41
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled yum cache
Start: cleaning yum metadata
Finish: cleaning yum metadata
INFO: enabled ccache
Start: device setup
Finish: device setup
Start: yum update
ERROR: Exception(/usr/src/rpm/SRPMS/haproxy-1.5.9-2.src.rpm) Config(amzn-x86_64) 0 minutes 0 seconds
INFO: Results and/or logs in: /var/lib/mock/amzn-x86_64/result
ERROR: Command failed:
 # ['/usr/bin/yum', '--installroot', '/var/lib/mock/amzn-x86_64/root/', 'install', '@buildsys-build']
Configuration file /var/lib/mock/amzn-x86_64/root/etc/yum/pluginconf.d/update-motd.conf not found
Unable to find configuration file for plugin update-motd
Configuration file /var/lib/mock/amzn-x86_64/root/etc/yum/pluginconf.d/upgrade-helper.conf not found
Unable to find configuration file for plugin upgrade-helper
Group buildsys-build does not exist.
Error: Nothing to do

Cleaning up...

HAProxyのインストール

$ cd /usr/src/rpm/RPMS/x86_64
$ sudo yum localinstall haproxy-1.5.9-2.amzn1.x86_64.rpm

HAProxyの設定

とりあえずほぼデフォルトで。

  • /etc/haproxy.cfg
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 1024
        chroot /var/lib/haproxy
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen galera_clister 0.0.0.0:3306
        mode tcp
        balance roundrobin
        option tcpka
        option mysql-check user haproxy
        server galera01 10.0.0.187:3306 check weight 1
        server galera02 10.0.0.97:3306 check weight 1
        server galera03 10.0.0.246:3306 check weight 1

DBにcheck用ユーザの作成

ヘルスチェック用のユーザをデータベース上に作成します。適当なGalera Clusterノードでmysql-checkを実行するユーザを作成します。

GRANT USAGE ON *.* TO haproxy@'%'
FLUSH PRIVILEGES;

接続テスト

HAProxyサーバから行ないます。ラウンドロビンで接続できています。

[root@ip-10-0-1-50 haproxy]# mysql -uroot -proot -h127.0.0.1 -e "show variables like 'wsrep_node_name' ;"
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| wsrep_node_name | 10.0.0.187 |
+-----------------+------------+
[root@ip-10-0-1-50 haproxy]# mysql -uroot -proot -h127.0.0.1 -e "show variables like 'wsrep_node_name' ;"
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| wsrep_node_name | 10.0.0.97 |
+-----------------+-----------+
[root@ip-10-0-1-50 haproxy]# mysql -uroot -proot -h127.0.0.1 -e "show variables like 'wsrep_node_name' ;"
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| wsrep_node_name | 10.0.0.246 |
+-----------------+------------+

とりあえず負荷分散するだけ!なら簡単でした。

次はノード障害テストやらないと。

その他

Galera Load Balancerというのもあるみたいです。気が向いたら試そうかな...

codership/glb · GitHub