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可用空间

网络要求

  • 端口
    • 8066:应用连接端口
    • 9066:管理端口

2.2 安装步骤

1. 安装Java环境

1
2
3
4
5
6
7
8
# 检查Java版本
java -version

# 如果没有安装,安装Java
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

# 下载MyCat(以1.6版本为例)
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

# 添加MyCat环境变量
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

# 使配置生效
source /etc/profile

4. 验证安装

1
2
3
4
5
6
7
8
# 查看MyCat目录结构
ls -la /usr/local/mycat/

# 目录结构
# bin/ - 启动脚本
# conf/ - 配置文件
# lib/ - 依赖库
# logs/ - 日志文件

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>
<!-- MyCat服务端口 -->
<property name="serverPort">8066</property>

<!-- 管理端口 -->
<property name="managerPort">9066</property>

<!-- MyCat字符集 -->
<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>

<!-- 绑定IP -->
<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>

<!-- 应用连接mycat账户 -->
<user name="appuser">
<!-- 应用连接mycat密码 -->
<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>

<!-- 链接mycat后的显示名称 -->
<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
<!-- dateNode数据节点 dataHost相当于主机池 -->
<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
<!-- 定义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>

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>

<!-- 开启debug日志 -->
<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
<!-- 应用连接mycat账户 -->
<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
# 启动MyCat
/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
# 连接MyCat
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>
<!-- 进程数:设置为CPU核心数 -->
<property name="processors">4</property>

<!-- 线程池大小:CPU核心数×2 -->
<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
-- 跨库JOIN性能差
SELECT * FROM db1.t1 JOIN db2.t2 ON t1.id = t2.id;

推荐

1
2
3
4
-- 在应用层处理
-- 1. 查询db1.t1
-- 2. 应用层处理
-- 3. 查询db2.t2

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;

# 查看SQL统计
mysql> show @@sql;

6.4.2 日志监控

开启debug日志

1
2
3
4
5
<!-- log4j2.xml -->
<Logger name="io.mycat" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Logger>

分析日志

1
2
3
4
5
# 查看慢SQL
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
# 1. 检查MyCat是否启动
/usr/local/mycat/bin/mycat status

# 2. 检查端口是否监听
netstat -tlnp | grep 8066

# 3. 检查防火墙
iptables -L -n | grep 8066

# 4. 查看日志
tail -f /usr/local/mycat/logs/mycat.log

8.2 读写分离问题

问题:读操作没有发送到从库

排查

1
2
3
4
<!-- 检查balance配置 -->
<dataHost name="dh1" balance="1">
<!-- balance="1"表示开启读写分离 -->
</dataHost>

验证

1
2
3
# 开启debug日志
# 查看日志,确认读操作发送到哪个数据库
tail -f /usr/local/mycat/logs/mycat.log | grep "route"

8.3 分片问题

问题:分片查询性能差

原因

  • 查询条件不包含分片键
  • 跨库JOIN

解决

  • 查询条件包含分片键
  • 避免跨库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. 监控告警

  • 监控MyCat性能
  • 监控数据库连接
  • 设置告警阈值

9.3 安全建议

1. 用户权限

  • 最小权限原则
  • 专库专用户
  • 定期审查权限

2. 网络安全

  • 限制访问IP
  • 使用防火墙
  • 使用VPN

10. 总结

10.1 MyCat的核心价值

  1. 读写分离:自动路由读写操作
  2. 分库分表:支持水平分库分表
  3. 负载均衡:自动负载均衡
  4. 高可用性:支持故障自动切换
  5. 透明代理:对应用透明

10.2 配置要点

  1. server.xml:系统参数和用户配置
  2. schema.xml:逻辑库表和数据源配置
  3. rule.xml:分片规则配置
  4. log4j2.xml:日志配置

10.3 架构师建议

  1. 合理规划:根据业务需求选择配置
  2. 性能优化:优化连接池和JVM参数
  3. 监控告警:建立完善的监控体系
  4. 高可用:配置主从切换和集群
  5. 文档维护:记录配置和变更

10.4 MyCat检查清单

  • MyCat是否正常启动
  • 读写分离是否正常
  • 分片规则是否合理
  • 连接池配置是否合理
  • 监控告警是否配置
  • 日志是否正常
  • 高可用是否配置

相关文章