目录
MySQL 基于maxscale服务构建数据读写分离
读写分离概述
读写分离原理
MySQL读写分离
案例拓扑
构建读写分离
构建思路
基于maxscale服务配置数据读写分离
配置mysql一主一从同步结构
在MySQL代理服务器上部署maxscale服务
启动服务
测试配置
由MySQL代理面向客户端提供服务
—— 收到SQL写请求时,交给master服务器处理
—— 收到SQL读请求时,交给slave服务器处理
数据读写分离的定义
—— 把客户端访问数据的读(select)请求和写(insert、update、delete)请求分别分配给不同的数据库服务器处理
如何实现客户端访问数据时,分离MySQL读、写流量?
通过程序实现
客户端读(select)请求 ---> 访问数据库服务器A
客户端写(insert、update、delete)请求 ---> 访问数据库服务器B
配置服务实现(在服务器上安装能实现读写分离的软件,提供服务)
mysql-proxy
mycat
maxscale
上述软件统称为中间件,即架设在客户端和数据库服务器之间的软件。
clients(客户端)-----> 服务器(安装读写分离软件)-----> mysqld(数据库服务器)
配置数据读写分离的目的
—— 数据分流,分担单台服务器得工作压力
添加一个MySQL代理
—— 为客户端提供统一的数据库访问接口
1、配置MySQL一主一从同步结构
1)主服务器:192.168.4.51
2)从服务器:192.168.4.52
2、配置MySQL代理服务器
装包,修改配置文件,启动服务
—— 安装提供服务的软件
—— 修改服务的主配置文件
—— 配置数据库服务器
—— 启动代理服务
—— 查看服务信息
3、验证配置
客户端连接代理服务访问数据
—— 在客户端连接代理服务器57访问数据
——验证是否实现了数据的读写分离
1、配置MySQL一主一从同步结构
1)配置主服务器:192.168.4.51
2)配置从服务器:192.168.4.52
配置具体内容:MySQL 主从同步 —— 一主一从_N_jw107的博客-CSDN博客
1、安装提供服务的软件
MaxScale代理软件
—— 由 MySQL 的兄弟公司 MariaDB 开发
—— 下载地址
https://downloads.mariadb.com/MaxScale/
将下载好的软件包上传到主机192.168.233.57上
[root@mysql57 ~]# ls
[root@mysql57 ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
[root@mysql57 ~]# ls /etc/maxscale.cnf //服务的主配置文件
/etc/maxscale.cnf
[root@mysql57 ~]# max //服务的相关命令
maxadmin maxavrocheck maxbinlogcheck maxkeys maxpasswd maxscale
[root@mysql57 ~]# ls /var/log/maxscale/ //服务的日志文件,启动服务后创建日志文件
2、修改服务的配置文件
查看主配置 /etc/maxscale.cnf 内容
配置文件原样:
[root@mysql57 ~]# vim /etc/maxscale.cnf
修改主配置 /etc/maxscale.cnf 内容
[root@mysql57 ~]# cp /etc/maxscale.cnf /root/ //备份主配置文件,留后手
对配置文件进行修改:
[root@mysql57 ~]# vim /etc/maxscale.cnf
[maxscale] #定义服务启动后线程个数
threads=auto #threads的默认值为1,即默认服务启动后只有一个线程。将threads的值修改为auto,可根据当前主机57cpu的核数,创建对应个数的线程数量,即核数为几就创建几个线程。
#线程就是进程里面的最小工作单位。区别:进程是独享资源,线程是共享资源。软件开发时就会定义该软件是以进程的方式运行,还是以线程的方式运行,如mysql就是以进程工作的。
[server1] #定义服务器的IP地址
type=server #类型为服务器
address=192.168.233.51 #master主机ip地址
port=3306 #数据库服务器的端口
protocol=MySQLBackend #协议=MySQL后端
#配置文件中默认只指定了一台服务器,即[server1]。我们有两台服务器,所以需要再添加一台服务器,且这两台服务器名称不能一样,即添加[server2]。
[server2] #定义数据库服务器,定义服务器的IP地址。
type=server
address=192.168.233.52 #slave主机ip地址
port=3306
protocol=MySQLBackend
[MySQL Monitor] #监视MySQL进程
type=monitor #类型为监视
module=mysqlmon #调用mysqlmon模块
servers=server1, server2 #servers指的是数据库服务器列表,添加server2,即主机57要监视server1和server2
user=maxscalemon #定义用户maxscalemon,即监视server1和server2时用定义的用户连接到这两台主机上,且这两台主机要有定义的这个授权用户,并且赋予对应的权限。
passwd=123456 #定义用户maxscalemon的密码为123456,要符合数据库服务器的密码策略。
monitor_interval=2000 #用户maxscalemon连接server1和server2的频率,即主机57监视的频率,单位是毫秒。
#注释掉Read-Only-Service这个配置项,我们不定义只读服务,因为我们要提供读写分离服务,所以我们希望在访问时,既可以执行查询也可以执行写。
#[Read-Only Service] #定义只读服务器,只读服务是只提供查询请求的服务。
#type=service
#router=readconnroute
#servers=server1
#user=myuser
#passwd=mypwd
#router_options=slave
[Read-Write Service] #定义读写服务
type=service
router=readwritesplit #调用读写分离模块
servers=server1, server2 #读写服务是在server1和server2之间实现的。
user=maxscalerouter #定义路由用户,目的是当客户端访问数据库服务器时,连接的其实是MySQL代理,由于MySQL代理服务器上没有用户名和密码的数据信息,不知道你当前登录的用户是否存在或密码正确,所以MySQL代理就要通过此处定义的用户名和密码,去访问server1和server2的授权库里,查询客户端访问时的用户和密码是否存在。
passwd=123456
max_slave_connections=100%
[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 #运行代理服务后,就会监听4006端口,即主机57上的4006端口提供的是读写分离服务。
[MaxAdmin Listener] #管理服务坚挺的端口号
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default #当你不定义时,用的就是默认端口号
port=4016 #自定义端口4016,运行管理服务后,就会监听4016端口,即主机57上的4016端口提供的是管理服务。
//如图所示,图中红线圈起来的地方需要进行修改
3、配置数据库服务器
在主/从服务器创建授权用户
—— 创建监控用户maxscalemon
主机192.168.233.51:
mysql> grant replication slave,replication client on *.* to maxscalemon@"%" identified by "123456";
//replication slave是检查主从状态的权限,replication client是监控主机51和52数据库服务运行状态的权限。注意授权用户和密码是在配置文件里定义过的。
—— 创建路由用户maxscalerouter
主机192.168.233.51:
mysql> grant select on mysql.* to maxscalerouter@"%" identified by "123456";
//路由用户的权限是对数据库服务器上的mysql库下的所有表有查询权限,注意授权用户和密码是在配置文件里定义过的。
由于数据库服务器51和52是一主一从结构,所以在主服务器51执行完后,从服务器52就会自动同步数据。
主机192.168.233.51:
mysql> select user,host from mysql.user;
主机192.168.233.52:
mysql> select user,host from mysql.user; //查看授权用户发现监控用户和路由用户已经同步过来
主要操作:
—— 启动服务
]# maxscale -f /etc/maxscale.cnf
—— 查看端口
]# netstat -lntup | grep maxscale
—— 停止服务
]# kill -9 PID号
[root@mysql57 ~]# maxscale -f /etc/maxscale.cnf //启动成功没有输出属于正常
[root@mysql57 ~]# ls /var/log/maxscale/ //如果启动出现错误,可查看日志信息排查错误
maxscale.log
[root@mysql57 ~]# netstat -lntup | grep maxscale //服务正常启动,会监听4006读写分离的端口和4016管理服务的端口,注:服务启动正常,监听的端口号和端口数量要与在配置文件中设置的一样。
tcp6 0 0 :::4006 :::* LISTEN 59715/maxscale
tcp6 0 0 :::4016 :::* LISTEN 59715/maxscale
在代理服务器本机访问管理
—— ]# maxadmin -uadmin -pmariadb -P端口
客户端连接代理访问数据
—— ]# mysql -h服务器地址 -P端口 -u用户名 -p密码
示例
1、在代理服务器本机访问管理
[root@mysql57 ~]# maxadmin -uadmin -pmariadb -P4016
MaxScale> list servers //查看监控信息
MaxScale> exit
2、在客户端50连接代理服务器57访问数据
[root@mysql50 ~]# mysql -h192.168.233.57 -P4006 -ujim -p123456 //注:连接代理服务器57的时候,要指定读写分离的端口,否则会默认连接端口3306。使用用户jim连接的是否报错,报错原因是连接被拒绝,因为在数据库服务器51和52里面没有jim用户。此处的用户验证就是代理服务器的路由用户进行查询的。
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'jim'@'::ffff:192.168.233.50' (using password: YES)
1)在主服务器51添加访问数据的连接用户(从服务器自动同步数据)
mysql> create database db7;
mysql> create table db7.a(id int);
mysql> grant select,insert on db7.a to jim@"%" identified by "123456";
2)在客户端连接代理服务器57访问数据
[root@mysql50 ~]# mysql -h192.168.233.57 -P4006 -ujim -p123456
mysql> select * from db7.a;
Empty set (0.08 sec)
mysql> insert into db7.a values(110);
mysql> select * from db7.a;
3、验证是否实现了数据的读写分离
1)在从服务器52本机向db7.a插入1条记录
[root@mysql52 ~]# mysql -uroot -p123456 -e "insert into db7.a values(52)"
[root@mysql52 ~]# mysql -uroot -p123456 -e "select * from db7.a"
由于主机52是从服务器,所以在主机52上插入数据,数据是不会同步到主服务器51的,在主服务器51上进行查看。
[root@mysql51 ~]# mysql -uroot -p123456 -e "select * from db7.a" //主服务器51上查询不到在从服务器上插入的数据
2)客户端50连接代理服务器57访问数据
验证读请求连接的服务器
[root@mysql50 ~]# mysql -h192.168.233.57 -P4006 -ujim -p123456 -e "select * from db7.a" //客户端50连接代理服务器57访问数据,能查询到在从服务器52上插入的数据,说明客户端访问数据进行查询时,访问的是从服务器52。
验证写请求连接的服务器
[root@mysql50 ~]# mysql -h192.168.233.57 -P4006 -ujim -p123456 -e "insert into db7.a values(51)" //使用客户端插入数据,由于在从服务器52上插入数据主服务器51是不同步的,所以如果我们插入数据后,在主服务器上都能看见插入的数据,即可说明写入操作是在主服务器上进行的。
[root@mysql51 ~]# mysql -uroot -p123456 -e "select * from db7.a" //客户端50连接代理服务器57访问数据,能在主服务器51上查询到插入的数据,说明客户端访问数据进行写入时,访问的是主服务器51。