MySQL 读写分离配置实践

一、环境准备

条件:
master(虚拟机centos7,NAT模式,固定ip):192.168.131.129
slave(win10,路由器局域网,DHCP协议):192.168.31.27

  • 由于MyCat是用Java写的,需要JDK1.7版本以上
  • MySQL的root账户有远程访问权限

建议安装centos7

[强调]:我们可能会遇到今天配置好了,明天就出错了,因为我们用的ip都是DHCP都是动态分配的,它是有过期时间的,过期以后这个ip就会重新分配。像我们这边演示用的centos7是NET模式下写的固定的ip,这个ip是不会变的,但是win10的ip直接连的是局域网的路由器,它是DHCP这个ip是会变的。所以我们如果遇到这种之前是通的,现在不通的问题,可以检查下ip是否变了,然后去改ip就可以了。

1. 查看主从复制状态

读写分离基于主从复制,查看主从复制状态
在这里插入图片描述

2. 查看JDK版本

MyCat的运行需要java环境,需要JDK1.7版本以上,执行java -version检查JDK环境
在这里插入图片描述

3. 打开root的远程连接权限

客户端的请求都是通过代理MyCat最终发送到远端的MySQL上,一般MySQL和MyCat都是不在一台机器上的,这里就涉及到了数据库的远程访问连接。

我们可以拿root进行连接,也可以创建新的用户进行连接。root用户默认是localhost只能本地连接,不支持远程连接
在这里插入图片描述
所以需要root远程连接的权限打开。%表示允许任意地址连接,如果缩小权限,写成MyCat所在机器的ip地址就可以,用root连接MySQL服务器,grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;打开远程权限后再重启服务service mysqld restart在这里插入图片描述
通过ip地址远程连接mysql使用命令mysql -h 192.168.131.129 -u root -p123456

4. 安装MyCat

安装lrzsz,用于windows和Linux传输文件(xftp也行)
在这里插入图片描述
rz命令将MyCat包传输到Linux
在这里插入图片描述
在这里插入图片描述
同样地,要把Linux上的文件下载到Window上sz+文件路径
解压MyCat包放到合适的目录下,可以放到/usr/local/mycat下,tar -zxvf
在这里插入图片描述
解压以后就可以看到解压的目录里面有mycat
在这里插入图片描述mycat/bin:放的是可执行文件mycat/conf:放的MyCat的配置文件mycat/logs:放的MyCat的日志文件
在这里插入图片描述

  • wrapper.log:记录启动过程中遇到的错误
  • mycat.log:记录运行过程中遇到的错误

由于我们是直接解压的,没有安装,为了不用手动指定mycat的路径,我们 在/usr/bin下建立软连接,连接用户目录下的mycat和我们解压路径下的mycat
在这里插入图片描述
这样就不用指定路径,直接使用mycat
在这里插入图片描述

二、配置文件

mycat/conf:放的MyCat的配置文件

1. server.xml

server.xml配置登录MyCat的账号信息,功能很强大,还可以配置白名单黑名单,限制客户的连接等

  • 用户配置
    在这里插入图片描述
    不需要和MySQL的账号密码一样,因为我们的MySQL Client直接访问的是MyCat,再由MyCat登录MySQL Server。
    USERDB是逻辑库,是一个不存在的库,最终这个库映射到后端的MySQL上,实际上它会真实地映射到MySQL库表当中,所以我们把它叫做逻辑库。这个逻辑库看起来好像在MyCat一台机器上,实际上经过分库分表操作可能分配在不同的机器上,我们只需要操作这个逻辑库就可以,其他的不用关心。多个逻辑库的话,用逗号分隔开
  • 防火墙配置
    在这里插入图片描述

2. schema.xml

schema.xml配置逻辑库与数据源、读写分离、分库分表等

schema.xml配置以下三点:

  1. 逻辑库和逻辑表:MySQL Client都是操作的MyCat上的逻辑库(schema)和逻辑表
  2. 数据节点:这个库或者表的内容放在哪个节点(dataNode)上,这个节点对应具体的物理机器(dataHost)
  3. 以下三个地方需要相同(其中逻辑库、数据节点以及数据库主机名称都可以随便取)
    在这里插入图片描述
    在这里插入图片描述
  • maxCon、minCon:连接池的最大、最小连接量
  • balance:
    0:不开启读写分离
    1:全部的readHost和stand by writeHost参与select语句的负载 ,比如2套1主2从,M1叫做writeHost,S1、S2、S3、S4 叫做readHost,M2叫做stand by writeHost
    2:所有读操作随机在readHost和writeHost上分发
    3:所有读请求随机分发到writeHost对应的readHost上执行(最常使用,所有的select操作都在salve从库上执行,master主库只做写操作)
  • writeType: 0表示所有写操作发送到配置的第一个writeHost,第一个挂掉切换到还在的第二个 writeHost
  • switchType(切换的类型,当一个master挂了,切换到另一个master上):
    -1:不自动切换
    1:根据心跳select user()自动切换
    2:基于MySQL的主从同步状态决定是否进行切换,即MyCat发送show slave status给MySQL Server
  • writeHost、readHost:配置写服务器(master)和读服务器(slave),readHost标签在writeHost内,表示读服务器是slave,图中黄色框中是配置了一个一主一从,嵌套多个readHost标签就是配置一主多从。图中并列的writeHost标签表示备份的写库,当master宕机后,slave也将无法和master配合工作,会切换到备份的写库继续工作。其实图中配置的是多主多从
  • heartbeat:MyCat定时发送指定语句给MySQL Server,如果能正常返回数据,则表示正常工作;若不能正常返回数据,则表示机器故障,MyCat需要进行容灾切换

如果slave有问题,master是正常,就会在master上做读和写操作
如果master有问题,slave是正常,此时slave是没法单独使用的,它会在多主多从的配置中找下一套主从配置来使用
如果主从都正常,master做写操作,slave做读操作

三、启动服务

查看配置文件mycat/conf/schema.xml
在这里插入图片描述
启动MyCat
在这里插入图片描述
查看服务是否正常
在这里插入图片描述

1. 配置文件问题一

mycat/schema.xml中备份的主库没有结束标签
在这里插入图片描述
配置好后重启MyCat程序
在这里插入图片描述
如果配置上有问题,启动服务看不出来,应该查看mycat/logs/warpper.log,记录了mycat启动过程中的错误,vim + logs/warpper.log
在这里插入图片描述

2. 配置文件问题二

mycat/schema.xml中读库的端口出错
在这里插入图片描述
配置好后重启MyCat程序
在这里插入图片描述
同样地,配置上有问题,启动服务看不出来,查看mycat/logs/warpper.log,记录了mycat启动过程中的错误
在这里插入图片描述
我们看到心跳不成功了,就应该判断是网络原因,或者是ip:port配置原因,于是我们看到了3309端口,就知道是配置的端口错误

四、MyCat 9066端口和8066端口

开启mycat后台服务
在这里插入图片描述

1. 9066管理端口

在Linux Shell下登录mycat的9066端口(使用mycat/conf/server.xml中配置的登录用户名和密码登录)

登录mycat后也是进入了一个MySQL Shell,monitor表示状态监控
在这里插入图片描述
show @@help可以显示MyCat的管理端支持的命令
在这里插入图片描述
show @@database查看逻辑库
在这里插入图片描述
show @@datanode查看逻辑节点和真实库之间的映射关系
在这里插入图片描述
show @@datasource查看数据源
在这里插入图片描述

2. 8066数据端口

在Linux Shell下登录mycat的8066端口(使用mycat/conf/server.xml中配置的登录用户名和密码登录)

OpenCloundDB表示我们看到的是一个云状数据库,云后面是如何提供的库表的服务能力,我们是不知道的。mycat就是云DB,把后端所有的细节给客户端隐藏了,客户端只需要去处理代理服务器上的DB就可以了。可以看作一个反向代理服务器
在这里插入图片描述
查看数据库
在这里插入图片描述
这个逻辑库USERDB对应的就是真实库mytest
在这里插入图片描述
我们作为客户端在代码上操作数据库的时候,操作的都是8066,操作的数据库是USERDB,而不是后台真实的数据库。

五、验证读写分离

按照上面的操作我们读写分离就正常配置好了
在这里插入图片描述
上面这个操作是在从库(Win10下的MySQL)上运行的,如果做update操作或者insert操作是在主库(Linux下的MySQL)上进行操作的,我们应该如何去验证呢?

查询日志是可以把所有操作都记录下来的

1. 打开查询日志general_log

打开windows从库上的general_log
在这里插入图片描述
在这里插入图片描述
在Linux也打开主库的general_log
在这里插入图片描述

2. 验证读操作在slave

我们现在登录MyCat 8066数据端口,作为客户端代码操作也是8066端口逻辑库下面的user表
在这里插入图片描述
在Linux下的master服务器查看general_log,我们只看见了mycat发送的心跳包,并没有看见查询user表的SQL
在这里插入图片描述
在windows下的slave服务器中查看general_log,看到了mycat发送的查询user表的SQL
在这里插入图片描述
没有问题,现在读操作是正确发送给了slave

3. 验证写操作在master

我们现在登录MyCat 8066数据端口,给user表insert一条数据
在这里插入图片描述
在Linux下的master服务器查看general_log,我们看见了insert数据的SQL,所以写是在主库写
在这里插入图片描述
在windows下的slave服务器中查看general_log,没有发现insert数据的SQL
在这里插入图片描述
没有问题,写操作正确发送给了master

这样我们就验证了我们主从复制是确实没有问题,是生效的,我们所有的写都是在master上进行的,读都是在slave上进行的,这就是读写分离,比我们单个主机即做写操作又做读操作肯定能提升它的能力。

4. 验证容灾功能

我们在mycat/conf/schema.xml中配置的是多住多从,M1挂了,读写操作会全部转发到M2

在我们当前环境中,就是Linux上的MySQL Server挂了,所有的读写操作都会转发给Windows上的MySQL Server
在这里插入图片描述
关闭linux上的mysqld服务,相当于关闭了master
在这里插入图片描述
我们现在登录MyCat 8066数据端口,对user表分别读写操作
在这里插入图片描述
查看我们多主多从中备用系统的general_log,即Windows上的MySQL Server的general_log
在这里插入图片描述
可以看见,由于master挂了,读写操作都被转发到了备用的Windows上的MySQL Server,证明容灾没有问题

猜你喜欢

转载自blog.csdn.net/qq_41721746/article/details/125718645