第437集MyCat配置详解与优化
|字数总计:5.5k|阅读时长:25分钟|阅读量:
MyCat配置详解与优化
1. MyCat概述
1.1 什么是MyCat
MyCat是一个开源的数据库中间件,基于阿里开源的Cobar产品而研发。MyCat是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分库分表、容灾备份,而且可以用于多租户应用开发、云平台基础设施。
核心特性:
- 读写分离:自动路由读写操作
- 分库分表:支持水平分库分表
- 负载均衡:自动负载均衡
- 高可用性:支持故障自动切换
- SQL拦截:支持SQL拦截和改写
1.2 MyCat的应用场景
1. 读写分离
场景:读多写少的应用
优势:
- 自动路由读操作到从库
- 写操作发送到主库
- 对应用透明
2. 分库分表
场景:单表数据量过大
优势:
3. 多租户
场景:SaaS应用
优势:
4. 数据库集群
场景:多数据库集群管理
优势:
1.3 MyCat架构
1 2 3 4 5
| Application ↓ MyCat (中间件) ↓ MySQL Cluster (主从/集群)
|
MyCat作用:
- 作为应用和数据库之间的代理层
- 对应用透明
- 提供统一的访问接口
2. MyCat安装部署
2.1 环境要求
系统要求
- 操作系统:Linux(推荐CentOS 6/7)
- Java版本:JDK 1.7+
- 内存:至少512MB,推荐2GB+
- 磁盘:至少100MB可用空间
网络要求
2.2 安装步骤
1. 安装Java环境
1 2 3 4 5 6 7 8
| java -version
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
|
输出示例:
1 2 3
| openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
|
2. 下载MyCat
1 2 3 4 5 6 7 8 9 10 11 12
| mkdir -p /usr/local/mycat
cd /usr/local wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -xzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /usr/local/
|
3. 配置环境变量(可选)
1 2 3 4 5 6 7 8 9
| vim /etc/profile
export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$MYCAT_HOME/bin
source /etc/profile
|
4. 验证安装
1 2 3 4 5 6 7 8
| ls -la /usr/local/mycat/
|
3. MyCat配置文件详解
3.1 配置文件结构
MyCat的配置文件位于/usr/local/mycat/conf/目录下:
1 2 3 4 5 6
| conf/ ├── server.xml # MyCat服务器配置 ├── schema.xml # 逻辑库表配置 ├── rule.xml # 分片规则配置 ├── log4j2.xml # 日志配置 └── wrapper.conf # JVM配置
|
3.2 server.xml配置详解
server.xml是MyCat服务器配置文件,定义系统参数、用户权限等。
3.2.1 系统参数配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="charset">utf8mb4</property> <property name="processors">4</property> <property name="processorExecutor">4</property> <property name="sequnceHandlerType">0</property> <property name="defaultMaxLimit">100</property> <property name="idleTimeout">1800000</property> <property name="frontWriteQueueSize">4096</property> <property name="bindIp">0.0.0.0</property> </system> </mycat:server>
|
关键参数说明:
| 参数 |
说明 |
默认值 |
推荐值 |
serverPort |
应用连接端口 |
8066 |
8066 |
managerPort |
管理端口 |
9066 |
9066 |
charset |
字符集 |
utf8 |
utf8mb4 |
processors |
进程数 |
1 |
CPU核心数 |
processorExecutor |
线程池大小 |
16 |
CPU核心数×2 |
defaultMaxLimit |
默认最大返回数据量 |
100 |
根据业务调整 |
idleTimeout |
连接空闲超时 |
1800000 |
1800000 |
3.2.2 用户配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <user name="root"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="readOnly">false</property> <privileges check="false"> <schema name="TESTDB" dml="0110"> <table name="tb01" dml="0000"></table> </schema> </privileges> </user>
<user name="appuser"> <property name="password">123456</property> <property name="schemas">blog,www</property> </user>
|
用户配置说明:
| 属性 |
说明 |
示例 |
name |
用户名 |
appuser |
password |
密码 |
123456 |
schemas |
授权的逻辑库 |
blog,www |
readOnly |
是否只读 |
false |
权限配置(dml):
0000:禁止所有操作
0110:允许INSERT、UPDATE
1111:允许所有操作(INSERT、UPDATE、SELECT、DELETE)
3.3 schema.xml配置详解
schema.xml是MyCat的核心配置文件,定义逻辑库、逻辑表、数据节点、数据源等。
3.3.1 逻辑库配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="tb01" dataNode="dn1" rule="auto-sharding-long"/> </schema>
<schema name="blog" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema> <schema name="www" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
</mycat:schema>
|
schema属性说明:
| 属性 |
说明 |
默认值 |
name |
逻辑库名称 |
- |
checkSQLschema |
是否检查SQL中的schema |
false |
sqlMaxLimit |
最大返回行数 |
100 |
dataNode |
默认数据节点 |
- |
3.3.2 数据节点配置
1 2 3
| <dataNode name="dn1" dataHost="dh1" database="blog" /> <dataNode name="dn2" dataHost="dh2" database="www" />
|
dataNode属性说明:
| 属性 |
说明 |
示例 |
name |
数据节点名称 |
dn1 |
dataHost |
数据主机池 |
dh1 |
database |
物理数据库名 |
blog |
3.3.3 数据主机配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>SELECT user()</heartbeat>
<writeHost host="master" url="192.168.70.160:3306" user="blog" password="Bgx123.com"> <readHost host="slave1" url="192.168.70.161:3306" user="blog" password="Bgx123.com" /> <readHost host="slave2" url="192.168.70.162:3306" user="blog" password="Bgx123.com" /> </writeHost> </dataHost>
|
dataHost属性说明:
| 属性 |
说明 |
可选值 |
推荐值 |
maxCon |
最大连接数 |
- |
1000 |
minCon |
最小连接数 |
- |
10 |
balance |
负载均衡类型 |
0,1,2,3 |
1 |
writeType |
写操作类型 |
0,1,2 |
0 |
dbType |
数据库类型 |
mysql |
mysql |
dbDriver |
数据库驱动 |
native,jdbc |
native |
switchType |
切换类型 |
-1,1,2,3 |
1 |
slaveThreshold |
从库延迟阈值 |
- |
100 |
balance参数详解:
| 值 |
说明 |
适用场景 |
0 |
不开启读写分离,所有操作都发送到writeHost |
测试环境 |
1 |
所有readHost和writeHost都参与读操作负载均衡 |
✅ 推荐 |
2 |
读操作随机在writeHost和readHost上分发 |
特殊场景 |
3 |
所有读操作都发送到readHost |
读写分离 |
writeType参数详解:
| 值 |
说明 |
适用场景 |
0 |
所有写操作发送到第一个writeHost |
✅ 推荐 |
1 |
写操作随机发送到writeHost |
双主场景 |
2 |
写操作按模块发送 |
特殊场景 |
switchType参数详解:
| 值 |
说明 |
适用场景 |
-1 |
不自动切换 |
测试环境 |
1 |
自动切换 |
✅ 推荐 |
2 |
基于MySQL主从状态切换 |
主从场景 |
3 |
基于MySQL Galera Cluster切换 |
集群场景 |
3.3.4 心跳检测
1 2
| <heartbeat>SELECT user()</heartbeat>
|
心跳SQL说明:
- 用于检测数据库是否可用
- 建议使用简单的SQL,如
SELECT user()或SELECT 1
- 心跳间隔由MyCat自动控制
3.4 rule.xml配置详解
rule.xml定义分片规则,用于分库分表场景。
3.4.1 分片规则配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function> </mycat:rule>
|
常用分片规则:
| 规则名称 |
说明 |
适用场景 |
auto-sharding-long |
按长整型范围分片 |
ID范围分片 |
mod-long |
按长整型取模分片 |
均匀分片 |
sharding-by-date |
按日期分片 |
时间序列数据 |
sharding-by-pattern |
按模式分片 |
复杂分片规则 |
3.5 log4j2.xml配置详解
log4j2.xml配置MyCat的日志输出。
3.5.1 日志级别配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="RollingFile" fileName="logs/mycat.log" filePattern="logs/mycat-%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Root> <Logger name="io.mycat" level="debug" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Logger> </Loggers> </Configuration>
|
日志级别:
ERROR:错误信息
WARN:警告信息
INFO:一般信息(推荐)
DEBUG:调试信息(开发环境)
4. MyCat读写分离配置
4.1 基础读写分离配置
4.1.1 环境准备
数据库环境:
- 主库:192.168.70.160
- 从库1:192.168.70.161
- 从库2:192.168.70.162
4.1.2 配置schema.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="blog" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="dh1" database="blog" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>SELECT user()</heartbeat>
<writeHost host="master" url="192.168.70.160:3306" user="blog" password="Bgx123.com"> <readHost host="slave1" url="192.168.70.161:3306" user="blog" password="Bgx123.com" /> <readHost host="slave2" url="192.168.70.162:3306" user="blog" password="Bgx123.com" /> </writeHost> </dataHost>
</mycat:schema>
|
4.1.3 配置server.xml
1 2 3 4 5
| <user name="blog"> <property name="password">123456</property> <property name="schemas">blog</property> </user>
|
4.1.4 启动MyCat
1 2 3 4 5 6 7 8
| /usr/local/mycat/bin/mycat start
/usr/local/mycat/bin/mycat status
tail -f /usr/local/mycat/logs/mycat.log
|
4.1.5 测试读写分离
1 2 3 4 5 6 7 8
| mysql -h127.0.0.1 -P8066 -ublog -p123456
mysql> INSERT INTO blog.t1 VALUES (1, 'test');
mysql> SELECT * FROM blog.t1;
|
验证:查看MyCat日志,可以看到读写操作分别发送到不同的数据库。
4.2 高级读写分离配置
4.2.1 多数据源配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"> <heartbeat>SELECT user()</heartbeat>
<writeHost host="master1" url="192.168.70.160:3306" user="blog" password="Bgx123.com"> <readHost host="slave1" url="192.168.70.161:3306" user="blog" password="Bgx123.com" /> </writeHost> <writeHost host="master2" url="192.168.70.163:3306" user="blog" password="Bgx123.com"> <readHost host="slave3" url="192.168.70.164:3306" user="blog" password="Bgx123.com" /> </writeHost> </dataHost>
|
4.2.2 读写分离策略
balance=”1”策略:
- 所有readHost和writeHost都参与读操作负载均衡
- 写操作发送到writeHost
- 推荐配置
balance=”3”策略:
- 所有读操作都发送到readHost
- 写操作发送到writeHost
- 严格的读写分离
5. MyCat分库分表配置
5.1 水平分表配置
5.1.1 按ID范围分片
场景:按ID范围将数据分布到不同的表
配置rule.xml:
1 2 3 4 5 6 7 8 9 10 11 12
| <tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function>
|
配置autopartition-long.txt:
1 2 3 4 5
| # range start-end ,data node index # K=1000,M=10000. 0-500M=0 500M-1000M=1 1000M-1500M=2
|
配置schema.xml:
1 2 3
| <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="t1" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"/> </schema>
|
5.1.2 按ID取模分片
场景:按ID取模均匀分布数据
配置rule.xml:
1 2 3 4 5 6 7 8 9 10 11 12
| <tableRule name="mod-long"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">3</property> </function>
|
配置schema.xml:
1 2 3
| <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="t1" dataNode="dn1,dn2,dn3" rule="mod-long"/> </schema>
|
5.2 水平分库配置
5.2.1 按库分片
场景:将数据分布到不同的数据库
配置schema.xml:
1 2 3 4 5 6 7 8
| <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="t1" dataNode="dn1,dn2,dn3" rule="mod-long"/> </schema>
<dataNode name="dn1" dataHost="dh1" database="db1" /> <dataNode name="dn2" dataHost="dh1" database="db2" /> <dataNode name="dn3" dataHost="dh1" database="db3" />
|
5.3 垂直分库配置
5.3.1 按业务分库
场景:不同业务使用不同的数据库
配置schema.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <schema name="userdb" checkSQLschema="false" dataNode="dn1"></schema>
<schema name="orderdb" checkSQLschema="false" dataNode="dn2"></schema>
<schema name="productdb" checkSQLschema="false" dataNode="dn3"></schema>
<dataNode name="dn1" dataHost="dh1" database="user_db" /> <dataNode name="dn2" dataHost="dh1" database="order_db" /> <dataNode name="dn3" dataHost="dh1" database="product_db" />
|
6. MyCat性能优化
6.1 系统参数优化
6.1.1 server.xml参数优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <system> <property name="processors">4</property> <property name="processorExecutor">8</property> <property name="frontWriteQueueSize">8192</property> <property name="backendWriteQueueSize">8192</property> <property name="idleTimeout">300000</property> </system>
|
6.1.2 JVM参数优化
编辑wrapper.conf:
1 2 3 4 5 6 7
| # JVM内存配置 wrapper.java.initmemory=512 wrapper.java.maxmemory=2048
# GC参数 wrapper.java.additional.1=-XX:+UseG1GC wrapper.java.additional.2=-XX:MaxGCPauseMillis=200
|
推荐配置:
- 初始内存:512MB
- 最大内存:2GB-4GB(根据服务器内存调整)
- 使用G1垃圾回收器
6.2 连接池优化
6.2.1 dataHost连接池配置
1 2
| <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
|
参数优化:
maxCon:根据实际并发调整,建议500-2000
minCon:保持最小连接数,建议10-50
- 避免设置过大,导致数据库连接过多
6.3 SQL优化
6.3.1 避免跨库JOIN
不推荐:
1 2
| SELECT * FROM db1.t1 JOIN db2.t2 ON t1.id = t2.id;
|
推荐:
6.3.2 使用分片键查询
推荐:查询条件包含分片键
1 2 3 4 5
| SELECT * FROM t1 WHERE id = 100;
SELECT * FROM t1 WHERE name = 'test';
|
6.4 监控优化
6.4.1 开启监控
连接管理端口:
1 2 3 4 5 6 7 8 9 10 11
| mysql -h127.0.0.1 -P9066 -uroot -p123456
mysql> show @@connection;
mysql> show @@datasource;
mysql> show @@sql;
|
6.4.2 日志监控
开启debug日志:
1 2 3 4 5
| <Logger name="io.mycat" level="debug" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Logger>
|
分析日志:
1 2 3 4 5
| grep "slow" /usr/local/mycat/logs/mycat.log
grep "ERROR" /usr/local/mycat/logs/mycat.log
|
7. MyCat高可用配置
7.1 主从切换配置
7.1.1 自动切换配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"> <heartbeat>SELECT user()</heartbeat>
<writeHost host="master" url="192.168.70.160:3306" user="blog" password="Bgx123.com"> <readHost host="slave1" url="192.168.70.161:3306" user="blog" password="Bgx123.com" /> </writeHost> <writeHost host="master2" url="192.168.70.163:3306" user="blog" password="Bgx123.com"> <readHost host="slave2" url="192.168.70.164:3306" user="blog" password="Bgx123.com" /> </writeHost> </dataHost>
|
**switchType=”1”**:自动切换,主库故障时自动切换到备用主库。
7.2 MyCat集群部署
7.2.1 多MyCat实例
架构:多个MyCat实例 + 负载均衡器
1 2 3 4 5 6 7
| Application ↓ LVS/HAProxy (负载均衡) ↓ MyCat1, MyCat2, MyCat3 ↓ MySQL Cluster
|
配置:
- 多个MyCat实例使用相同的配置
- 使用负载均衡器分发请求
- 实现MyCat高可用
8. MyCat常见问题与解决方案
8.1 连接问题
问题:无法连接MyCat
排查步骤:
1 2 3 4 5 6 7 8 9 10 11
| /usr/local/mycat/bin/mycat status
netstat -tlnp | grep 8066
iptables -L -n | grep 8066
tail -f /usr/local/mycat/logs/mycat.log
|
8.2 读写分离问题
问题:读操作没有发送到从库
排查:
1 2 3 4
| <dataHost name="dh1" balance="1"> </dataHost>
|
验证:
1 2 3
|
tail -f /usr/local/mycat/logs/mycat.log | grep "route"
|
8.3 分片问题
问题:分片查询性能差
原因:
解决:
- 查询条件包含分片键
- 避免跨库JOIN
- 在应用层处理
9. MyCat最佳实践
9.1 配置建议
1. 使用balance=”1”
推荐:使用balance=”1”实现读写分离
1
| <dataHost name="dh1" balance="1">
|
2. 合理设置连接池
建议:
- maxCon:500-2000
- minCon:10-50
- 根据实际并发调整
3. 开启健康检查
建议:使用简单的心跳SQL
1
| <heartbeat>SELECT user()</heartbeat>
|
9.2 性能优化建议
1. 避免跨库操作
- 查询条件包含分片键
- 避免跨库JOIN
- 在应用层处理
2. 合理分片
- 分片键选择高基数列
- 避免数据倾斜
- 定期检查分片分布
3. 监控告警
9.3 安全建议
1. 用户权限
2. 网络安全
10. 总结
10.1 MyCat的核心价值
- 读写分离:自动路由读写操作
- 分库分表:支持水平分库分表
- 负载均衡:自动负载均衡
- 高可用性:支持故障自动切换
- 透明代理:对应用透明
10.2 配置要点
- server.xml:系统参数和用户配置
- schema.xml:逻辑库表和数据源配置
- rule.xml:分片规则配置
- log4j2.xml:日志配置
10.3 架构师建议
- 合理规划:根据业务需求选择配置
- 性能优化:优化连接池和JVM参数
- 监控告警:建立完善的监控体系
- 高可用:配置主从切换和集群
- 文档维护:记录配置和变更
10.4 MyCat检查清单
相关文章: