当前位置: 首页 > news >正文

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 服务器运行时的各项重要参数设置。

该配置文件主要包含以下几类关键配置:

  1. 系统参数配置

    • 指定 Mycat 服务端口(默认8066)
    • 设置管理端口(默认9066)
    • 配置字符集
    • 定义线程池大小
    • 设置连接超时时间
  2. 用户权限配置

    • 定义访问 Mycat 的用户名和密码
    • 设置用户权限(如只读、读写权限)
    • 配置用户可访问的 schema
  3. 防火墙配置

    • 设置 IP 白名单/黑名单
    • 配置 SQL 拦截规则
    • 定义 SQL 注入防护策略
  4. 性能调优参数

    • 缓冲区大小设置
    • 连接池配置
    • 事务处理参数

示例配置片段:

<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生成器

  • 架构组成
    1. ZooKeeper集群维护全局配置
    2. 本地缓存worker节点信息
  • 工作流程
    1. 启动时向ZK注册worker节点
    2. 获取全局唯一worker ID
    3. 本地生成序列号
    4. 组合生成最终ID(workerID + sequence)
  • 特点
    • 支持分布式环境
    • 比纯ZK方案性能更高
    • 需要维护ZK集群
    • 故障转移较复杂

4 - ZooKeeper递增方式

  • 实现原理:通过ZK的有序节点生成递增ID
  • 生成过程
    1. 创建持久化顺序节点
    2. 获取节点序号作为ID
    3. 定期清理历史节点
  • 特点
    • 保证全局严格递增
    • 依赖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位二进制格式,由以下四个部分组成:

  1. 时间戳部分:42位,精确到毫秒级(可表示约139年的时间范围)
  2. 机器标识部分:5位,支持最多32台机器
  3. 业务编码部分:5位,支持32种业务类型
  4. 序列号部分: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

唯一性保证

  1. 通过WORKID和DATACENTERID的组合确保集群唯一性:

    • 支持32个数据中心(DATACENTERID)
    • 每个数据中心支持32台机器(WORKID)
    • 总共支持32×32=1024种组合
  2. 当同一毫秒内序列号耗尽时,会等待至下一毫秒继续生成。

典型应用场景

  • 分布式系统主键生成
  • 订单编号生成
  • 日志追踪ID
  • 需要全局唯一且有序的业务场景

配置示例

# sequence_time_conf.properties
WORKID=05      # 当前节点标识
DATACENTERID=02 # 数据中心标识

ZK ID生成器

配置说明

  1. ZK连接配置

    • 所有ZK连接信息统一配置在myid.properties文件的zkUrl属性中
    • 支持多ZK集群配置,格式为host1:port1,host2:port2,...
  2. 实例ID获取方式

    • 自动模式:通过ZK自动获取InstanceID(需在sequence_distributed_conf.properties中配置INSTANCEID = ZK
    • 手动模式:直接在配置文件中指定InstanceID

性能指标

  • 最大支持63位二进制ID生成
  • 单机房单线程理论并发量:640,000/s(计算公式:1000*(2^6))
  • 时间戳精度:毫秒级

ID结构设计

字段名位数说明
current time milis38位微秒级时间戳,可使用17年(从2020年算起至2037年)
cluster id5位标识机房或ZK集群,支持最大32个机房(2^5=32)
InstanceId5位实例标识,支持最大32个实例,可通过ZK自动获取或配置文件指定
threadId9位线程标识,支持最大512个线程(2^9=512)
increment6位自增序列,每毫秒可生成64个不重复ID(2^6=64),结合线程ID实现高并发

典型应用场景

  1. 分布式订单系统

    • 多个机房同时生成订单号
    • 保证跨机房的ID唯一性
    • 示例:某电商平台日订单量百万级,使用该方案后ID冲突率为0
  2. 日志追踪系统

    • 为分布式请求生成唯一traceId
    • 通过clusterId快速定位问题机房
  3. 数据库分片

    • 作为分片键使用
    • 自带时间戳信息便于按时间范围查询

配置示例

# myid.properties
zkUrl=zk1.example.com:2181,zk2.example.com:2181# sequence_distributed_conf.properties
INSTANCEID=ZK
CLUSTER_ID=3  # 表示第3号机房

注意事项

  1. 时钟回拨处理:当检测到系统时钟回拨时,会自动等待直到时钟恢复正常
  2. 实例扩容:新增实例时会通过ZK自动分配未使用的InstanceID
  3. 性能优化:建议将时间戳部分缓存复用,减少系统调用开销

ZK递增方式

配置说明

ZK( ZooKeeper )的连接信息需要统一配置在 myid.properties 文件的 zkURL 属性中。这是实现分布式ID递增的基础配置。

序列配置

sequence_conf.properties 配置文件中,需要设置以下三个关键参数来实现分布式ID的区间分配:

  1. TABLE.MINID
    定义某线程当前可分配ID区间的最小值。例如设置为1000,表示该线程分配ID的起始值为1000。

  2. TABLE.MAXID
    定义某线程当前可分配ID区间的最大值。例如设置为1999,表示该线程分配ID的结束值为1999。
    注意:MAXID必须大于MINID,区间大小决定了每次从ZK获取的ID段大小。

  3. TABLE.CURID
    记录某线程当前已分配到的ID值。系统会从这个值开始递增分配,直到达到MAXID时再向ZK申请新的ID区间。
    例如当前值为1500,则下一个分配的ID将是1501。

工作流程

  1. 应用启动时读取myid.properties中的ZK连接信息
  2. sequence_conf.properties加载初始的ID区间配置
  3. 当本地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分配的唯一性,同时通过本地缓存区间提高了性能。

http://www.dtcms.com/a/392382.html

相关文章:

  • 业主信息查询功能测试指南
  • WinDivert学习文档之四-————卸载
  • 分布式链路追踪关键指标实战:精准定位服务调用 “慢节点” 全指南(二)
  • DuckDB客户端API之ADBC官方文档翻译
  • 区块链技术应用开发:智能合约进阶与多链生态落地实践
  • 分布式专题——13 RabbitMQ之高级功能
  • 神经风格迁移(Neural Style Transfer)
  • Chromium 138 编译指南 Ubuntu 篇:源码获取与版本管理(四)
  • R 语言入门实战|第九章 循环与模拟:用自动化任务解锁数据科学概率思维
  • [论文阅读] 人工智能 + 软件工程 | 4907个用户故事验证!SEEAgent:解决敏捷估计“黑箱+不协作”的终极方案
  • 鸿蒙Next ArkTS卡片开发指南:从入门到实战
  • 【绕过disable_function】
  • 使用云手机运行手游的注意事项有哪些?
  • 【数据结构】利用堆解决 TopK 问题
  • 2025陇剑杯现场检测
  • openharmony之充电空闲状态定制开发
  • 【开题答辩全过程】以 python的线上订餐系统为例,包含答辩的问题和答案
  • (附源码)基于Spring Boot的校园心理健康服务平台的设计与实现
  • 微信小程序开发教程(十八)
  • 寰宇光锥舟架构图
  • Spring Bean生命周期全面解析
  • [vibe code追踪] 侧边栏UI管理器 | showSidebarContent
  • 嵌入式ARM架构学习9——IIC
  • 多线程——线程安全的练习加感悟
  • 使用 TwelveLabs 的 Marengo 视频嵌入模型与 Amazon Bedrock 和 Elasticsearch
  • Windows 11 下 Notepad++ 等应用无法启动问题排查修复
  • 面向口齿不清者的语音识别新突破:用大模型拯救“听不懂”的声音
  • 服装企业优化信息化管理系统的最佳软件选择
  • 多阶段构建镜像
  • 推荐一个开源服务器一键自动重装系统脚本:reinstall