数据库中间件Mycat
1、相关概念
数据库中间件:连接java应用程序和数据库
一般应用程序与数据库的交互存在的问题:
-
java与数据库紧耦合
-
高访问量并发对数据库的压力太大
-
对数据库的读与写请求的需求不一样
故为解决上面的问题,引入了数据库的中间件Mycat,这时候java应用程序不需要关注我的sql语句发送到哪一台mysql服务器,都交给Mycat来管理。

2、Mycat简介
2.1、Mycat作用
1、读写分离
2、数据分片:垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库+分表)
3、多数据源整合
2.2 原理
Mycat的原理中最重要的是“拦截”,它拦截用户发过来的SQL语句,对SQL做特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发送后端的真实数据库、并将返回的结果做适当的处理,最终再返回给用户。
1.6.7.4-release版本下载地址:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/
2.3 Mysql主从复制原理

- 主机将写操作记录到一个Binary log二进制日志里
- 丛机去读取Binary log日志
- 丛机将读取的日志写进一个中继日志Relay log里
- 丛机的数据库再执行replay log日志里的sql
主机只有一台,而从机可以有多台,Mysql的主从复制是从接入点开始复制,以前主机发生的任何事情和丛机无关。由于在这个过程中会发生多次读取日志的I/O,故主从复制会有延时性的问题。
3、Mysql主从配置
3.1mycat配置
打开mycat安装目录下的conf文件夹下的schema.xml文件,配置如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义一个MyCat的模式,此处定义了一个逻辑数据库名称TestDB -->
<!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
<!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
<!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
<!-- 定义个数据的操作节点,以后这个节点会进行一些库表分离使用 -->
<!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
<!-- “database="mldn"”:定义数据节点要使用的数据库名称 -->
<dataNode name="dn1" dataHost="localhost1" database="mydb" />
<!-- 定义数据节点,包括各种逻辑项的配置 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 配置真实MySQL与MyCat的心跳 -->
<heartbeat>select user()</heartbeat>
<!-- 配置真实的MySQL的连接信息 -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.138.128:3306" user="root" password="123456"/> <!-- 读数据库配置,要放在writeHost标签里面!!! -->
</writeHost>
</dataHost>
</mycat:schema>
对于dataHost标签的balance属性备注(写操作都是在主机上的):
1、Balance="0"时,不开启读写分离操作,所有读操作会发往第一个writeHost(不会发readHost)
2、Balance="1"时,全部readHost与stand by writeHost参与select语句的负载均衡
3、Balance="2"时,读操作会随机发往writeHost以及 readHost,理论上实现的是负载均衡
4、Balance="3"时,所有读操作都在readHost上,writeHost不负担读压力
一般设置成“1”为:双主双从
“3”为:单主单从
在同级目录下server.xml的里面配置账号信息如下(主要是配置默认账号、数据库、只读账号、密码):
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
3.2 配置主机数据库
打开mysql的安装目录下(win10默认安装目录:C:\ProgramData\MySQL\MySQL Server 8.0)下的my.ini文件,在文件末尾添加一下内容:
#以下是配置主从复制的配置项,此为主机
#主服务器唯一ID
server-id=1
#启动二进制日志
log-bin=mysql-bin
#指定要复制的数据库
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT
3.3 配置从机数据库
同理在从机的my.ini添加一下内容:
#以下是配置mysql主从复制的配置项,此为从机
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
3.4 测试
1、配置完成后重启两个mysql服务及mycat服务器、关闭防火墙。
**注意:**在修改了my.ini文件后,mysql服务重启失败提示:“本地计算机.上的MySQL80服务启动后停止。某些服务在未由其他服务或程序 使用时将自动停止”,
这是后将my.ini文件用notepad++打开编码选择ANSI编码保存即可。
2、在主机上创建一个账号slave并授权命令(不要用工具连接执行,可能报错)
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
3、只用mysql的命令窗口执行
show master status;

4、在从机执行以下命令(下面的参数要和主机的参数想对应):
change master to master_host=’192.168.2.236’,
master_user=’slave’,
master_password=’123456’,
master_log_file=’mysql-bin.000001’,
master_log_pos=156;
从机执行完命令后重启一下服务,就配置完成了。
这时候可以在主机的testdb数据库建表,从机数据库也能同步了。
最后启动mycat,使用工具连接即可实现mycat与mysql主从复制配合的读写分离(一主一从模式)。

本文介绍Mycat数据库中间件的基本概念、作用原理及其配置方法,并详细展示了如何利用Mycat实现MySQL的主从复制与读写分离。
848

被折叠的 条评论
为什么被折叠?



