🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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)