Maxscale系列文章 安装-读写分离

Posted ACMUG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maxscale系列文章 安装-读写分离相关的知识,希望对你有一定的参考价值。



作者简介:陈浩

网名: HH

从事JAVA、php、Python开发工作。Oracle数据库认证专家,且与mysql数据库结缘至今。

系列文章: 

Github:

QQ: 275258836

E-mail: 275258836@qq.com



前言

关于MySQL中间件的产品也很多,之前用过了360的Atlas、玩过MyCat。这边我选择 Maxscale的原因就是功能能满足需求,也看好他的未来发展。

其实有关于如何安装 Maxscale的文章百度一下一大把,写这篇文章主要为了说明配置的某些现象,同时也为之后使用Maxscale的其他配置做下基础。

我的环境

这边我的’一主二从’已经是搭建好的了,如何搭建就不再描述了。

注意:这边我的三个节点都没有开启 GTID,具体是为什么在之后会讲到,这边大家留意一下就行。

192.168.xxx.11 (Maxscale)
192.168.xxx.21:3306 (Master)
192.168.xxx.22:3306 (Slave)
192.168.xxx.23:3306 (Slave)

这边我使用的用于复制的用户是maxscale,具体权限如下:

CREATE USER maxscale@'%' IDENTIFIED BY "123456";
GRANT replication slave, replication client ON *.* TO maxscale@'%';
GRANT SELECT ON mysql.* TO maxscale@'%';
GRANT ALL ON maxscale_schema.* TO maxscale@'%';
GRANT SHOW DATABASES ON *.* TO maxscale@'%';

root@(none) 22:34:15>SELECT VERSION();
+--------------------+
| VERSION()          |
+--------------------+
| 10.1.8-MariaDB-log |
+--------------------+
1 row in set (0.00 sec)

root@(none) 22:34:25>SHOW SLAVE HOSTS;
+------------+----------------+------+------------+
| Server_id  | Host           | Port | Master_id  |
+------------+----------------+------+------------+
| 3306xxx022 | 192.168.xxx.21 | 3306 | 3306xxx021 |
| 3306xxx023 | 192.168.xxx.21 | 3306 | 3306xxx021 |
+------------+----------------+------+------------+
2 rows in set (0.00 sec)

下载Maxscale。在 192.168.xxx.11 机器上

我的版本

[root@normal_11 opt]# pwd
/opt

[root@normal_11 opt]# ll
total 149624
-rw-r--r--   1 root root   3587510 Nov  2 21:07 maxscale-2.0.1.centos.7.tar.gz

开始安装

[root@normal_11 opt]# groupadd maxscale
[root@normal_11 opt]# useradd -g maxscale maxscale
[root@normal_11 opt]# cd /opt
[root@normal_11 opt]# tar -zxf maxscale-2.0.1.centos.7.tar.gz
[root@normal_11 opt]# ln -s maxscale-2.0.1.centos.7 /usr/local/maxscale
[root@normal_11 opt]# chown -R maxscale:maxscale /usr/local/maxscale
[root@normal_11 opt]# mkdir -p /u01/maxscale/{data,cache,logs,tmp}
[root@normal_11 opt]# mkdir -p /u01/maxscale/logs/{binlog,trace}
[root@normal_11 opt]# chown -R maxscale:maxscale /u01/maxscale
[root@normal_11 opt]# /usr/local/maxscale/bin/maxkeys /u01/maxscale/data/
[root@normal_11 opt]# /usr/local/maxscale/bin/maxpasswd /u01/maxscale/data/.secrets 123456
1D30C1E689410756D7B82C233FCBF8D9

Maxscale 配置文件

[root@normal_11 opt]# cat /etc/maxscale.cnf 
###################################################
# CREATE USER maxscale@'%' IDENTIFIED BY "123456";
# GRANT replication slave, replication client ON *.* TO maxscale@'%';
# GRANT SELECT ON mysql.* TO maxscale@'%';
# GRANT ALL ON maxscale_schema.* TO maxscale@'%';
# GRANT SHOW DATABASES ON *.* TO maxscale@'%';
# groupadd maxscale
# useradd -g maxscale maxscale
# cd /opt
# tar -zxf maxscale-2.0.1.rhel.7.tar.gz
# ln -s /opt/maxscale-2.0.1.rhel.7 /usr/local/maxscale
# chown -R maxscale:maxscale /usr/local/maxscale
# mkdir -p /u01/maxscale/{data,cache,logs,tmp}
# mkdir -p /u01/maxscale/logs/{binlog,trace}
# chown -R maxscale:maxscale /u01/maxscale
# /usr/local/maxscale/bin/maxkeys /u01/maxscale/data/
# /usr/local/maxscale/bin/maxpasswd /u01/maxscale/data/.secrets 123456
###################################################

[maxscale]
# 开启线程个数,默认为1.设置为auto会同cpu核数相同
threads=auto
# timestamp精度
ms_timestamp=1
# 将日志写入到syslog中
syslog=1
# 将日志写入到maxscale的日志文件中
maxlog=1
# 不将日志写入到共享缓存中,开启debug模式时可打开加快速度
log_to_shm=0
# 记录告警信息
log_warning=1
# 记录notice
log_notice=1
# 记录info
log_info=1
# 不打开debug模式
log_debug=0
# 日志递增
log_augmentation=1

# 相关目录设置
basedir=/usr/local/maxscale/
logdir=/u01/maxscale/logs/trace/
datadir=/u01/maxscale/data/
cachedir=/u01/maxscale/cache/
piddir=/u01/maxscale/tmp/

[server1]
type=server
address=192.168.xxx.21
port=3306
protocol=MySQLBackend
serv_weight=1

[server2]
type=server
address=192.168.xxx.22
port=3306
protocol=MySQLBackend
serv_weight=3

[server3]
type=server
address=192.168.xxx.23
port=3306
protocol=MySQLBackend
serv_weight=3

[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3
user=maxscale
passwd=xxxxxxxxxx
# 监控心态为 10s
monitor_interval=10000
# 当复制slave全部断掉时,maxscale仍然可用,将所有的访问指向master节点
detect_stale_master=true
# 监控主从复制延迟,可用后续指定router service的(配置此参数请求会永远落在 master)
# detect_replication_lag=true

[Read-Only Service]
type=service
router=readconnroute
servers=server1,server2,server3
user=maxscale
passwd=xxxxxxxxx
router_options=slave
# 允许root用户登录执行
enable_root_user=1
# 查询权重
weightby=serv_weight

[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale
passwd=xxxxxxx
max_slave_connections=100%
# sql语句中的存在变量只指向master中执行
use_sql_variables_in=master
# 允许root用户登录执行
enable_root_user=1
# 允许主从最大间隔(s)
max_slave_replication_lag=3600

[MaxAdmin Service]
type=service
router=cli

[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=/u01/maxscale/tmp/maxadmin.sock
port=6603

细心的朋友会注意到, 的我配置文件最上面就是安装 Maxscale 的基本步骤,这是本人的一个习惯.

这边我稍微说明一下配置文件的意思:

1.[server1], [server2], [server3] 我配置了三个Maxscale需要连接的MySQL服务

2.[MySQL Monitor] 配置一个监听服务, 同时监听着 [server1], [server2], [server3] 的状态.

3.[Read-Only Service] 配置了只读服务, 只在[server2], [server3]中执行

注意: 虽然是只读服务但是同样可以执行 DML DDL, 说以要限制好用户的权限.

4.[Read-Write Listener] 配置了读写分离的服务

5.[MaxAdmin Listener] 配置了用户管理Maxscale的服务

演示

这边我们以 [Read-Write Listener] 配置的服务来演示读写分离情况

1.启动 Maxscale

如果启动有报错那就查看一下日志 /var/log/message 或 /u01/maxscale/logs/trace/maxscale1.log(自定义)

[root@normal_11 opt]# /usr/local/maxscale/bin/maxscale -f /etc/maxscale.cnf
[root@normal_11 opt]# netstat -natpl | grep max
tcp        0      0 0.0.0.0:4008            0.0.0.0:*               LISTEN      5507/maxscale       
tcp        0      0 0.0.0.0:6603            0.0.0.0:*               LISTEN      5507/maxscale       
tcp        0      0 0.0.0.0:4006            0.0.0.0:*               LISTEN      5507/maxscale       
tcp        0      0 192.168.xxx.11:43102    192.168.xxx.22:3306     ESTABLISHED 5507/maxscale       
tcp        0      0 192.168.xxx.11:54624    192.168.xxx.21:3306     ESTABLISHED 5507/maxscale         
tcp        0      0 192.168.xxx.11:52989    192.168.xxx.23:3306     ESTABLISHED 5507/maxscale

2.使用 maxadmin 查看服务

[root@normal_11 opt]# /usr/local/maxscale/bin/maxadmin -S /u01/maxscale/tmp/maxadmin.sock      
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.xxx.21  |  3306 |           0 | Master, Running
server2            | 192.168.xxx.22  |  3306 |           0 | Slave, Running
server3            | 192.168.xxx.23  |  3306 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
MaxScale> list services
Services.
--------------------------+----------------------+--------+---------------
Service Name              | Router Module        | #Users | Total Sessions
--------------------------+----------------------+--------+---------------
Read-Only Service         | readconnroute        |      1 |     1
Read-Write Service        | readwritesplit       |      1 |     1
MaxAdmin Service          | cli                  |      3 |     3
--------------------------+----------------------+--------+---------------

通过登录Maxscale的读写分离服务, 来执行sql并且查看日志,查看日志路由情况。

注意: 这边登录的用户就是普通的MySQL用户, 不是maxscale用户

[root@normal_11 opt]# mysql -uHH -p -h192.168.xxx.11 -P4006
Logging to file '/u01/mysql_history/query.log'
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5524
Server version: 5.5.5-10.0.0 2.0.1-maxscale MariaDB Server

Copyright (c) 2009-2015 Percona LLC and/or its affiliates
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


HH@192.168.xxx.11 11:13:46 [(none)]>SELECT * FROM test.t1;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | HH1  |   1 |
|  2 | HH2  |   2 |
|  3 | HH3  |   3 |
+----+------+-----+
3 rows in set (0.01 sec)

HH@192.168.xxx.11 11:15:03 [(none)]>INSERT INTO test.t1 VALUES(NULL, 'HH4', 4);
Query OK, 1 row affected (0.01 sec)

# 使用 HH 登录成的日志
2016-11-03 23:13:46.907   info   : (log_server_connections): Servers and router connection counts:
2016-11-03 23:13:46.907   info   : (log_server_connections): current operations : 0 in  192.168.xxx.21:3306 RUNNING MASTER
2016-11-03 23:13:46.907   info   : (log_server_connections): current operations : 0 in  192.168.xxx.22:3306 RUNNING SLAVE
2016-11-03 23:13:46.907   info   : (log_server_connections): current operations : 0 in  192.168.xxx.23:3306 RUNNING SLAVE
2016-11-03 23:13:46.908   info   : (select_connect_backend_servers): Selected RUNNING MASTER in         192.168.xxx.21:3306
2016-11-03 23:13:46.908   info   : (select_connect_backend_servers): Selected RUNNING SLAVE in  192.168.xxx.22:3306
2016-11-03 23:13:46.908   info   : (select_connect_backend_servers): Selected RUNNING SLAVE in  192.168.xxx.23:3306
2016-11-03 23:13:46.908   info   : (session_alloc): Started Read-Write Service client session [0] for 'HH' from 192.168.xxx.11
2016-11-03 23:13:46.909   [9]  info   : (route_single_stmt): > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_READ|QUERY_TYPE_SYSVAR_READ, stmt: select @@version_comment limit 1 
2016-11-03 23:13:46.909   [9]  info   : (route_single_stmt): Route query to master      192.168.xxx.21:3306 <
2016-11-03 23:13:46.922   [9]  info   : (route_single_stmt): > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_READ, stmt: select USER() 
2016-11-03 23:13:46.922   [9]  info   : (route_single_stmt): Route query to slave       192.168.xxx.22:3306 <

# 执行 SELECT * FROM test.t1 语句被路由到 192.168.xxx.22:3306[server2]中的日志
2016-11-03 23:15:02.618   [9]  info   : (route_single_stmt): > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_READ, stmt: SELECT * FROM test.t1 
2016-11-03 23:15:02.618   [9]  info   : (route_single_stmt): Route query to slave       192.168.xxx.22:3306 <

# 执行 INSERT INTO test.t1 VALUES(NULL, 'HH4', 4) 语句被路由到 192.168.xxx.21:3306[server1]中的日志
2016-11-03 23:17:02.716   [9]  info   : (route_single_stmt): > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_WRITE, stmt: INSERT INTO test.t1 VALUES(NULL, 'HH4', 4) 
2016-11-03 23:17:02.716   [9]  info   : (route_single_stmt): Route query to master      192.168.xxx.21:3306 <

上面是最基本的读写分离操作

重点参数说明与演示

有许多刚刚搭建Maxscale的朋友会问到为什么我的select总是落在Master上,影响比较大的参数有两个,如下:

# 监控主从复制延迟,可用后续指定router service的(配置此参数请求会永远落在 master)
detect_replication_lag=true

# 允许主从最大间隔(s).有些朋友在做压力测试的是会说SELECT 会打在Master,多半是这个参数
max_slave_replication_lag=3600

1.detect_replication_lag=true 时的现象

执行 SELECT 语句

HH@192.168.xxx.11 11:24:59 [(none)]>SELECT * FROM test.t1;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | HH1  |   1 |
|  2 | HH2  |   2 |
|  3 | HH3  |   3 |
|  4 | HH4  |   4 |
+----+------+-----+
4 rows in set (0.00 sec)

查看路由的日志

# 该查询落在了Master(192.168.xxx.21:3306)[server1]上了
2016-11-03 23:25:04.364   [7]  info   : (route_single_stmt): > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_READ, stmt: SELECT * FROM test.t1 
2016-11-03 23:25:04.364   [7]  info   : (route_single_stmt): Route query to master      192.168.xxx.21:3306 <

所以我的配置是将 detect_replication_lag=true 给注释了也就是用默认值false.

关于 max_slave_replication_lag 这个参数我就不演示了, 因为涉及到了使用 sysbench 等压力工具不在本文范畴, 有兴趣的自己玩玩, 这边就说说该参数的意义。

如果主从延时大于该参数那么 QDL DML DDL 三种语句都落在 Master(192.168.xxx.21:3306)[server1]上。


注:ACMUG收录技术文章版权属于原作者本人所有。如有疑问,请联系作者。



以上是关于Maxscale系列文章 安装-读写分离的主要内容,如果未能解决你的问题,请参考以下文章

使用MaxScale实现mysql读写分离

使用MaxScale实现mysql读写分离

使用Maxscale实现mysql读写分离

MaxScale中间件部署数据库读写分离

maxscale读写分离

maxscale + mariadb5.5读写分离