Galera Load Balancer

はじめまして、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を集中させましたが、分散することも可能なのか等、
他のプロキシソフトウェアとの性能比較も含め色々探る価値がありそうです。

では、また。