胸怀万里世界, 放眼无限未来。这篇文章主要讲述Mycat实现MySQL读写分离相关的知识,希望能为你提供帮助。
Mycat是一个开源的分布式数据库系统,是一个实现了mysql协议的服务器,前端用户可以把它看作是一个数据库代理??(类似于Mysql Proxy)??,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。Mycat适用的场景比较多,例如读写分离、分表分开、多租户应用、报表系统、替代Hbase分析大数据等,本篇主要看一下如何利用Mycat实现MySQL读写分离。
笔者这边准备了四台虚拟机,两台作为主从复制架构,分别取名master和slave;一台作为Mycat服务器,取名mycat,Mycat服务器端作为代理服务器,内存建议2G以上;一台作为客户端,取名client。
- ?创建MySQL主从数据库?
master主机和slave主机下载MySQL8.0.26版本数据库,与《主从复制和主主复制的实现》一篇相同,我们先要修改server-id避免冲突,MySQL8.0版本默认开启二进制日志,生产中建议将主节点的二进制日志保存路径与默认路径相分离,从节点建议开启read-only项,修改完毕后启动mysql服务??(如下图)??。
【Mycat实现MySQL读写分离】?1.2 创建账号并授权?
主节点master登录数据库后查看当前的二进制日志位置,同时创建复制账号并授权??(如下图)??。
?1.3 从节点开启复制线程?
从节点slave登录数据库后,根据master创建的账号、密*码、二进制日志位置等信息来复制主节点数据,同时执行? start slave; ?命令开启IO线程和SQL线程保持主从同步??(如下图)??。
?1.4 主从复制测试?
主节点master主机导入hellodb数据库,从节点slave查看数据库时有显示,所以实现了主从复制??(如下图)??。
- ?Mycat服务器端?
? ?Mycat可从官网进行下载??(下载选择界面:http://dl.mycat.org.cn/)??,同时创建一个目录来进行解压??(如下图)??。
Mycat是基于java来实现的,因此还需下载java,CentOS中默认安装的是openjdk。
?2.2 配置环境变量?
查看解压后生成的/apps/mycat/bin目录,里面有一个mycat,即Mycat的启动程序,为了不用在每次启动时都写全路径,可生成PATH变量保存到配置文件中,同时执行source命令生效??(如下图)??。
?2.3 启动Mycat?
在启动前,建议先查看一下内存,如果太小可能会导致服务无法启动,确认内存够用的情况下,执行 ?mycat start ?命令启动Mycat,启动后需等待一会,可以通过/apps/mycat/logs/wrapper.log文件或者状态查看是否启动成功??(如下图)??。
此时查看端口,会发现默认的8066端口已经打开??(如下图)??。
此时,客户端登录后虽然能看到虚拟的TESTDB数据库,缺不能使用,因此还需对Mycat服务器端进行一些配置。
?2.4 修改相关配置?
?2.4.1 修改端口号和密*码?
用户使用Mycat默认的8066端口进行连接时并不是很方便,不符合连接数据库时的习惯,因此可以考虑将端口改为3306。打开/apps/mycat/conf/server.xml文件后,找到< property name="serverPort"> 一行,将8066改为3306,同时要取消前后的注释内容??(如下图)??。
同时默认的登录密*码为123456,过于简单,生产中建议修改,虚拟数据库名称是否修改看个人。
?2.4.2 读写分离策略?
打开/apps/mycat/conf/schema.xml文件,清空所有内容,填写如下图信息,当然在修改前建议先将源文件进行备份。策略中要注意填写可供用户使用的数据库名称,balance设为1表示开启读写分离,同时要填写读操作和写操作对应的主机ip,读写操作部分的用户root不是自带的root,而是要另外创建的。修改完毕,重新启动Mycat服务。
?2.5 master主机创建root账号?
根据mycat服务器端在schema.xml文件中的设定,我们需创建root账号及设定指定密*码,同时要进行授权,让mycat服务器端能使用这个账号和密*码来进行登录。因为是主从复制架构,所以从节点无需再创建root账号??(如下图)??。
- ?测试环节?
因为端口已经改为3306,客户端使用修改后密*码时无需添加端口号,登录后,可以正常使用TESTDB虚拟数据库,且这个数据库就是主从复制数据库中的hellodb数据库??(如下图)??。
?3.2 验证读写分离的实现?
客户端登录数据库后执行 ?select @@server_id; ? 命令,这是一个读操作,返回的结果是从节点slave设置的156,说明读的操作时发生在从节点服务器上的。
客户端对teachers表进行修改,将TID为1的老师年龄改为server-id的值,这是一个写操作,执行后,返回的结果是155,这与主节点服务器上设置的server-id一直,说明写操作是发生在主节点服务器上的??(如下图)??。
?3.3 主从服务器异常测试?
?3.3.1 从节点服务器异常?
假设现在从节点服务器出现故障,笔者这边停掉从节点的MySQL服务,此时客户端如果处于登录数据库的状态,执行读操作会报错,等待一段时间或者退出再登录后,又可以进行读操作??(如下图)??。
在主从复制正常的情况下,客户端执行 ?select @@server_id; ? 命令,返回的数值是从节点的server-id值,此时从节点已经停止了MySQL服务,再次执行该命令时,返回的是主节点服务器的server-id值,说明从节点异常后,虽然会导致主节点服务器的压力大点,并不会影响用户的正常使用??(如下图)??。
从节点服务器重新开启MySQL服务,客户端登录数据库后查看server-id,返回的数值再次变成从节点的server-id值,重新实现读写分离??(如下图)??。
?3.3.2 主节点服务器异常?
笔者这边停掉主节点服务器的MySQL服务模拟异常状态,此时如果客户端有用户正在登录状态,短时间内是可以进行读操作的,但无法进行写操作,稍等几秒时间,读操作也无法执行了,说明Mycat在实现一主一从的数据库架构读写分离时,主节点服务器是不能出异常的??(如下图)??。
推荐阅读
- 部署Tomcat负载均衡 #yyds干货盘点#
- Linux之bc命令
- Ceph 集群部署详细过程
- ansible常用模块介绍
- 运维小白成长记——第十二周
- #yyds干货盘点#frp内网穿透
- SMB案例(利用SAMBA实现/www目录共享)
- Linux系统下vsftpd虚拟ftp用户账号存放在mysql数据库的FTP搭建
- vpp+dpdk安装,使用一个路由例子