Galera Load Balancer

※DBバックエンドへの接続に[Galera Load Balancer](https://galeracluster.com/galera-load-balancer/)を試した時の古記事を転載。
　[Percona XtraDB Cluster](https://www.percona.com/software/mysql-database/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`は[公式](https://galeracluster.com/library/documentation/glb-parameters.html#glb-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を集中させましたが、分散することも可能なのか等、
他のプロキシソフトウェアとの性能比較も含め色々探る価値がありそうです。