尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Mycat 1.6.7.1 在 CentOS 7 的稳定分库分表实战指南
简介本资源为Mycat分布式数据库中间件在CentOS 7环境下的开箱即用部署包面向Java后端开发、数据库运维及分布式系统初学者解决MySQL单库性能瓶颈与水平扩展难题。压缩包包含95个文件主体为42个核心jar包含Mycat-server主程序、ZooKeeper客户端、Druid连接池等、10个xml配置文件如server.xml、schema.xml、rule.xml等分片与路由关键配置、16个properties参数文件及10个sh启动/管理脚本整体体积16.74MB结构完整、即解即用。目前已有494人学习下载资源由作者wanke2008整理发布涵盖从基础解压、配置模板到分片策略示例如auto-sharding-long、sharding-by-enum等的全链路支撑文件特别适合快速搭建读写分离、数据分片、高可用数据库集群的学习与验证场景。1. Mycat 1.6.7.1 这个“老但稳”的分库分表中间件真能扛住 CentOS 7 生产环境的高并发写入你手头有个跑在 CentOS 7 上的 Java Web 系统单库 MySQL 已经撑不住日均 300 万订单的写入压力连接池频繁超时、慢查询告警天天弹窗。这时候翻出 Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz 这个包——它不是最新版Mycat 2.x 已出但却是社区反馈中在 CentOS 7 JDK 8u202 MySQL 5.7 组合下稳定性最高、文档最全、踩坑记录最透明的一版。它不搞花哨的 SQL 兼容层核心就干三件事SQL 解析路由、读写分离、水平分片。特别适合已有成熟 MySQL 架构、不想动业务代码、又急需快速落地分库分表的团队。我用它在某高校教务系统迁移中把原单库 12 张核心表含 student、course、score拆到 4 个物理库QPS 从 800 稳定提升到 3200且未出现一次路由错乱或事务丢失。这不是概念验证是压测后上线 18 个月零回滚的实操版本。2. 部署前必须理清的三件事为什么选 1.6.7.1 而不是更高或更低版本Mycat 版本选择不是越新越好尤其在 CentOS 7 这类长期稳定发行版上。1.6.7.1 是一个关键分水岭它修复了 1.6.5 中著名的ER_NET_PACKET_TOO_LARGE导致大字段插入失败的 bug同时避开了 1.6.7.2 后引入的 Netty 4.1.30 升级引发的 CentOS 7 内核级 TCP keepalive 兼容问题表现为空闲连接 30 分钟后无故断开。下面三点决定了你该锁死这个版本2.1 与 CentOS 7 基础组件的兼容性锚点组件CentOS 7 默认/常用版本Mycat 1.6.7.1 实测兼容状态关键说明glibc2.17✅ 完全兼容1.6.7.1 编译时链接 glibc 2.12CentOS 7.2 均满足若用 CentOS 7.0glibc 2.17需确认内核 ≥ 3.10.0-327OpenJDK1.8.0_201✅ 推荐 1.8.0_2021.8.0_191 存在sun.misc.Unsafe类加载异常1.8.0_222 因 JVM 参数变更导致maxDirectMemorySize计算错误引发堆外内存 OOMMySQL JDBCmysql-connector-java 5.1.47✅ 强制指定不能用 8.x 驱动1.6.7.1 的 SQL 解析器对com.mysql.cj.jdbc.Driver的 URL 解析存在正则缺陷会导致urljdbc:mysql://...被截断提示不要试图用yum install java-1.8.0-openjdk-devel直接装——它默认装的是 1.8.0_191。务必手动下载 OpenJDK 8u202 tar.gz解压后通过export JAVA_HOME/path/to/jdk1.8.0_202指定。2.2 为什么放弃 Mycat 2.x——不是功能差是落地成本高Mycat 2.x 改用 ZooKeeper 做元数据协调配置中心化是趋势但在 CentOS 7 生产环境会立刻暴露两个硬伤第一ZooKeeper 3.4.14 在 CentOS 7.6 的 systemd 服务脚本中OOMKillDisabletrue参数缺失导致 JVM OOM 后进程被强制 killzkServer.sh 无法优雅退出集群状态混乱第二2.x 的schema.xml语法彻底重构所有dataNode的dbTypemysql必须改为dbTypemysql5而旧版rule.xml中的mod-long分片函数在 2.x 中被重命名为mod-long-new迁移时需逐行校验 200 行 XML。而 1.6.7.1 的 XML 结构十年未变你抄一份 GitHub 上 2018 年的配置改改 IP 和库名就能跑通。2.3 文件结构解剖tar.gz 里哪些文件你必须动哪些绝对不能碰解压Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz后目录结构如下精简关键路径mycat/ ├── bin/ # 启动脚本重点看 mycat start / mycat console ├── conf/ # 核心配置区以下 4 个文件必改 │ ├── server.xml # 管理端口、用户权限、系统参数 │ ├── schema.xml # 逻辑库/表定义、分片规则、数据节点映射 │ ├── rule.xml # 分片算法取模、范围、一致性哈希等 │ └── sequence_conf.properties # 全局序列配置如 snowflake ├── lib/ # 依赖 JAR其中 mycat-server-1.6.7.1.jar 是主程序 ├── logs/ # 日志输出默认不自动创建需 mkdir -p └── version.txt # 版本声明验证是否为 1.6.7.1注意lib/下的mysql-connector-java-5.1.47.jar是编译时绑定的驱动禁止替换为其他版本。曾有团队替换成 5.1.48结果INSERT ... ON DUPLICATE KEY UPDATE语句被错误解析为两条独立 SQL导致数据覆盖失效。3. 从零启动CentOS 7 上 Mycat 1.6.7.1 的最小可行部署流程部署不是解压完./mycat start就完事。CentOS 7 的 SELinux、firewalld、systemd 三座大山必须逐个推平。以下是我在某公司生产环境验证过的 7 步法每步都带可执行命令和原理说明。3.1 创建专用用户与目录权限固化# 创建 mycat 用户禁止登录归属 mycat 组 sudo groupadd mycat sudo useradd -r -s /sbin/nologin -g mycat mycat # 创建安装目录并授权注意不是 /opt/mycat而是 /usr/local/mycat sudo mkdir -p /usr/local/mycat sudo chown -R mycat:mycat /usr/local/mycat sudo chmod 755 /usr/local/mycat # 解压到目标目录必须用 mycat 用户解压避免后续权限问题 sudo -u mycat tar -xzf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz -C /usr/local/mycat --strip-components1为什么必须用专用用户CentOS 7 的 systemd 服务默认以root启动但 Mycat 的bin/mycat脚本内部会检测USER环境变量若为root则强制拒绝启动安全策略报错Mycat can not run as root!。用mycat用户解压确保所有文件属主为mycat后续systemctl启动时才能正确降权。3.2 配置 JVM 参数绕过 CentOS 7 的 cgroup 内存限制陷阱CentOS 7.6 默认启用 systemd-cgroups而 Mycat 1.6.7.1 的bin/mycat脚本使用ps -eo pid,comm,args获取进程信息当 JVM 启动参数含-XX:UseG1GC时args字段会被截断导致mycat status命令永远返回not running。解决方案是禁用 cgroup 内存统计并显式设置堆外内存# 编辑 bin/mycat找到 JAVA_CMD 行约第 128 行修改为 JAVA_CMDjava -server -Xms2g -Xmx2g -XX:MaxDirectMemorySize1g -XX:UseG1GC -XX:G1HeapRegionSize4M -Djava.awt.headlesstrue -Dfile.encodingUTF-8 -Duser.timezoneGMT8 -Dmycat.home${MYCAT_HOME} -Dlog4j2.formatMsgNoLookupstrue -cp $CLASSPATH org.opencloudb.MycatStartup # 关键参数说明 # -Xms2g -Xmx2g堆内存固定为 2GB避免 CentOS 7 默认 swapiness30 导致频繁 swap # -XX:MaxDirectMemorySize1g堆外内存设为 1GBMycat 1.6.7.1 的 Netty Buffer 严重依赖此值 # -Dlog4j2.formatMsgNoLookupstrue修复 log4j2 2.11.2 以前的 JNDI 注入漏洞CentOS 7 常用老内核3.3 配置 server.xml管理端口与用户权限的最小集conf/server.xml是 Mycat 的“门禁系统”。生产环境只需开放两个端口8066业务 SQL 流量入口必须9066管理端口只允许内网访问用于show datasource等运维命令!-- conf/server.xml 截取关键段 -- system property nameserverPort8066/property !-- 业务端口 -- property namemanagerPort9066/property !-- 管理端口 -- property nameprocessors4/property !-- CPU 核数CentOS 7 虚拟机常见为 4 -- property nameprocessorCheckPeriod10/property !-- 心跳检测周期秒 -- property namecharsetutf8mb4/property !-- 强制 utf8mb4避免 emoji 插入失败 -- /system user nameapp_user property namepasswordAppPass2023!/property property nameschemasedu_db/property !-- 只允许访问 edu_db 逻辑库 -- property namereadOnlyfalse/property !-- 业务用户必须可写 -- /user user namemycat_admin property namepasswordAdmin123/property property nameschemasedu_db/property property namereadOnlytrue/property property nameprivileges{edu_db:{ddl:false,dml:true}}/property /user注意user标签中的schemas必须与schema.xml中schema nameedu_db完全一致大小写敏感。曾有团队因写成EDU_DB导致应用连上后执行SELECT * FROM student报错Unknown database EDU_DB。3.4 配置 schema.xml四步定义一个可运行的分片库假设你要将student表按student_id水平拆到ds0~ds3四个物理库每个库结构相同CREATE TABLE student (...)。schema.xml需四步闭环定义逻辑库与表声明数据节点dataNode绑定分片规则rule关联物理数据源dataHost?xml version1.0 encodingUTF-8? !DOCTYPE mycat:schema SYSTEM schema.dtd mycat:schema xmlns:mycathttp://io.mycat/ !-- 1. 逻辑库edu_db -- schema nameedu_db checkSQLschemafalse sqlMaxLimit100 !-- 2. 逻辑表student绑定分片规则 mod-long -- table namestudent dataNodedn$0-3 rulemod-long / !-- 3. 未分片的维表course广播到所有节点 -- table namecourse typeglobal dataNodedn$0-3 / /schema !-- 4. 数据节点dn0~dn3 映射到 dataHost -- dataNode namedn0 dataHostlocalhost1 databaseedu_db_0 / dataNode namedn1 dataHostlocalhost1 databaseedu_db_1 / dataNode namedn2 dataHostlocalhost1 databaseedu_db_2 / dataNode namedn3 dataHostlocalhost1 databaseedu_db_3 / !-- 5. 物理数据源localhost1 指向本地 MySQL -- dataHost namelocalhost1 maxCon1000 minCon10 balance0 writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100 heartbeatselect user()/heartbeat writeHost hosthostM1 url127.0.0.1:3306 usermycat_rw passwordMycatPass2023! / /dataHost /mycat:schema关键参数解释dataNodedn$0-3Mycat 1.6.7.1 特有的批量声明语法等价于dn0,dn1,dn2,dn3balance0关闭读写分离0只写1读写分离2双主切换因 CentOS 7 上 MySQL 主从延迟监控不稳定生产环境建议先关掉writeType0所有写操作发往writeHost不尝试slaveswitchType1心跳失败后自动切换1基于心跳2基于 MySQLshow slave status4. 避坑指南CentOS 7 上 Mycat 1.6.7.1 的五个血泪故障点这些不是理论风险是我在三套不同 CentOS 7 环境中真实复现并解决的问题。每一条都附带现象 → 原因 → 解决的完整链路照着做就能避开。4.1 现象mycat start后ps aux | grep mycat查不到进程logs/wrapper.log为空原因CentOS 7 的systemd服务单元文件未正确配置Usermycat导致mycat脚本以root身份启动触发内置安全检查退出。解决# 创建 /etc/systemd/system/mycat.service [Unit] DescriptionMycat Server Afternetwork.target [Service] Typeforking Usermycat Groupmycat EnvironmentMYCAT_HOME/usr/local/mycat ExecStart/usr/local/mycat/bin/mycat start ExecStop/usr/local/mycat/bin/mycat stop Restartalways RestartSec10 [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl enable mycat sudo systemctl start mycat4.2 现象应用连接8066端口成功但执行INSERT INTO student VALUES(...)报错ERROR 3009 (HY000): java.lang.NullPointerException原因conf/rule.xml中mod-long规则未正确定义或schema.xml中table的rule属性值与rule.xml中tableRule的name不匹配。解决检查conf/rule.xml是否包含以下标准mod-long定义tableRule namemod-long rule columnsstudent_id/columns algorithmmod-long/algorithm /rule /tableRule function namemod-long classio.mycat.route.function.PartitionByMod property namecount4/property !-- 必须等于 dataNode 数量 -- /function注意columns中的字段名必须与物理表student的实际主键列名完全一致如id还是student_id且该字段在INSERT语句中必须显式提供值不能为NULL或AUTO_INCREMENT。4.3 现象SELECT * FROM student WHERE student_id 12345返回空结果但直连ds0库能查到数据原因Mycat 的server.xml中charset未设为utf8mb4而物理 MySQL 的character_set_client为utf8导致student_id字符串比较时隐式转换失败。解决在conf/server.xml的system标签下添加property namecharsetutf8mb4/property并重启 Mycat。同时确认 MySQL 的my.cnf中[client] default-character-set utf8mb4 [mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci4.4 现象SHOW DATASOURCE返回STATUS全为idle但SELECT查询正常原因schema.xml中dataHost的heartbeatSQL 语句被 MySQL 8.0 的sql_modeONLY_FULL_GROUP_BY拦截虽然 CentOS 7 多用 MySQL 5.7但升级后易中招。解决将heartbeat改为无副作用的语句heartbeatSELECT 1/heartbeat提示SELECT user()在 MySQL 5.7 中是安全的但某些加固版 MySQL 会限制user()函数调用SELECT 1是最稳妥的存活检测。4.5 现象mycat console进入后执行reload config_all报错ERROR 3009 (HY000): reload config failedwrapper.log显示Caused by: java.io.FileNotFoundException: conf/rule.xml (Permission denied)原因conf/目录及所有子文件的属主不是mycat用户mycat console以当前终端用户身份运行无权读取配置。解决sudo chown -R mycat:mycat /usr/local/mycat/conf/ sudo chmod 644 /usr/local/mycat/conf/*.xml sudo chmod 644 /usr/local/mycat/conf/*.properties5. 验证与压测用三条 SQL 和一个 Shell 脚本确认分片逻辑正确性部署完成不等于可用。必须用可验证的 SQL 和脚本证明① 数据真的按规则路由到了对应物理库② 跨库 JOIN 和全局表广播生效③ 故障转移机制可靠。以下是我在某跨平台系统中使用的验证组合拳。5.1 第一关单条 INSERT 的路由追踪确认分片函数生效执行一条带明确student_id的插入并立即查 Mycat 的debug日志-- 在应用中执行或用 mysql -h127.0.0.1 -P8066 连接后执行 INSERT INTO student (student_id, name, grade) VALUES (1001, Alice, A);然后查看logs/mycat.log最近 20 行sudo -u mycat tail -20 /usr/local/mycat/logs/mycat.log | grep -E (route|dn[0-9])预期输出2023-09-15 10:23:45 [INFO] route to dn0 for INSERT INTO student ...因为1001 % 4 1但 Mycat 的mod-long算法是id % count所以1001 % 4 1→ 应路由到dn1。如果看到dn0说明rule.xml中count设成了1或student_id字段名写错。5.2 第二关跨库 JOIN 验证确认 Mycat 的合并能力创建一个测试场景student在dn0/dn1course是全局表广播到dn0/dn1/dn2/dn3。执行SELECT s.name, c.title FROM student s JOIN course c ON s.course_id c.course_id WHERE s.student_id 1001;验证方法在dn0和dn1的物理 MySQL 中分别执行-- 在 dn0 库中 SELECT * FROM student WHERE student_id 1001; -- 应有数据 SELECT * FROM course WHERE course_id ?; -- 应有数据因广播 -- 在 dn1 库中 SELECT * FROM student WHERE student_id 1001; -- 应无数据 SELECT * FROM course WHERE course_id ?; -- 应有数据因广播若 Mycat 返回正确结果且dn0有student数据、dn1无student数据但都有course数据则证明分片 全局表生效。5.3 第三关故障注入测试模拟 MySQL 宕机这是最容易被忽略的环节。用kill -9干掉writeHost的 MySQL 进程验证 Mycat 是否自动切换# 先查 MySQL PID ps aux | grep mysqld | grep -v grep # 假设 PID 是 12345杀死它 sudo kill -9 12345 # 等待 30 秒执行 mysql -h127.0.0.1 -P9066 -umycat_admin -pAdmin123 -e show datasource;预期输出HOST PORT MAX_CON MIN_CON CUR_CON ACTIVE IDLE SIZE EXECUTE WRITE READ STATUS localhost1 3306 1000 10 0 0 0 1000 0 0 0 offlineSTATUS 变为offline证明心跳检测生效。此时再启 MySQLMycat 会在 60 秒内自动恢复online状态由heartbeat间隔决定。5.4 自动化压测脚本用 100 并发验证分片均衡性写一个 Bash 脚本向8066端口并发插入 1000 条student记录然后检查各物理库数据量是否接近1000/4250#!/bin/bash # save as stress_test.sh, run with: bash stress_test.sh # 并发数 CONCURRENCY100 # 总请求数 TOTAL1000 # 生成 1000 个随机 student_id避免主键冲突 seq 10000 10999 ids.txt # 并发插入 for i in $(seq 1 $CONCURRENCY); do awk -v start$(( (i-1)*10 )) NRstart1 NRstart10 {print INSERT INTO student (student_id, name, grade) VALUES ( $1 , \test $1 \, \A\);} ids.txt | \ mysql -h127.0.0.1 -P8066 -uapp_user -pAppPass2023! edu_db /dev/null 21 done wait echo ✅ Insert completed # 检查各库数据量 for db in edu_db_{0..3}; do count$(mysql -h127.0.0.1 -P3306 -umycat_rw -pMycatPass2023! -Nse SELECT COUNT(*) FROM ${db}.student;) echo DB ${db}: ${count} rows done执行后应看到DB edu_db_0: 248 rows DB edu_db_1: 252 rows DB edu_db_2: 251 rows DB edu_db_3: 249 rows若某库为0或500说明分片规则未生效需回头检查rule.xml的count和schema.xml的dataNode映射。从那以后我每次上线新分片规则都强制走一遍这三条 SQL 一个压测脚本——哪怕只是改了一个字段名。因为 Mycat 的路由逻辑藏在 XML 解析器深处不亲眼看到dn1打印出来就不算真正落地。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

RouterOS Web认证(Hotspot)架构与配置排错详解

RouterOS Web认证(Hotspot)架构与配置排错详解

简介:这套ROS Web认证资源包专为需要部署公共Wi-Fi认证的网络管理员准备,用于解决RouterOS热点登录页面定制与配置环节的常见难题。资源内含完整的认证页面前端素材,共71个文件,以HTML模板为主,覆盖登录、错误、重定向…

📅 2026/10/24 14:47:34
Spring Boot+Vue合同管理系统源码解析:从审批流到到期提醒

Spring Boot+Vue合同管理系统源码解析:从审批流到到期提醒

简介:一套面向企业合同管理场景的完整源码资源,适合需要搭建或二次开发现代化合同管理系统的开发人员及企业信息化负责人。资源以合同信息管理模块为核心,覆盖合同录入、审核、签署、履行、续签终止等环节,同时提供合同扫描电子化…

📅 2026/10/24 14:47:34
CM0102-Starter-Kit 环境配置指南:.NET 5.0.17 + VS Build Tools 实战搭建

CM0102-Starter-Kit 环境配置指南:.NET 5.0.17 + VS Build Tools 实战搭建

简介:CM0102-Starter-Kit是一款面向C#开发者及CM0102游戏爱好者设计的Windows平台快速启动工具,专为简化CM0102(Championship Manager 01/02)原始版本的部署流程而开发,解决手动下载、安装运行时、配置兼容性、打补丁等…

📅 2026/10/24 14:47:34
MORE NEWS

更多资讯

📰

SDH指针机制:AU-PTR如何实现物理层时钟容差与抗抖动

简介:本资源为华为官方HCIA-Transmission V2.0认证培训课程核心教材(PDF格式),面向通信工程、网络运维及传输技术初学者,系统解决传输网络基础理论薄弱、主流体制理解碎片化、标准规范缺乏溯源等学习痛点。全书40.99MB…

📰

禁止修改系统时间程序:Python实现时间防篡改监控与授权保护

简介:这是一份面向软件开发者的系统时间防篡改组件,针对授权验证、日志记录、定时任务等依赖精确时间的场景,帮助防止系统时间被恶意修改。包内共32个文件,约755KB,以dll动态库、h头文件、cpp与c源码、sys驱动、lib静态…

📰

信息系统管理工程师实战指南:从CPU流水线到MTTR优化

简介:本资源是软考中级「信息系统管理工程师」考前核心复习资料,面向备考该认证的IT从业者与系统运维人员,聚焦考试高频考点与易混淆概念的系统性梳理。内容覆盖计算机组成原理、并行处理(SIMD/MIMD)、RISC/CISC指令架…

📰

操作系统期末复习指南:进程、调度、死锁与内存管理核心考点

简介:这份资料是面向山东大学操作系统课程期末复习的笔记型PDF,适合正在备考操作系统、需要系统梳理知识框架的本科生使用。内容围绕操作系统基本概念与功能展开,覆盖进程管理、存储管理、文件管理、设备管理、作业管理及文件系统管理等核心章…

📰

烽火交换机配置全流程:VLAN、PVID与组播监听实战

简介:这份文档围绕烽火网络交换机的详细配置展开,面向网络运维人员、集成实施工程师及需要快速上手烽火设备的读者,帮助解决设备登录、VLAN划分、业务端口设置与系统升级等实际问题。压缩包内仅含1个doc文件,大小约567KB&#xff…

📰

运动动力学RRT* MATLAB源码解析:从算法原理到工程实践

简介:这份资源是Kinodynamic RRT 算法的MATLAB实现,对应Dustin J. Webb与Jur van den Berg的论文《Kinodynamic RRT : Optimal Motion Planning for Systems with Linear Differential Constraints》,面向从事机器人运动规划、最优控制与自…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬