1 MaxScale Introduction
maxscale is mariadb developed a database middleware can easily achieve read and write separation schemes; and provide a separate read and write load balancing and high availability protection. Further maxscale distal end is transparent to the applications, we can easily migrate applications to read and write maxscale the separation scheme, to relieve the pressure on the main library. maxscale also provides analytical filtering sql statement.
2 illustrates the environment
主机IP 角色 Server-id 操作系统版本
192.168.1.67 Master 77 7.3
192.168.1.68 Slave 78 Redhat7.3
192.168..1.69 Slave 79 Redhat7.3
3 MaxScale version
https://downloads.mariadb.com/MaxScale/
https://downloads.mariadb.com/MaxScale/2.2.0/rhel/7server/x86_64/maxscale-2.2.0-1.rhel.7.x86_64.rpm
3.1 Installation
将maxscale安装在主节点
rpm -ivh maxscale-2.2.0-1.rhel.7.x86_64.rpm
3.2 create the required directory
mkdir -p /maxscale/cache
mkdir -p /maxscale/data
mkdir -p /maxscale/log
mkdir -p /maxscale/pid
mkdir -p /maxscale/tmp
3.3 Creating a User
create user 'jiankongdb'@'%' identified by 'jiankong123';
grant SELECT on mysql.user to 'jiankongdb'@'%';
GRANT SELECT ON mysql.db TO 'jiankongdb'@'%';
GRANT all ON *.* TO 'jiankongdb'@'%';
GRANT SHOW DATABASES ON *.* TO 'jiankongdb'@'%';
grant REPLICATION CLIENT on *.* to 'jiankongdb'@'%';
GRANT replication slave, replication client,SELECT ON *.* TO jiankongdb@'%';
3.4 Configuration MaxScale
Detailed parameter descriptions refer to the official documentation:
https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-mariadb-maxscale-configuration-usage-scenarios/
edit the configuration file /etc/maxscale.cnf
[[email protected] data]# cat /etc/maxscale.cnf
# MaxScale documentation on GitHub:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Documentation-Contents.md
# Global parameters
#
# Complete list of configuration options:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Getting-Started/Configuration-Guide.md
[maxscale]
threads=auto
ms_timestamp=1 #timestamp精度
syslog=1 #将日志写入到syslog中
maxlog=1 #将日志写入到maxscale的日志文件中
log_to_shm=0 #不将日志写入到共享缓存中,开启debug模式时可打开加快速度
log_warning=1 #记录告警信息
log_notice=1 #记录notice
log_info=1 #记录info
log_debug=0 #不打开debug模式
log_augmentation=1 #日志递增
#相关目录设置
logdir=/maxscale/log/
datadir=/maxscale/data/
libdir=/usr/lib64/maxscale/
cachedir=/maxscale/cache/
piddir=/maxscale/pid/
execdir=/usr/bin/
# Server definitions
#
# Set the address of the server to the network
# address of a MySQL server.
#
[server1]
type=server
address=192.168.1.67
port=3306
protocol=MySQLBackend
#serv_weight=1
[server2]
type=server
address=192.168.1.68
port=3306
protocol=MySQLBackend
#serv_weight=3
[server3]
type=server
address=192.168.1.69
port=3306
protocol=MySQLBackend
#serv_weight=4
# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.
# MySQL Monitor documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Monitors/MySQL-Monitor.md
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3
user=jiankongdb
passwd=jiankong123
monitor_interval=10000
detect_stale_master=true
# Service definitions
#
# Service Definition for a read-only service and
# a read/write splitting service.
#
# ReadConnRoute documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Routers/ReadConnRoute.md
[Read-Only Service]
type=service
router=readconnroute
servers=server1,server2,server3
user=jiankongdb
passwd=jiankong123
router_options=slave
enable_root_user=1
weightby=serv_weight
# ReadWriteSplit documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Routers/ReadWriteSplit.md
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=jiankongdb
passwd=jiankong123
max_slave_connections=100%
use_sql_variables_in=master
enable_root_user=1
max_slave_replication_lag=3600
# This service enables the use of the MaxAdmin interface
# MaxScale administration guide:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Reference/MaxAdmin.md
[MaxAdmin Service]
type=service
router=cli
# Listener definitions for the services
#
# These listeners represent the ports the
# services will listen on.
#
[Read-Only Listener]
type=listener
service=Read-Only Service
protocol=MySQLClient
port=4008
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
3.5 encrypted passwords
配置文件中的密码都是经过maxscale进行加密后的,可以防止密码泄露,具体的操作步骤为
在刚才配置文件中的datadir目录下创建加密文件
[[email protected] data]#maxkeys /maxscale/data
生成加密后的密码
[[email protected] data]# maxpasswd /maxscale/data/ jiankong123
D88ED80AE158722A2A3FD725E906C601
1787C217C118C9B0F9A44DCB8B178414就是123加密后的密码。我们可以添加到配置文件中。
3.6 start MaxScale
maxscale -f /etc/maxscale.cnf
3.7 View MaxScale state
[[email protected] software]# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 192.168.1.67 | 3306 | 0 | Master, Running
server2 | 192.168.1.68 | 3306 | 0 | Slave, Running
server3 | 192.168.1.69 | 3306 | 0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
或者
[[email protected] log]# maxadmin -uadmin -pmariadb
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 192.168.1.67 | 3306 | 0 | Master, Running
server2 | 192.168.1.68 | 3306 | 0 | Slave, Running
server3 | 192.168.1.69 | 3306 | 0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
4 separate read and write verification
4.1 Create a test table
在主节点server1 192.168.1.67上建立测试表
MariaDB [cndba2]> create table test_maxscale(id int);
Query OK, 0 rows affected (0.02 sec)
MariaDB [cndba2]> insert into test_maxscale values(87);
Query OK, 1 row affected (0.02 sec)
MariaDB [cndba2]> select * from test_maxscale;
+------+
| id |
+------+
| 87 |
+------+
1 row in set (0.00 sec)
在节点server2 192.168.1.68上额外加入测试信息
MariaDB [cndba2]> insert into test_maxscale values(86);
MariaDB [cndba2]> select * from test_maxscale;
+------+
| id |
+------+ s
| 87 |
| 86 |
+------+
2 rows in set (0.00 sec)
在节点server3 192.168.1.69上额外加入测试信息
MariaDB [cndba2]> insert into test_maxscale values(88);
Query OK, 1 row affected (0.00 sec)
MariaDB [cndba2]> select * from test_maxscale;
+------+
| id |
+------+
| 87 |
| 88 |
+------+
2 rows in set (0.00 sec)
4.2 read-only access maxscale
通过mysql命令行访问maxscale所在节点192.168.1.78的读写分离listener 4006端口
[[email protected] data]# mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select * from cndba2.test_maxscale;"
+------+
| id |
+------+
| 87 |
| 86 |
+------+发现分到了server2上面
4.3 separate read and write
加入包含insert的sql语句
[[email protected] data]# mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "insert into cndba2.test_maxscale values(90);select * from cndba2.test_maxscale;"
+------+
| id |
+------+
| 87 |
| 86 |
| 90 |
+------+
发现转发到server2中,但是也包含90的值,我们需要到主节点server3和另外一个slave进行验证
在server1主节点中
MariaDB [(none)]> select * from cndba2.test_maxscale;
+------+
| id |
+------+
| 87 |
| 90 |
+------+
2 rows in set (0.00 sec)
在server3另一个slave节点中
MariaDB [cndba2]> select * from test_maxscale;
+------+
| id |
+------+
| 87 |
| 88 |
| 90 |
+------+
3 rows in set (0.00 sec)
maxscale实现了读写分离。
5 Verify Load Balancing
5.1 View Read-Write Service
[[email protected] mysql]# maxadmin -uadmin -pmariadb
MaxScale> show service "Read-Write-Service"
Service: Read-Write-Service
Router: readwritesplit
State: Started
use_sql_variables_in: master
slave_selection_criteria: LEAST_CURRENT_OPERATIONS
master_failure_mode: fail_instantly
max_slave_replication_lag: 3600
retry_failed_reads: true
strict_multi_stmt: true
strict_sp_calls: false
disable_sescmd_history: true
max_sescmd_history: 0
master_accept_reads: false
Number of router sessions: 121
Current no. of router sessions: 1
Number of queries forwarded: 272
Number of queries forwarded to master: 0 (0.00%)
Number of queries forwarded to slave: 272 (100.00%)
Number of queries forwarded to all: 121 (44.49%)
Started: Mon Nov 27 23:53:13 2017
Root user access: Enabled
Backend databases:
[192.168.1.67]:3306 Protocol: MySQLBackend Name: server1
[192.168.1.68]:3306 Protocol: MySQLBackend Name: server2
[192.168.1.69]:3306 Protocol: MySQLBackend Name: server3
Total connections: 122
Currently connected: 1
5.2 Test Results
[[email protected] mysql]# for i in `seq 1 10`; do mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2>/dev/null & done
[1] 3963
[2] 3964
[3] 3965
[4] 3966
[5] 3967
[6] 3968
[7] 3969
[8] 3970
[9] 3971
[10] 3972
[[email protected] mysql]# +------------+
| @@hostname |
+------------+
| mariadb2 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb3 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb3 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb2 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb2 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb3 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb2 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb3 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb2 |
+------------+
+------------+
| @@hostname |
+------------+
| mariadb3 |
+------------+
[1] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[2] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[3] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[4] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[5] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[6] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[7] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[8] Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[9]- Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
[10]+ Done mysql -P4006 -ujiankongdb -pjiankong123 -h192.168.1.67 -e "select @@hostname;" 2> /dev/null
可以看到会话被平均分配到两个节点上