MySQL 基于maxscale服务构建数据读写分离

目录

MySQL 基于maxscale服务构建数据读写分离

读写分离概述

读写分离原理

MySQL读写分离

案例拓扑

构建读写分离

构建思路

基于maxscale服务配置数据读写分离

配置mysql一主一从同步结构

在MySQL代理服务器上部署maxscale服务

启动服务

测试配置


MySQL 基于maxscale服务构建数据读写分离

读写分离概述

读写分离原理

  • 由MySQL代理面向客户端提供服务

—— 收到SQL写请求时,交给master服务器处理

—— 收到SQL读请求时,交给slave服务器处理

MySQL读写分离

  • 数据读写分离的定义

—— 把客户端访问数据的读(select)请求和写(insert、update、delete)请求分别分配给不同的数据库服务器处理

  • 如何实现客户端访问数据时,分离MySQL读、写流量?

    • 通过程序实现

      • 客户端读(select)请求 ---> 访问数据库服务器A

      • 客户端写(insert、update、delete)请求 ---> 访问数据库服务器B

    • 配置服务实现(在服务器上安装能实现读写分离的软件,提供服务)

      • mysql-proxy

      • mycat

      • maxscale

                 上述软件统称为中间件,即架设在客户端和数据库服务器之间的软件。

                  clients(客户端)-----> 服务器(安装读写分离软件)-----> mysqld(数据库服务器)

  • 配置数据读写分离的目的

—— 数据分流,分担单台服务器得工作压力

案例拓扑

  • 添加一个MySQL代理

—— 为客户端提供统一的数据库访问接口

MySQL 基于maxscale服务构建数据读写分离_第1张图片

构建读写分离

构建思路

1、配置MySQL一主一从同步结构

1)主服务器:192.168.4.51

2)从服务器:192.168.4.52

2、配置MySQL代理服务器

  • 装包,修改配置文件,启动服务

—— 安装提供服务的软件

—— 修改服务的主配置文件

—— 配置数据库服务器

—— 启动代理服务

—— 查看服务信息

3、验证配置

  • 客户端连接代理服务访问数据

—— 在客户端连接代理服务器57访问数据

——验证是否实现了数据的读写分离

基于maxscale服务配置数据读写分离

配置mysql一主一从同步结构

1、配置MySQL一主一从同步结构

1)配置主服务器:192.168.4.51

2)配置从服务器:192.168.4.52

配置具体内容:MySQL 主从同步 —— 一主一从_N_jw107的博客-CSDN博客

在MySQL代理服务器上部署maxscale服务

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

MySQL 基于maxscale服务构建数据读写分离_第2张图片MySQL 基于maxscale服务构建数据读写分离_第3张图片

  • 修改主配置 /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端口提供的是管理服务。

MySQL 基于maxscale服务构建数据读写分离_第4张图片MySQL 基于maxscale服务构建数据读写分离_第5张图片

//如图所示,图中红线圈起来的地方需要进行修改

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;

MySQL 基于maxscale服务构建数据读写分离_第6张图片

主机192.168.233.52:

mysql> select user,host from mysql.user;       //查看授权用户发现监控用户和路由用户已经同步过来

MySQL 基于maxscale服务构建数据读写分离_第7张图片

启动服务

  • 主要操作:

—— 启动服务

]# 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       //查看监控信息

MySQL 基于maxscale服务构建数据读写分离_第8张图片

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;

MySQL 基于maxscale服务构建数据读写分离_第9张图片

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。

你可能感兴趣的:(MySQL数据库,mysql,数据库,linux)