目次
はじめまして、grasys 平井です。
今回、DBバックエンドへの接続にGalera Load Balancerを試したのでその紹介です。
弊社ではDBバックエンドにPercona XtraDB Clusterを使用しています。 Percona XtraDB Clusterでは、クラスタを構成する全ノードがマスタであり、
全ノードでの書き込み/読み込み、同期的なレプリケーションを実現可能です。
しかし、ノード間での排他ロックが効かないため、同じタイミングで同じレコードを更新した際にデッドロックが発生してしまいます。
そこで、Galera Load Balancerを使用して読み書きが可能なノードを限定することで、上記問題を解消してみます。
Install
Galera Load Balancerのソースは、githubからもってきます。
サクッとコンパイルしてインストール。
cd /usr/local/src
git clone https://github.com/codership/glb
cd glb/
./bootstrap.sh
./configure
make
make install
Service Setting
サービスを起動するため、起動スクリプトと設定ファイルを準備します。
それぞれglb/files
配下に入っているので一先ずコピーするだけです。
configファイルは配置場所がOSによって異なりますが、今回はCentOS7で。
- service script
cp /usr/local/src/glb/files/glbd.sh /etc/init.d/glbd
- configuration file
cp /usr/local/src/glb/files/glbd.cfg /etc/sysconfig/glbd
公式には、
RedHat系 ⇨ /etc/sysconfig/glbd
Debian系 ⇨ /etc/default/glbd
とありますが、/etc/redhat-release
が存在するかどうかで判定していました。
Configuration
最低限起動に必要そうな設定を集めてみました。OTHER_OPTIONS
は公式にまとまっているのでやりたいことに合わせて設定しましょう。
今回は、読み書きが可能なノードを限定したいので「–single」でOK。
- LISTEN_ADDR
クライアントからの接続を待ち受けるIPアドレスとポート番号を指定。 - CONTROL_ADDR
接続を制御する際に利用するIPアドレス(ホスト名)とポート番号を指定。
指定しないとコントロールソケットが開かれない。 - DEFAULT_TARGETS
振り分け先となるDBサーバのIPアドレス(ホスト名)を指定。
「IPアドレス(ホスト名):ポート番号:重み付け」 - OTHER_OPTIONS
振り分け先の決定方法を指定。
vi /etc/sysconfig/glbd
# ここから設定内容
LISTEN_ADDR="glb-01:8012"
CONTROL_ADDR="127.0.0.1:8011"
DEFAULT_TARGETS="pxc-01:3306 pxc-02:3306 pxc-03:3306"
OTHER_OPTIONS="--single"
起動
/etc/init.d/glbd start
[Fri Nov 23 06:39:09 UTC 2018] glbd: starting...
glb v1.0.1 (epoll)
Incoming address: <glb-01のIP>:8012, control FIFO: /var/run/glbd.fifo
Control address: 127.0.0.1:8011
Number of threads: 4, max conn: 32749, nodelay: ON, keepalive: ON, defer accept: OFF, linger: OFF, daemon: YES, lat.count: 0, policy: 'single', top: YES, verbose: NO
Destinations: 3
0: <pxc-01のIP>:3306 , w: 1.000
1: <pxc-02のIP>:3306 , w: 1.000
2: <pxc-03のIP>:3306 , w: 1.000
INFO: glb_daemon.c:44: Changing effective user to 'daemon'
[Fri Nov 23 06:39:09 UTC 2018] glbd: started, pid=4383
動作確認
バックエンドに監視用のユーザを作成して簡単な動作確認。 複数クライアントからの接続を1つのサーバに振り分けられて入ればOK。
getinfoで接続状態を確認できます。
/etc/init.d/glbd getinfo
Router:
------------------------------------------------------
Address : weight usage map conns
<pxc-01のIP>:3306 : 1.000 0.000 N/A 0
<pxc-02のIP>:3306 : 1.000 0.000 N/A 0
<pxc-03のIP>:3306 : 1.000 0.000 N/A 0
------------------------------------------------------
Destinations: 3, total connections: 0 of 32749 max
こんな具合で複数クライアントから接続。
mysql -h glb-01 -u glb -pglb
再度getinfoすると…
/etc/init.d/glbd getinfo
Router:
------------------------------------------------------
Address : weight usage map conns
<pxc-01のIP>:3306 : 1.000 16.667 N/A 50
<pxc-02のIP>:3306 : 1.000 0.000 N/A 0
<pxc-03のIP>:3306 : 1.000 0.000 N/A 0
------------------------------------------------------
Destinations: 3, total connections: 1 of 32749 max
最後に
Galera Load BalancerではFailoverも自動でやってくれます。
今回は1台にRead/Writeを集中させましたが、分散することも可能なのか等、
他のプロキシソフトウェアとの性能比較も含め色々探る価値がありそうです。
では、また。
株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。
grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。