这里是我自己整理的一些资料,大家不懂的可以相互学习呀。。。

maxscale proxy 实现读写分离

Mysql ZZT 2435次浏览 已收录 0个评论

该文还没验证,有时间验证后去掉此备注

转载:maxscale实现读写分离

1.前言

maxscale是mariadb公司开发的一套数据库中间件,可以很方便的实现读写分离方案;并且提供了读写分离的负载均衡和高可用性保障。另外maxscale对于前端应用而言是透明的,我们可以很方便的将应用迁移到maxscale中实现读写分离方案,来分担主库的压力。maxscale也提供了sql语句的解析过滤功能。这里我们主要讲解maxscale的安装、配置以及注意事项。

2.安装环境

 1)server1(node节点)
OS:CentOS 6.4 X64
IPADDR:172.16.21.12(eth0);192.168.8.6(eth1)
HOSTNAME:mysql-mha01
DB:Mariadb10.0.21
防火墙关闭;selinux关闭;
2)server2(node节点)
OS:CentOS 6.4 X64
IPADDR:172.16.21.13(eth2);192.168.8.7(eth3)
HOSTNAME:mysql-mha02
DB:DB:Mariadb10.0.21
防火墙关闭;selinux关闭;
3)server3(node节点,manager节点)
OS:CentOS 6.4 X64
IPADDR:172.16.21.15(eth2);192.168.8.8(eth3)
HOSTNAME:mysql-mha01
DB:DB:Mariadb10.0.21
防火墙关闭;selinux关闭;

3.安装软件

在主节点192.168.8.7上安装maxscale

yum install maxscale-1.4.1-1.rhel_6.x86_64.rpm 
    mkdir -p /maxscale/cache    
mkdir -p /maxscale/data    
mkdir -p /maxscale/log    
mkdir -p /maxscale/pid    
mkdir -p /maxscale/tmp  
    ```

## 4.maxscale配置
### 4.1配置文件

[root@mysql-mha02 etc]# cat /etc/maxscale.cnf

MaxScale documentation on GitHub:

https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Documentation-Contents.md

Global parameters

Complete list of configuration options:

https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Getting-Started/Configuration-Guide.md

[maxscale]
threads=auto #开启线程个数,默认为1.设置为auto会同cpu核数相同
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.8.6
port=3306
protocol=MySQLBackend

[server2]
type=server
address=192.168.8.7
port=3306
protocol=MySQLBackend

[server3]
type=server
address=192.168.8.8
port=3306
protocol=MySQLBackend

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/master/Documentation/Monitors/MySQL-Monitor.md

#相关的监控信息,监控的用户需要对后端数据库有访问replication client的权限:grant replication client
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3
user=root
passwd=7AE087FBF864EBB87D108C3AB1603D0D
monitor_interval=1000 #监控心跳为1秒
detect_replication_lag=true #监控主从复制延迟,可用后续指定router service的max_slave_replication_lag单位是秒,来控制maxscale运行的最大延迟
detect_stale_master=true #当复制slave全部断掉时,maxscale仍然可用,将所有的访问指向master节点

Service definitions

Service Definition for a read-only service and

a read/write splitting service.

ReadConnRoute documentation:

https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadConnRoute.md

#read-only的只读节点slave分离
[Read-Only Service]
type=service
router=readconnroute
servers=server1,server2,server3
user=root
passwd=7AE087FBF864EBB87D108C3AB1603D0D
router_options=slave
enable_root_user=1

ReadWriteSplit documentation:

https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadWriteSplit.md

#读写分离,用户需要有SELECT ON mysql.db;SELECT ON mysql.tables_priv;SHOW DATABASES ON .的权限
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=root
passwd=7AE087FBF864EBB87D108C3AB1603D0D
use_sql_variables_in=master #sql语句中的存在变量只指向master中执行
enable_root_user=1 #允许root用户登录执行
master_accept_reads=true #master节点也可以转发读请求
max_slave_replication_lag=5 #复制延迟最大为5秒(必须比monitor的interval大)

```

#maxscale管理节点信息  
[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  
port=6603  

4.2加密密码

配置文件中的密码都是经过maxscale进行加密后的,可以防止密码泄露,具体的操作步骤为
在刚才配置文件中的datadir目录下创建加密文件

maxkeys /maxscale/data 

生成加密后的密码

[root@mysql-mha02 data]# maxpasswd /maxscale/data/.secrets 123456  
7AE087FBF864EBB87D108C3AB1603D0D  

7AE087FBF864EBB87D108C3AB1603D0D就是123456加密后的密码啦。我们可以添加到配置文件中。

4.3启动maxscale

maxscale -f /etc/maxscale.cnf  

5.验证读写分离

5.1创建测试表

在主节点server2 192.168.8.7上建立测试表

MariaDB [test]> create table test_maxscale(id int);  
Query OK, 0 rows affected (0.02 sec)  

MariaDB [test]> insert into test_maxscale values(87);  
Query OK, 1 row affected (0.02 sec)  

MariaDB [test]> select * from test_maxscale;  
+------+  
| id   |  
+------+  
|   87 |  
+------+  
1 row in set (0.00 sec)  

在节点server1 192.168.8.6上额外加入测试信息

MariaDB [test]> insert into test_maxscale values(86);  
MariaDB [test]> select * from test_maxscale;  
+------+  
| id   |  
+------+  
|   87 |  
|   86 |  
+------+  
2 rows in set (0.00 sec) 

在节点server3 192.168.8.8上额外加入测试信息

MariaDB [test]> insert into test_maxscale values(88);  
Query OK, 1 row affected (0.00 sec)  

MariaDB [test]> select * from test_maxscale;  
+------+  
| id   |  
+------+  
|   87 |  
|   88 |  
+------+  
2 rows in set (0.00 sec)  

5.2只读访问maxscale

通过mysql命令行访问maxscale所在节点192.168.8.7的读写分离listener 4006端口

[root@mysql-mha01 ~]# mysql -P4006 -uroot -p123456 -h192.168.8.7 -e "select * from test.test_maxscale;"  
+------+  
| id   |  
+------+  
|   87 |  
|   86 |  
+------+ 

发现分到了server1上面

5.3读写分离

加入包含insert的sql语句

[root@mysql-mha02 log]# mysql -P4006 -uroot -p123456 -h192.168.8.7 -e "insert into test.test_maxscale values(90);select * from test.test_maxscale;"  
+------+  
| id   |  
+------+  
|   87 |  
|   88 |  
|   90 |  
+------+  

发现转发到server3中,但是也包含90的值,我们需要到主节点server2和另外一个slave进行验证
在server2主节点中

MariaDB [(none)]> select * from test.test_maxscale;  
+------+  
| id   |  
+------+  
|   87 |  
|   90 |  
+------+  
2 rows in set (0.00 sec)  

在server1另一个slave节点中

MariaDB [test]> select * from test_maxscale;  
+------+  
| id   |  
+------+  
|   87 |  
|   86 |  
|   90 |  
+------+  
3 rows in set (0.00 sec)  

maxscale实现了读写分离。

6.注意事项

详细的注意事项链接 https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale/limitations-and-known-issues-within-maxscale/
这里我主要讲些重点需要注意的:
1)创建链接的时候,不支持压缩协议
2)转发路由不能动态的识别master节点的迁移
3)LONGLOB字段不支持
4)在一下情况会将语句转到master节点中(保证事务一致):
明确指定事务;
prepared的语句;
语句中包含存储过程,自定义函数
包含多条语句信息:INSERT INTO ... ; SELECT LAST_INSERT_ID();
5)一些语句默认会发送到后端的所有server中,但是可以指定
use_sql_variables_in=[master|all] (default: all)
为master的时候可以将语句都转移到master 上执行。但是自动提交值和prepared的语句仍然发送到所有后端server。

这些语句为

COM_INIT_DB (USE <db name> creates this)  
COM_CHANGE_USER  
COM_STMT_CLOSE  
COM_STMT_SEND_LONG_DATA  
COM_STMT_RESET  
COM_STMT_PREPARE  
COM_QUIT (no response, session is closed)  
COM_REFRESH  
COM_DEBUG  
COM_PING  
SQLCOM_CHANGE_DB (USE ... statements)  
SQLCOM_DEALLOCATE_PREPARE  
SQLCOM_PREPARE  
SQLCOM_SET_OPTION  
SELECT ..INTO variable|OUTFILE|DUMPFILE  
SET autocommit=1|0  

6)maxscale不支持主机名匹配的认证模式,只支持IP地址方式的host解析。所以在添加user的时候记得使用合适的范式。
7)跨库查询不支持,会显示的指定到第一个数据库中
8)通过select方式改变会话变量的行为不支持


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明maxscale proxy 实现读写分离
喜欢 (1)

文章评论已关闭!