说明:
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
1. jdk1.8安装
详见jdk环境安装
2. Mysql安装
详见mysql8.0.11源码安装,实际使用的是mysql8.0.16
3. Mysql 主从配置
详见主从同步原理和mysql的主从同步详解
3.1 安装mycat服务
3.1.1 部署mycat
cd /root
wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
tar -xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local
cd /usr/local/mycat/conf
- /usr/local/mycat/conf/server.xml:定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
- /usr/local/mycat/conf/schema.xml:定义逻辑库,表、分片节点等内容。
- /usr/local/mycat/conf/rule.xml:定义分片规则
3.1.2 server.xml配置文件
server.xml文件跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等(关注user标签即可),因此在这里简单说明。
<user name="mycat" defaultAccount="true"> #通过mycat登录的用户名和密码<property name="password">123456</property><property name="schemas">mycatDB</property> <!-- #逻辑库,真实不存在的库,可以自定义修改,但一定要对应上,要不然就会报错 --><property name="defaultSchema">mycatDB</property> <!-- #逻辑库,真实不存在的库,可以自定义修改 --><!-- 表级 DML 权限设置 --><!-- <privileges check="false"><schema name="TESTDB" dml="0110" > #0000分表表示数据库的增删改查,0比表示关闭,1表示打开,如果配置 name需和前面定义的一致<table name="tb01" dml="0000"></table> #0000分表表示数据表的增删改查,0比表示关闭,1表示打开<table name="tb02" dml="1111"></table></schema></privileges> --></user><user name="user"> <!-- 这个账号只能读不能写,见下面的定义readOnly --><property name="password">user</property><property name="schemas">mycatDB</property><property name="readOnly">true</property><property name="defaultSchema">mycatDB</property>
</user>
说明:
- server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息。
- 逻辑库名(如上面的mycatDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
- 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!
3.1.3 schema.xml配置文件
schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!
schema.xml文件分为三部分,分别时schema、dataNode、dataHost
- schema
<schema name="mycatDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> <!-- 其中name要和server.xml中定义的逻辑看必须一致;checkSQLschema 表示是否检测语法,一般不需要,因为要连接多个数据库,语法不一样;sqlMaxLimit 每个sql语句最多返回100条--><!-- 如果不进行分库分表,下面的配置可以不用管,注释即可 --><!-- auto sharding by id (long) --><!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置--><!-- <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/> --><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> -->
</schema>
- dataNode
<!-- dataNode用于配置物理数据库的名称,name可以自定义;dataHost自定义,但是需要和后面的dataHost有对应关系;database是真实存在的库 -->
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> -->
- dataHost
<!-- dataHost 是用于配置读写分离的,name 自定义,但需要和dataNode中的dataHost完全一致;maxCon和minCon 表示最大最小连接数量;balance表示负载均衡策略;writeType已废弃,无需关注;dbType是mycat连接数据库的类型;dbDriver指数据库的驱动类型(如果dbType配的是Oracle,dbDriver则是jdbc);switchType 配置故障切换类型,需要配合下面的心跳机制heartbeat;slaveThreshold 指的是从节点的数量--><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat> <!-- 心跳sql语句,需要配置故障切换类型 --><!-- can have multi write hosts --><!-- 写节点的配置:host 自定义即可;url 数据库的url连接地址;user 和 password指访问这个库的用户名和密码;如果是一主一从就配置一个writeHost和一个readHost,一主多从>就配置一个writeHost和多个readHost,多主多从就配置多个writeHost和多个readHost --><writeHost host="hostM1" url="localhost:3306" user="root"password="123456"><!-- can have multi read hosts --><!-- 读节点的配置: host 自定义即可;url 数据库的url连接地址;user 和 password指访问这个库的用户名和密码 --><readHost host="hostS1" url="localhost:3316" user="root" password="123456" /></writeHost><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
3.1.4 标签属性
Balance属性
- balance=“0”:不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
- balance=“1”:
读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand
by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与
M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡
balance=“2”:读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、
readhost 上分发。 - balance=“3”:读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost
对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType属性(已废弃,直接跳过)
- writeType=“0”:所有写操作发送到配置的第一个
writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties
. - writeType=“1”:所有写操作都随机的发送到配置的writeHost。
- writeType=“2”:没实现。
switchType 属性,主从切换(双主failover)
- switchType=“-1”:不自动切换
- switchType=“1”:默认值,自动切换
- switchType=“2”:基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
- switchType=“3”:基于Mysql Galera
Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like ‘wsrep%’
dbType属性
指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark等。
dbDriver属性
指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。
- native
使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。 - JDBC
其他类型的数据库则需要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。
如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。
3.1.5 读写分离配置
cat server.xml
...
...
...<user name="mycat" defaultAccount="true"><property name="password">mycat123</property><property name="schemas">mycatDB</property><property name="defaultSchema">mycatDB</property></user>
...
...
...
cat schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="mycatDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="external_service" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>show slave status</heartbeat><writeHost host="hostM1" url="10.99.200.110:3306" user="dba" password="dba110"><readHost host="hostS1" url="10.99.200.111:3306" user="dba" password="dba111" /></writeHost></dataHost>
</mycat:schema>
3.1.6 启动服务
修改mycat的启动内存(/usr/local/mycat/conf/wrapper.conf)
启动方式
cd /usr/local/mycat/bin
./mycat console|stop|start|restart|dump #前台启动|停止|后台启动|导入
登录验证
主从同步ok
手动使得主从的数据不一致
验证读写分离
读的是从节点的数据