MaxScale

MariaDB MaxScale
MariaDBのトランザクションをバックグラウンドのMariaDBにロードバランスするソフトウェア。
MaxScaleはMariaDBに特化しているが、同様のソフトとしてMySQL Routerも存在する。
ソフト単体でMaxScale自体の冗長化は出来ない為、完全二重化を行う為にはKeepalivedも組み合わせて、
VirtualIP構成を取る必要がある。

インストール

1. ビルド・インストール
今回はCentOS 8.0.1905・MaxScale v2.4.4でビルドを行う。
ライブラリインストールにdnfを用いているが、他ディストリを利用する時は読み替える。

# dnf install openssl-devel systemd-devel sqlite-devel pam-devel libcurl-devel gnutls-devel libgcrypt-devel
# dnf install npm tcl cmake uuid libuuid-devel xz-devel
# wget "https://github.com/mariadb-corporation/MaxScale/archive/maxscale-2.4.4.tar.gz"
# tar zxvf maxscale-2.4.4.tar.gz
# cd MaxScale-maxscale-2.4.4

# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/maxscale-2.4.5 -DBUILD_TOOLS=Y -DBUILD_CDC=N
# make
# make install
# ln -s /usr/local/maxscale-2.4.4 /usr/local/maxscale
# ln -s /usr/local/maxscale/etc/maxscale.cnf /etc/maxscale.cnf



2. サービスファイル
最近のLinuxではsystemdを用いている為、MaxScale用のサービスファイルを準備する。
今回は実行ユーザとグループを決め打ちしている為、サービスファイルに直接埋め込む。

# groupadd maxscale
# useradd -g maxscale -d /var/run/maxscale -s /sbin/nologin maxscale
# vi /usr/lib/systemd/system/maxscale.service
-----
[Unit]
Description=MariaDB MaxScale Database Proxy
After=network.target

[Service]
Type=forking
Restart=on-abort
PermissionsStartOnly=true
User=maxscale
Group=maxscale
PIDFile=/var/run/maxscale/maxscale.pid
ExecStart=/usr/local/maxscale/bin/maxscale -f /etc/maxscale.cnf
Environment=ASAN_OPTIONS=abort_on_error=1
ExecStartPre=/usr/bin/install -d /var/run/maxscale -o maxscale -g maxscale
ExecStartPre=/usr/bin/install -d /var/lib/maxscale -o maxscale -g maxscale
TimeoutStartSec=120
LimitNOFILE=65535
LimitNPROC=65535
StartLimitBurst=0
WatchdogSec=60s
NotifyAccess=all

[Install]
WantedBy=multi-user.target



3. 起動準備
サービスファイルの登録と各ディレクトリを作成して起動準備を行う。

# systemctl enable maxscale
# mkdir /var/log/maxscale
# chown maxscale.maxscale /var/log/maxscale
# echo '/usr/local/maxscale/lib64/maxscale' > /etc/ld.so.conf.d/maxscale.conf
# vi /etc/logrotate.d/maxscale_logrotate
-----
/var/log/maxscale/*.log {
    ifempty
    missingok
    sharedscripts
    postrotate
        kill -USR1 `/usr/bin/pgrep maxscale`
    endscript
}



4. コンフィグファイル
今回は下記構成を想定してコンフィグを作成する。
細かいオプションについては公式ドキュメントを参照。
下記ではサンプルのみ掲載。
 

ホストIPアドレスレプリカユーザレプリカパスワードReadOnlyReadWrite
MariaDB #0110.0.0.1replicaterep-pass-TCP:3306
MariaDB #0210.0.0.2replicaterep-pass-TCP:3306
MaxScale10.0.0.3maxscalemax-passTCP:3305TCP:3306

 

 コンフィグサンプル


レプリケーション設定

MaxScaleのバックエンドをレプリケーション構成にしている場合、
Master停止時にSlaveを自動でMasterに昇格する事が出来る。
その場合、GTIDレプリケーションを双方向に設定した上、
MaxScaleからレプリカメンバーの昇格・降格を行える様に権限を追加付与する。

 

  • MariaDB #01
    ・MaxScale接続ユーザ
    > CREATE USER 'maxscale'@'10.0.0.3/255.255.255.255' IDENTIFIED BY 'max-pass';
    > GRANT SELECT ON mysql.user TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SELECT ON mysql.db TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SHOW DATABASES ON *.* TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT REPLICATION CLIENT ON *.* TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SUPER ON *.* TO 'maxscale'@'10.0.0.3/255.255.255.255';
    
    ・バイナリポジション確認
    > SHOW MASTER STATUS\G;
                File: mysql-bin.XXXXXX
            Position: YYYYYY
        Binlog_Do_DB:
    Binlog_Ignore_DB:
    
    ・ダンプ取得
    # mysqldump --all-databases -u root -p --master-data=2 --single-transaction --routines > dump-01.sql
    # cat dump-01.sql | grep MASTER_LOG_FILE | head -n 1
      -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=YYYYYY;
    
    ・GTID確認
    > SELECT BINLOG_GTID_POS("mysql-bin.XXXXXX", YYYYYY);
    +--------------------------------------------+
    | binlog_gtid_pos("mysql-bin.XXXXXX",YYYYYY) |
    +--------------------------------------------+
    | 0-NNN-NNN                                  |
    +--------------------------------------------+
    
    ・インポート
    # mysql -f -u root -p < dump-02.sql
    # mysql -u root -p
    
    ・GTIDレプリケーション
    > STOP SLAVE;
    > SET GLOBAL GTID_SLAVE_POS = '0-NNN-NNN';
    > CHANGE MASTER TO MASTER_HOST='10.0.0.2', MASTER_USER='replicate', MASTER_PASSWORD='rep-pass', MASTER_USE_GTID=slave_pos;
    > START SLAVE;
    > SHOW SLAVE STATUS\G;
  • MariaDB #02
    ・MaxScale接続ユーザ
    > CREATE USER 'maxscale'@'10.0.0.3/255.255.255.255' IDENTIFIED BY 'max-pass';
    > GRANT SELECT ON mysql.user TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SELECT ON mysql.db TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SHOW DATABASES ON *.* TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT REPLICATION CLIENT ON *.* TO 'maxscale'@'10.0.0.3/255.255.255.255';
    > GRANT SUPER ON *.* TO 'maxscale'@'10.0.0.3/255.255.255.255';
    
    ・バイナリポジション確認
    > SHOW MASTER STATUS\G;
                File: mysql-bin.AAAAAA
            Position: BBBBBB
        Binlog_Do_DB:
    Binlog_Ignore_DB:
    
    ・ダンプ取得
    # mysqldump --all-databases -u root -p --master-data=2 --single-transaction --routines > dump-02.sql
    # cat dump-02.sql | grep MASTER_LOG_FILE | head -n 1
      -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.AAAAAA', MASTER_LOG_POS=BBBBBB;
    
    ・GTID確認
    > SELECT BINLOG_GTID_POS("mysql-bin.AAAAAA", BBBBBB);
    +--------------------------------------------+
    | binlog_gtid_pos("mysql-bin.AAAAAA",BBBBBB) |
    +--------------------------------------------+
    | 0-MMM-MMM                                  |
    +--------------------------------------------+
    
    ・インポート
    # mysql -f -u root -p < dump-01.sql
    # mysql -u root -p
    
    ・GTIDレプリケーション
    > STOP SLAVE;
    > SET GLOBAL GTID_SLAVE_POS = '0-MMM-MMM';
    > CHANGE MASTER TO MASTER_HOST='10.0.0.1', MASTER_USER='replicate', MASTER_PASSWORD='rep-pass', MASTER_USE_GTID=slave_pos;
    > START SLAVE;
    > SHOW SLAVE STATUS\G;

ステータス確認

MaxScaleに同梱されているmaxctrlコマンドで、メンバーDBの稼働状況を確認出来る。
レプリカメンバーの自動昇格を有効化している場合もmaxctrlコマンドで確認する。

# maxctrl list services
┌────────────────┬────────────────┬─────────────┬──────────────────┬───────────────┐
│ Service                        │ Router                         │ Connections              │ Total Connections                  │ Servers                      │
├────────────────┼────────────────┼─────────────┼──────────────────┼───────────────┤
│ RO-Service                     │ readconnroute                  │ 0                        │ 1644                               │ DB1, DB2                     │
├────────────────┼────────────────┼─────────────┼──────────────────┼───────────────┤
│ RW-Service                     │ readwritesplit                 │ 0                        │ 77                                 │ DB1, DB2                     │
└────────────────┴────────────────┴─────────────┴──────────────────┴───────────────┘

# maxctrl list servers
┌───────┬───────────┬──────┬─────────────┬────────────────────────────┬────────────┐
│ Server       │ Address              │ Port       │ Connections              │ State                                                  │ GTID                   │
├───────┼───────────┼──────┼─────────────┼────────────────────────────┼────────────┤
│ DB1          │ 10.0.0.1             │ 3306       │ 0                        │ Master, Running                                        │ 0-NNN-NNN              │
├───────┼───────────┼──────┼─────────────┼────────────────────────────┼────────────┤
│ DB2          │ 10.0.0.2             │ 3306       │ 0                        │ Relay Master, Slave, Running                           │ 0-NNN-NNN              │
└───────┴───────────┴──────┴─────────────┴────────────────────────────┴────────────┘