Java-130 深入浅出 MySQL MyCat 深入解析 核心配置文件 server.xml 使用与优化
点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!“快的模型 + 深度思考模型 + 实时路由”,持续打造实用AI工具指南!📐🤖
💻 Java篇正式开启!(300篇)
目前2025年09月15日更新到:
Java-124 深入浅出 MySQL Seata框架详解:分布式事务的四种模式与核心架构
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
server.xml
server.xml
是 Mycat 的核心配置文件,几乎保存了所有 Mycat 需要的系统配置信息。这个文件通常位于 Mycat 的 conf
目录下,采用 XML 格式编写,包含了 Mycat 服务器运行时的各项重要参数设置。
该配置文件主要包含以下几类关键配置:
-
系统参数配置:
- 指定 Mycat 服务端口(默认8066)
- 设置管理端口(默认9066)
- 配置字符集
- 定义线程池大小
- 设置连接超时时间
-
用户权限配置:
- 定义访问 Mycat 的用户名和密码
- 设置用户权限(如只读、读写权限)
- 配置用户可访问的 schema
-
防火墙配置:
- 设置 IP 白名单/黑名单
- 配置 SQL 拦截规则
- 定义 SQL 注入防护策略
-
性能调优参数:
- 缓冲区大小设置
- 连接池配置
- 事务处理参数
示例配置片段:
<system><property name="serverPort">8066</property><property name="managerPort">9066</property><property name="charset">utf8</property><property name="processorBufferPool">204800</property>
</system><user name="test"><property name="password">test123</property><property name="schemas">TESTDB</property><property name="readOnly">true</property>
</user>
在实际应用中,修改 server.xml
后需要重启 Mycat 服务才能使配置生效。建议在修改前备份原文件,并在生产环境中谨慎调整参数,因为不当的配置可能导致性能问题或安全风险。
user标签
这个标签主要用于定义登录 Mycat 的用户和权限,例如下面的例子中,我们定义了一个用户,用户名为 user、密码也为 user、可访问 schema为 wzk_order
<user name="user">
<property name="password">user</property>
<property name="schemas">edu_order</property>
<property name="readOnly">true</property>
<property name="defaultSchema">wzk_order</property>
</user>
firewall标签
<firewall>
<!-- ip白名单 用户对应的可以访问的 ip 地址 -->
<whitehost>
<host host="127.0.0.*" user="root"/>
<host host="127.0.*" user="root"/>
<host host="127.*" user="root"/>
<host host="1*7.*" user="root"/>
</whitehost>
<!-- 黑名单允许的 权限 后面为默认 -->
<blacklist check="true">
<property name="selelctAllow">false</property>
<property name="selelctIntoAllow">false</property>
<property name="updateAllow">false</property>
<property name="insertAllow">false</property>
<property name="deletetAllow">false</property>
<property name="dropAllow">false</property>
</blacklist>
</firewall>
全局序列号
在实现分库分表的情况下,数据库自增主键已经无法保证自增主键的全局唯一。为此,MyCat提供了全局的 sequence,并且提供了包含本地配置和数据库配置等多种实现方式。
<system>
<property name="sequnceHandlerType">0</property>
</system>
数据存储与ID生成方式说明
以下是系统中可配置的不同数据存储与ID生成方式的详细说明:
0 - 文件存储方式
- 实现原理:将数据以文件形式存储在本地文件系统中
- 典型应用:适用于单机环境或小型系统
- 示例配置:
storage.type=0
- 特点:
- 实现简单,无需额外依赖
- 数据持久化到磁盘文件
- 性能受限于本地I/O速度
- 不适合分布式环境
1 - 数据库存储方式
- 实现原理:使用关系型数据库存储数据
- 支持数据库:MySQL、Oracle、PostgreSQL等
- 连接配置:
db.url=jdbc:mysql://localhost:3306/db_namedb.username=rootdb.password=123456
- 特点:
- 支持事务特性
- 提供数据一致性保障
- 性能依赖于数据库配置
- 需要维护数据库连接池
2 - 本地时间戳方式
- ID生成算法:基于本地服务器时间生成唯一ID
- 格式:
timestamp + 序列号
(如:1625097600000_001) - 特点:
- 实现简单,无需网络交互
- 依赖服务器时钟同步
- 在分布式环境下可能产生冲突
- 适合低并发单机应用
3 - ZK与本地配置的分布式ID生成器
- 架构组成:
- ZooKeeper集群维护全局配置
- 本地缓存worker节点信息
- 工作流程:
- 启动时向ZK注册worker节点
- 获取全局唯一worker ID
- 本地生成序列号
- 组合生成最终ID(workerID + sequence)
- 特点:
- 支持分布式环境
- 比纯ZK方案性能更高
- 需要维护ZK集群
- 故障转移较复杂
4 - ZooKeeper递增方式
- 实现原理:通过ZK的有序节点生成递增ID
- 生成过程:
- 创建持久化顺序节点
- 获取节点序号作为ID
- 定期清理历史节点
- 特点:
- 保证全局严格递增
- 依赖ZK集群可用性
- 网络开销较大
- 适合强一致性要求的场景
配置建议:根据系统规模、性能要求和部署环境选择合适的存储和ID生成方式。分布式环境推荐使用方式3或4,单机环境可考虑方式0或2。
本地文件
此方式Mycat将sequence配置到文件中,当使用到 sequence 中的配置后,Mycat会更新 classpath 中的 sequence_conf.properties 文件中的 sequence 当前的值。
#default global sequence
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000
# self define sequence
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000
ORDER.HISIDS=
ORDER.MINID=1001
ORDER.MAXID=2000
ORDER.CURID=1000
数据库方式
在数据库中建立一张表,存放 sequence 名称(name),sequence当前值(current_value),步长(increment)等信息。
CREATE TABLE MYCAT_SEQUENCE
(
name VARCHAR(64) NOT NULL,
current_value BIGINT(20) NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE = InnoDB;
本地时间戳方式
ID组成结构
ID采用64位二进制格式,由以下四个部分组成:
- 时间戳部分:42位,精确到毫秒级(可表示约139年的时间范围)
- 机器标识部分:5位,支持最多32台机器
- 业务编码部分:5位,支持32种业务类型
- 序列号部分:12位,每毫秒可生成4096个序列号(2^12)
实际使用时转换为18位的十进制long类型数值。
并发能力
- 每毫秒可以生成4096个不重复ID(12位二进制累加空间)
- 理论上单机每日可生成ID数量:1000ms × 60s × 60m × 24h × 4096 ≈ 354亿
Mycat配置
在Mycat中通过sequence_time_conf.properties
文件进行配置,主要参数包括:
WORKID=01 # 机器ID,范围0-31
DATACENTERID=01 # 数据中心ID,范围0-31
唯一性保证
-
通过WORKID和DATACENTERID的组合确保集群唯一性:
- 支持32个数据中心(DATACENTERID)
- 每个数据中心支持32台机器(WORKID)
- 总共支持32×32=1024种组合
-
当同一毫秒内序列号耗尽时,会等待至下一毫秒继续生成。
典型应用场景
- 分布式系统主键生成
- 订单编号生成
- 日志追踪ID
- 需要全局唯一且有序的业务场景
配置示例
# sequence_time_conf.properties
WORKID=05 # 当前节点标识
DATACENTERID=02 # 数据中心标识
ZK ID生成器
配置说明
-
ZK连接配置:
- 所有ZK连接信息统一配置在
myid.properties
文件的zkUrl
属性中 - 支持多ZK集群配置,格式为
host1:port1,host2:port2,...
- 所有ZK连接信息统一配置在
-
实例ID获取方式:
- 自动模式:通过ZK自动获取InstanceID(需在
sequence_distributed_conf.properties
中配置INSTANCEID = ZK
) - 手动模式:直接在配置文件中指定InstanceID
- 自动模式:通过ZK自动获取InstanceID(需在
性能指标
- 最大支持63位二进制ID生成
- 单机房单线程理论并发量:640,000/s(计算公式:1000*(2^6))
- 时间戳精度:毫秒级
ID结构设计
字段名 | 位数 | 说明 |
---|---|---|
current time milis | 38位 | 微秒级时间戳,可使用17年(从2020年算起至2037年) |
cluster id | 5位 | 标识机房或ZK集群,支持最大32个机房(2^5=32) |
InstanceId | 5位 | 实例标识,支持最大32个实例,可通过ZK自动获取或配置文件指定 |
threadId | 9位 | 线程标识,支持最大512个线程(2^9=512) |
increment | 6位 | 自增序列,每毫秒可生成64个不重复ID(2^6=64),结合线程ID实现高并发 |
典型应用场景
-
分布式订单系统:
- 多个机房同时生成订单号
- 保证跨机房的ID唯一性
- 示例:某电商平台日订单量百万级,使用该方案后ID冲突率为0
-
日志追踪系统:
- 为分布式请求生成唯一traceId
- 通过clusterId快速定位问题机房
-
数据库分片:
- 作为分片键使用
- 自带时间戳信息便于按时间范围查询
配置示例
# myid.properties
zkUrl=zk1.example.com:2181,zk2.example.com:2181# sequence_distributed_conf.properties
INSTANCEID=ZK
CLUSTER_ID=3 # 表示第3号机房
注意事项
- 时钟回拨处理:当检测到系统时钟回拨时,会自动等待直到时钟恢复正常
- 实例扩容:新增实例时会通过ZK自动分配未使用的InstanceID
- 性能优化:建议将时间戳部分缓存复用,减少系统调用开销
ZK递增方式
配置说明
ZK( ZooKeeper )的连接信息需要统一配置在 myid.properties
文件的 zkURL
属性中。这是实现分布式ID递增的基础配置。
序列配置
在 sequence_conf.properties
配置文件中,需要设置以下三个关键参数来实现分布式ID的区间分配:
-
TABLE.MINID
定义某线程当前可分配ID区间的最小值。例如设置为1000,表示该线程分配ID的起始值为1000。 -
TABLE.MAXID
定义某线程当前可分配ID区间的最大值。例如设置为1999,表示该线程分配ID的结束值为1999。
注意:MAXID必须大于MINID,区间大小决定了每次从ZK获取的ID段大小。 -
TABLE.CURID
记录某线程当前已分配到的ID值。系统会从这个值开始递增分配,直到达到MAXID时再向ZK申请新的ID区间。
例如当前值为1500,则下一个分配的ID将是1501。
工作流程
- 应用启动时读取
myid.properties
中的ZK连接信息 - 从
sequence_conf.properties
加载初始的ID区间配置 - 当本地ID区间( CURID达到MAXID )用完时:
- 通过ZK协调获取新的ID区间
- 更新MINID/MAXID/CURID的值
- 将新配置持久化到
sequence_conf.properties
示例配置
# myid.properties
zkURL=127.0.0.1:2181# sequence_conf.properties
TABLE.MINID=1000
TABLE.MAXID=1999
TABLE.CURID=1500
这种设计通过ZK保证了分布式环境下ID分配的唯一性,同时通过本地缓存区间提高了性能。