使用 MaxScale实现读写分离
MaxScale是maridb开发的一个mysql数据中间件,相关的功能和特性介绍,可以自行到官网查看相关文档
作者在此不再重复,本文的目标是通过maxscal来实现读写分离的功能.
假设:
master为172.28.10.150
slave为172.28.10.145
mysql的版本是5.6.14
安装
[root@c12 soft]# rpm -ivh configure-maxscale-repo-0.1.2.rpm
Preparing... ########################################### [100%]
1:configure-maxscale-repo########################################### [100%] [root@c12 soft]# yum install maxscale
拷贝配置文件
[root@c12 etc]# pwd
/usr/local/mariadb-maxscale/etc
[root@c12 etc]# cp MaxScale_template.cnf maxscale.cnf
[root@c12 etc]# 定义MAXSCALE_HOME环境变量,或是加到/etc/profile文件中
[root@c12 etc]# export MAXSCALE_HOME=/usr/local/mariadb-maxscale
编辑配置文件maxscale.cnf
内容如下 定义读写路由器
[RW Split Router]
type=service
router=readwritesplit
servers=server2,server1
user=root
passwd=50514A05CE2C0909BA630B29A29D620D
enable_root_user=1
#use_sql_variables_in=
#max_slave_connections=100%
#max_slave_replication_lag=21
#router_options=slave_selection_criteria=
#filters=fetch|qla 为该路由器定义一个listener
[RW Split Listener]
type=listener
service=RW Split Router
protocol=MySQLClient
port=4007
#socket=/tmp/rwsplit.sock 定义服务器成员
[server1]
type=server
address=172.28.10.145
port=3307
protocol=MySQLBackend [server2]
type=server
address=172.28.10.150
port=3306
protocol=MySQLBackend
password是一个加密的密文,maxscal使用该用户连接数据库 生成密码文件,再加密
[root@c12 bin]# /usr/local/mariadb-maxscale/bin/maxkeys /usr/local/mariadb-maxscale/etc/.secrets [root@c12 bin]# /usr/local/mariadb-maxscale/bin/maxpasswd root
50514A05CE2C0909BA630B29A29D620D 启动maxscale,并以后台方式运行,查看端口是否正常打开
[root@c12 bin]# /usr/local/mariadb-maxscale/bin/maxscale --config=/usr/local/mariadb-maxscale/etc/maxscale.cnf
[root@c12 etc]# netstat -nltp | grep max
tcp 0 0 0.0.0.0:4007 0.0.0.0:* LISTEN 15153/maxscale
tcp 0 0 0.0.0.0:6603 0.0.0.0:* LISTEN 15153/maxscale
tcp 0 0 0.0.0.0:4442 0.0.0.0:* LISTEN 15153/maxscale
使用管理工具连接,设置服务器状态 [root@c12 bin]# /usr/local/mariadb-maxscale/bin/maxadmin --user=admin --password=mariadb --host=127.0.0.1
手动设定手服务器的状态
MaxScale> set server server1 slave
MaxScale> set server server2 master
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 172.28.10.145 | 3307 | 0 | Slave, Running
server2 | 172.28.10.150 | 3306 | 0 | Master, Running
-------------------+-----------------+-------+-------------+--------------------
通过一个并发脚本测试,可以发现读全部路由到从库,而写被路由到主库上了. 两条测试SQL
$arra[0]="select count(*) from tt";
$arra[1]="update tt set c=c+1 where a>10"; master>show processlist;
+------+------+-----------------------------+--------------------+-------------+-------+-----------------------------------------------------------------------+--------------------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+------+------+-----------------------------+--------------------+-------------+-------+-----------------------------------------------------------------------+--------------------------------+-----------+---------------+
| 316 | root | 172.28.12.23:51839 | information_schema | Sleep | 22236 | | NULL | 9 | 9 |
| 951 | root | localhost | sbtest | Query | 0 | init | show processlist | 0 | 0 |
| 1074 | root | localhost.localdomain:58644 | NULL | Binlog Dump | 533 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | 0 | 0 |
| 1081 | root | c12.fb.com:64791 | sbtest | Query | 2 | updating | update tt set c=c+1 where a>10 | 0 | 0 |
| 1082 | root | c12.fb.com:64792 | sbtest | Query | 2 | updating | update tt set c=c+1 where a>10 | 0 | 418402 |
| 1083 | root | c12.fb.com:64794 | sbtest | Query | 2 | updating | update tt set c=c+1 where a>10 | 0 | 0 |
| 1084 | root | c12.fb.com:64796 | sbtest | Query | 2 | updating | update tt set c=c+1 where a>10 | 0 | 0 |
| 1085 | root | c12.fb.com:64798 | sbtest | Query | 1 | updating | update tt set c=c+1 where a>10 | 0 | 0 |
| 1086 | root | c12.fb.com:64800 | sbtest | Query | 1 | updating | update tt set c=c+1 where a>10 | 0 | 0 |
+------+------+-----------------------------+--------------------+-------------+-------+-----------------------------------------------------------------------+--------------------------------+-----------+---------------+
9 rows in set (0.00 sec)
从库全部是select操作.
slave>show processlist;
+----+-------------+------------------+--------+---------+------+-----------------------------------------------------------------------------+-------------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+----+-------------+------------------+--------+---------+------+-----------------------------------------------------------------------------+-------------------------+-----------+---------------+
| 1 | system user | | NULL | Connect | 381 | Waiting for master to send event | NULL | 0 | 0 |
| 2 | system user | | NULL | Connect | 0 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | 0 | 0 |
| 12 | root | localhost | NULL | Sleep | 267 | | NULL | 0 | 0 |
| 20 | root | c12.fb.com:45015 | sbtest | Query | 0 | Sending data | select count(*) from tt | 0 | 0 |
| 21 | root | c12.fb.com:45018 | sbtest | Query | 1 | Sending data | select count(*) from tt | 0 | 0 |
| 22 | root | c12.fb.com:45020 | sbtest | Query | 1 | Sending data | select count(*) from tt | 0 | 0 |
| 23 | root | c12.fb.com:45022 | sbtest | Query | 1 | Sending data | select count(*) from tt | 0 | 0 |
| 24 | root | c12.fb.com:45024 | sbtest | Sleep | 2 | | NULL | 1 | 10000000 |
| 25 | root | c12.fb.com:45026 | sbtest | Query | 0 | Sending data | select count(*) from tt | 0 | 0 |
| 26 | root | localhost | NULL | Query | 0 | init | show processlist | 0 | 0 |
+----+-------------+------------------+--------+---------+------+-----------------------------------------------------------------------------+-------------------------+-----------+---------------+
通过配置MaxScal成功的实了MySQL的读写分离.