#author("2020-01-03T01:10:30+09:00","default:nowsky","nowsky")
#author("2023-02-12T23:21:19+09:00","default:nowsky","nowsky")
*MaxScale [#s1014f46]
[[MariaDB MaxScale>+https://mariadb.com/kb/en/maxscale/]]
MariaDBのトランザクションをバックグラウンドのMariaDBにロードバランスするソフトウェア。
MaxScaleはMariaDBに特化しているが、同様のソフトとしてMySQL Routerも存在する。
ソフト単体でMaxScale自体の冗長化は出来ない為、完全二重化を行う為にはKeepalivedも組み合わせて、
VirtualIP構成を取る必要がある。
~
*インストール [#bae777be]
&size(16){&font(b){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
~
&size(16){&font(b){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
~
&size(16){&font(b){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
 }
~
&size(16){&font(b){4. コンフィグファイル};};
今回は下記構成を想定してコンフィグを作成する。
細かいオプションについては[[公式ドキュメント>+https://mariadb.com/kb/en/mariadb-maxscale-23-mariadb-maxscale-configuration-usage-scenarios/]]を参照。
下記ではサンプルのみ掲載。
 
|ホスト     |IPアドレス|レプリカユーザ|レプリカパスワード|ReadOnly|ReadWrite|
|MariaDB #01|10.0.0.1  |replicate     |rep-pass          |-       |TCP:3306 |
|MariaDB #02|10.0.0.2  |replicate     |rep-pass          |-       |TCP:3306 |
|MaxScale   |10.0.0.3  |maxscale      |max-pass          |TCP:3305|TCP:3306 |
 
#region(コンフィグサンプル)
 # vi /etc/maxscale.cnf
 -----
 [maxscale]
 threads=auto
 log_warning=1
 log_notice=0
 log_info=0
 logdir=/var/log/maxscale
 cachedir=/var/lib/maxscale
 
 [MariaDB-Monitor]
 type=monitor
 module=mariadbmon
 servers=DB1,DB2
 user=maxscale
 password=max-pass
 replication_user=maxscale
 replication_password=max-pass
 monitor_interval=2000
 auto_failover=true
 auto_rejoin=true
 
 [RO-Service]
 type=service
 router=readconnroute
 servers=DB1,DB2
 user=maxscale
 password=max-pass
 router_options=slave
 
 [RW-Service]
 type=service
 router=readwritesplit
 servers=DB1,DB2
 user=maxscale
 password=max-pass
 master_failure_mode=error_on_write
 master_reconnection=true
 transaction_replay=true
 causal_reads=false
 max_slave_connections=100%
 
 [RO-Listener]
 type=listener
 service=RO-Service
 protocol=mariadbclient
 address=0.0.0.0
 port=3305
 
 [RW-Listener]
 type=listener
 service=RW-Service
 protocol=mariadbclient
 address=0.0.0.0
 port=3306
 
 [DB1]
 type=server
 address=10.0.0.1
 port=3306
 protocol=mariadbbackend
 
 [DB2]
 type=server
 address=10.0.0.2
 port=3306
 protocol=mariadbbackend
#endregion
~
*レプリケーション設定 [#n874edac]
MaxScaleのバックエンドをレプリケーション構成にしている場合、
Master停止時にSlaveを自動でMasterに昇格する事が出来る。
その場合、&font(b){GTIDレプリケーションを双方向に設定};した上、
MaxScaleから&font(b){レプリカメンバーの昇格・降格を行える様に権限を追加付与};する。

- [[SmartStyle TECH BLOG>+https://www.s-style.co.jp/blog/2018/05/1877/]]
- [[Qiita>+https://qiita.com/reioto/items/2ae56e9025ef711592ea]]
- [[Qiita>+https://qiita.com/junsan50/items/c9e44f8d6b2599b6a2c1]]
- [[MySQL>+https://www.ns-lab.org/wiki/?Linux/Source/MySQL]]

 

- 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';
 
 ・GTIDレプリケーション
 > CHANGE MASTER TO MASTER_HOST='10.0.0.2', MASTER_USER='replicate', MASTER_PASSWORD='rep-pass', MASTER_USE_GTID=slave_pos;
 > CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=YYYYYY;
 ・バイナリポジション確認
 > 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';
 
 ・GTIDレプリケーション
 > CHANGE MASTER TO MASTER_HOST='10.0.0.1', MASTER_USER='replicate', MASTER_PASSWORD='rep-pass', MASTER_USE_GTID=slave_pos;
 > CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=YYYYYY;
 ・バイナリポジション確認
 > 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.XXXXXX",YYYYYY) |
 | binlog_gtid_pos("mysql-bin.AAAAAA",BBBBBB) |
 +--------------------------------------------+
 | 0-NNN-NNN                                  |
 | 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;
~
*ステータス確認 [#b34bca66]
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              │
 └───────┴───────────┴──────┴─────────────┴────────────────────────────┴────────────┘