[toc]
## 了解配置项
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
| 文件 | 说明 |
| --- | --- |
| server.xml | Mycat的配置文件,设置账号、参数等 |
| schema.xml | Mycat对应的物理数据库和数据库表的配置 |
| rule.xml | Mycat分片(分库分表)规则 |
### **server.xml**
参考链接: [MyCat配置文件详解--server.xml](https://www.cnblogs.com/linjiqin/p/7928573.html)
server.xml包含mycat的系统配置信息,它有两个标签,分别是user和system,掌握system标签的各项配置属性是mycat调优的关键。
重点关注下面这段,其他默认即可。
~~~
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
~~~
| 参数 | 说明 |
| --- | --- |
| user | 用户配置节点 |
| \--name | 登录的用户名,也就是连接Mycat的用户名 |
| \--password | 登录的密码,也就是连接Mycat的密码 |
| \--schemas | 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs |
| \--privileges | 配置用户针对表的增删改查的权限,具体见文档吧 |
server.xml中的标签本就不多,这个标签主要用于定义登录mycat的用户和权限。例如上面的例子中,我定义了一个用户,用户名为test、密码也为test,可访问的schema也只有TESTDB一个
### **schema.xml**
参考链接: [MyCat-schema.xml详解](https://www.cnblogs.com/icebutterfly/p/9505624.html)
Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提
~~~
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 数据库配置,与server.xml中的数据库对应 -->
<schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
<table name="lunchmenu" dataNode="dn1" />
<table name="restaurant" dataNode="dn1" />
<table name="userlunch" dataNode="dn1" />
<table name="users" dataNode="dn1" />
<table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<!-- 分片配置 -->
<dataNode name="dn1" dataHost="test1" database="lunch" />
<dataNode name="dn2" dataHost="test2" database="lunch" />
<!-- 物理数据库配置 -->
<dataHost name="test1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
~~~
| 参数 | 说明 |
| --- | --- |
| schema | 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应 |
| dataNode | 分片信息,也就是分库相关配置 |
| dataHost | 物理数据库,真正存储数据的数据库 |
每个节点的属性逐一说明:
**schema**
| 属性 | 说明 |
| --- | --- |
| name | 逻辑数据库名,与server.xml中的schema对应 |
| checkSQLschema | 数据库前缀相关设置,建议看文档,这里暂时设为false |
| sqlMaxLimit | select 时默认的limit,避免查询全表 |
**table**
| 属性 | 说明 |
| --- | --- |
| name | 表名,物理数据库中表名 |
| dataNode | 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name |
| primaryKey | 主键字段名,自动生成主键时需要设置 |
| autoIncrement | 是否自增 |
| rule | 分片规则名,具体规则下文rule详细介绍 |
**dataNode**
| 属性 | 说明 |
| --- | --- |
| name | 节点名,与table中dataNode对应 |
| datahost | 物理数据库名,与datahost中name对应 |
| database | 物理数据库中数据库名 |
**dataHost**
| 属性 | 说明 |
| --- | --- |
| name | 物理数据库名,与dataNode中dataHost对应 |
| balance | 负载均衡的方式 |
| writeType | 写入方式 |
| dbType | 数据库类型 |
| heartbeat | 心跳检测语句,注意语句结尾的分号要加。 |
>[info] 由上可见,配置顺序应该是 dataHost→DataNode→schema→user(server.xml)
## 一个简单的一主一从的配置读写分离
### **1. 参考前面的文章跑起基于GTID多线程主从复制**
```
主:172.25.0.3
从:172.25.0.4
```
> 一定要保证主从复制是正常运行的
### **2. 配置mycat**
#### 配置schema
~~~
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义MyCat的逻辑库 -->
<schema name="m1" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
<schema name="m2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"></schema>
<schema name="m3" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn3"></schema>
<!-- 定义MyCat的数据节点 -->
<dataNode name="dn1" dataHost="datahost1" database="m1" />
<dataNode name="dn2" dataHost="datahost1" database="m2" />
<dataNode name="dn3" dataHost="datahost1" database="m3" />
<!-- 定义数据主机与读写分离及主从切换规则 -->
<dataHost name="datahost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!-- switchType="2" 通过show slave status检测主从状态,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave
status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。 -->
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="mysql_master:3306" user="root"
password="123456">
<readHost host="hostS1" url="mysql_slave:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
~~~
#### 配置server
system标签暂时保持不变
~~~
<!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群,并通过MyCat实现了读写分离 -->
<user name="user1">
<property name="password">123456</property>
<property name="schemas">m1,m2,m3</property>
</user>
<!-- 用户2,只读权限-->
<user name="user2">
<property name="password">123456</property>
<property name="schemas">m1,m2,m3</property>
<property name="readOnly">true</property>
</user>
~~~
**3. 测试**
```
# 在mycat上执行
SELECT *,SLEEP(5) FROM `m1`.`table`
UPDATE `table` SET `title` = SLEEP(5) WHERE `id` = 1;
# 在主和从查看
SHOW PROCESSLIST;
```
## 参考链接
- [Mycat配置入门](https://github.com/MyCATApache/Mycat-Server/wiki/3.0-Mycat%E9%85%8D%E7%BD%AE%E5%85%A5%E9%97%A8)
- 【mysql的编程专题①】流程控制与其他语法
- 【mysql的编程专题②】触发器
- 【mysql的编程专题③】内置函数
- 【mysql的编程专题④】存储过程
- 【mysql的编程专题⑤】自定义函数
- 【mysql的编程专题⑥】视图
- 【mysql的设计与优化专题(1)】ER图,数据建模与数据字典
- 【mysql的设计与优化专题(2)】数据中设计中的范式与反范式
- 【mysql的设计与优化专题(3)】字段类型与合理的选择字段类型
- 【mysql的设计与优化专题(4)】表的垂直拆分和水平拆分
- 【mysql的设计与优化专题(5)】慢查询详解
- 【mysql的设计与优化专题(6)】mysql索引攻略
- 【Mysql问题集锦(1)】mysql不能使用innodb存储引擎
- 【Mysql进阶技巧(2)】利用mysql生成唯一序号
- 【Mysql进阶技巧(1)】MySQL的多表关联与自连接
- 【Mysql高可用架构(1)】基于日志点的主从复制
- 【Mysql高可用架构(2)】主从管理的系统视图
- 【Mysql高可用架构(3)】基于GTID的主从复制
- 【Mysql高可用架构(4)】在线变更复制类型
- 【Mysql高可用架构(5)】多源复制(多主一从)
- 【Mysql高可用架构(6)】多线程复制
- 【Mysql高可用架构(7)】在线设置复制过滤
- 【Mysql高可用架构(8)】解决主从不一致
- 【Mysql高可用架构(9)】初识mycat以及制作mycat镜像
- 【Mysql高可用架构(10)】mycat配置mysql读写分离
- MyCat 集群部署(HAProxy + MyCat)
- 常用复杂sql语句整理