Java-131 深入浅出 MySQL MyCat 深入解析 schema.xml 配置详解:逻辑库、逻辑表、数据节点全攻略

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!"快的模型 + 深度思考模型 + 实时路由",持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年09月22日更新到:
Java-130 深入浅出 MySQL MyCat 深入解析 核心配置文件 server.xml 使用与优化

MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

schema.xml 配置

schema.xml 是 Mycat 分库分表中间件中的核心配置文件之一,主要负责定义和管理以下关键组件:

  1. 逻辑库(Schema)配置:
  • 定义虚拟数据库名称,与物理数据库解耦
  • 可配置多个逻辑库,每个对应不同业务模块
  • 示例:<schema name="ORDER_DB" checkSQLschema="true" sqlMaxLimit="100">
  1. 逻辑表(Table)配置:
  • 定义虚拟表结构,包括表名、主键等元数据
  • 支持分片表(分片规则)、全局表(所有节点冗余)、非分片表等类型
  • 示例:<table name="orders" primaryKey="id" dataNode="dn1,dn2" rule="mod-long" />
  1. 数据节点(DataNode)配置:
  • 映射逻辑表到物理数据库实例
  • 定义数据源名称和所属数据库
  • 示例:<dataNode name="dn1" dataHost="host1" database="order_db_01" />
  1. 数据主机(DataHost)配置:
  • 配置物理数据库服务器连接信息
  • 包含读写分离、心跳检测等高级功能
  • 示例:<dataHost name="host1" maxCon="1000" minCon="10" balance="1">

典型应用场景包括:

  • 电商系统订单表按月分片存储
  • 用户数据按ID哈希分片
  • 商品信息作为全局表同步到所有节点

配置注意事项:

  1. 需要与rule.xml配合使用定义分片规则
  2. 修改后需重启Mycat或执行reload命令生效
  3. 建议通过Mycat-web管理界面进行可视化配置
  4. 需要保持与真实数据库结构的同步更新

schema标签

Mycat 中的 schema 标签是配置文件中的核心元素,用于定义逻辑数据库(逻辑库)的结构和特性。在一个 Mycat 实例中可以配置多个逻辑库,每个逻辑库相当于一个独立的虚拟数据库,可以包含不同的表和数据节点配置。

schema 标签的主要属性包括:

  1. name:指定逻辑库的名称,客户端将使用这个名称进行连接
  2. checkSQLschema:布尔值,控制是否检查SQL中的schema名称
  3. sqlMaxLimit:设置默认的查询结果集最大行数限制
  4. dataNode:指定默认的数据节点

在实际应用中,schema 标签通常这样配置:

xml 复制代码
<!-- 订单业务逻辑库配置 -->
<schema name="edu_order" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
    <!-- 这里可以定义表的相关配置 -->
    <table name="orders" primaryKey="order_id" dataNode="dn1,dn2" rule="mod-long"/>
</schema>

<!-- 用户业务逻辑库配置 -->
<schema name="edu_user" checkSQLschema="false" sqlMaxLimit="500" dataNode="dn3">
    <table name="users" type="global" dataNode="dn3,dn4"/>
</schema>

典型应用场景包括:

  1. 多租户系统:为不同租户分配独立的逻辑库
  2. 业务隔离:将订单、用户等不同业务模块分离到不同逻辑库
  3. 读写分离:为同一业务配置主从逻辑库

注意:每个逻辑库必须至少包含一个有效的 dataNode 配置,否则无法正常工作。逻辑库名称应该保持唯一性,避免与物理数据库名称冲突。

table标签

table标签是Mycat分库分表配置中定义逻辑表的核心元素,所有需要水平拆分的表都必须通过该标签进行配置。该标签的主要属性包括:

  1. name属性:指定逻辑表的名称,对应应用程序中访问的表名
  2. dataNode属性:定义该表分布的数据节点,多个节点用逗号分隔
  3. rule属性:指定分片规则,对应rule.xml中定义的规则名称
  4. primaryKey属性:声明表的主键字段
  5. autoIncrement属性:设置是否自增主键

配置示例:

xml 复制代码
<table name="b_order" 
       dataNode="dn1,dn2" 
       rule="b_order_rule" 
       primaryKey="ID"
       autoIncrement="true"/>

典型应用场景:

  1. 电商系统中的订单表(b_order)按用户ID分片存储
  2. 日志表按时间范围分片存储
  3. 用户表按地域分片存储

注意事项:

  1. dataNode指定的节点必须在schema.xml中正确定义
  2. rule指定的分片规则必须在rule.xml中配置
  3. 对于自增主键表,建议配置全局序列号
  4. 分片字段应该选择查询频率高的字段

完整配置通常需要配合schema.xml和rule.xml文件共同完成分片逻辑的定义。

dataNode标签

dataNode标签是Mycat分片配置中的核心元素,用于定义数据分片节点。它建立逻辑分片与实际物理数据库实例之间的映射关系。

xml 复制代码
<!-- 数据节点配置示例 -->
<dataNode name="dn1" dataHost="edu_order_1" database="edu_order_1" />

详细参数说明:

  1. name属性:

    • 作用:定义数据节点的唯一标识名称
    • 要求:必须全局唯一,不能与其他dataNode重复
    • 使用场景:在table标签中通过该名称指定表的分片规则
    • 命名规范:建议采用"dn"+数字的格式,如dn1、dn2等,便于管理
  2. dataHost属性:

    • 作用:指定该分片节点所属的物理主机组
    • 要求:必须对应dataHost标签中已定义的name属性值
    • 示例:如果配置了<dataHost name="edu_order_1">,则dataNode可以引用该主机组
  3. database属性:

    • 作用:指定该分片节点对应的实际物理数据库名称
    • 要求:必须是目标数据库实例中真实存在的数据库
    • 注意事项:该属性值会作为实际SQL路由时的目标数据库名

典型应用场景:

  1. 水平分片场景:将user表分散到dn1、dn2、dn3三个节点
  2. 垂直分片场景:将order表放在dn1,payment表放在dn2

配置建议:

  • 建议为每个物理数据库实例创建单独的dataNode
  • 在分库分表场景中,通常需要配置多个dataNode
  • 可以通过schema.xml中的table标签将逻辑表映射到具体的dataNode

dataHost标签

dataHost 标签在 Mycat 逻辑库配置中作为最底层的核心标签,直接定义了实际的物理数据库实例连接信息及其运行策略。该标签通过详细的属性配置,实现了对后端数据库实例的精细化管理,主要包括以下关键方面:

  1. 基础连接配置

    • name:唯一标识数据主机的名称
    • dbType:指定数据库类型(如mysql/oracle等)
    • dbDriver:驱动类型(native/jdbc)
    • maxCon/minCon:连接池参数(最大100连接,最小10连接)
  2. 读写分离策略

    • balance属性支持多种模式:
      • 0:不开启读写分离
      • 1:随机读请求到所有writeHost/readHost
      • 2:读请求随机分配到writeHost对应readHost
      • 3:读请求随机分配到writeHost对应readHost且自动剔除故障节点
    • 示例中的balance="0"表示禁用读写分离
  3. 高可用配置

    • switchType:故障切换方式(1-自动切换,2-基于MySQL主从状态,3-基于手动切换)
    • slaveThreshold:从库延迟阈值(单位秒,超过则被剔除)
    • 心跳检测机制通过子标签heartbeat配置,如:<heartbeat>select user()</heartbeat>
  4. 实例定义

    通过嵌套的writeHostreadHost标签定义具体实例:

xml 复制代码
   <writeHost host="hostM1" url="192.168.0.1:3306" user="root" password="123456">
       <readHost host="hostS1" url="192.168.0.2:3306" user="root" password="123456"/>
   </writeHost>

典型应用场景包括:电商系统的订单库分片部署、金融系统的读写分离集群配置、物联网设备数据的高可用存储方案等。通过合理配置这些参数,可以实现数据库访问的负载均衡、故障自动转移等关键功能。

heartbeat标签

在数据库中间件配置中,heartbeat标签用于指定后端数据库连接的健康检查语句。不同的数据库类型需要配置对应的SQL语句来验证连接有效性:

MySQL数据库:

  • 推荐使用SELECT user()SELECT 1等简单查询语句

  • 执行这类语句不会产生锁表或性能开销

  • 示例:

    xml 复制代码
    <dataHost>
      <heartbeat>SELECT user()</heartbeat>
    </dataHost>

Oracle数据库:

  • 需要使用SELECT 1 FROM dual特殊语法

  • dual是Oracle的虚拟表,专门用于这类简单查询

  • 示例:

    xml 复制代码
    <dataHost>
      <heartbeat>SELECT 1 FROM dual</heartbeat>
    </dataHost>

其他常见数据库的心跳语句示例:

  • PostgreSQL: SELECT 1
  • SQL Server: SELECT 1
  • DB2: SELECT 1 FROM sysibm.sysdummy1
  • MariaDB: SELECT 1

配置注意事项:

  1. 心跳语句应该尽可能简单,避免复杂查询
  2. 不要使用会产生锁的语句(如SELECT FOR UPDATE)
  3. 语句执行时间应在毫秒级完成
  4. 心跳间隔通常配置为5-10秒
  5. 超时时间建议设置为心跳间隔的2-3倍

完整配置示例:

xml 复制代码
<dataHost name="mysql_host" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1">
    <heartbeat>SELECT user()</heartbeat>
    <writeHost host="master" url="192.168.1.100:3306" user="root" password="123456">
        <readHost host="slave" url="192.168.1.101:3306" user="root" password="123456"/>
    </writeHost>
</dataHost>

writeHost和readHost标签

在 Mycat 数据库中间件的配置中,writeHostreadHost 是用于定义后端数据库连接的重要标签,它们共同组成 dataHost 的数据源配置单元。这两个标签的主要区别在于:

  1. 功能分工

    • writeHost 专门用于指定可执行写操作(INSERT/UPDATE/DELETE)的主数据库实例
    • readHost 专门用于指定只读操作(SELECT)的从数据库实例
    • 一个典型的读写分离配置会包含1个writeHost和多个readHost
  2. 高可用机制

    • 当主writeHost宕机时,其绑定的所有readHost都会自动失效
    • Mycat会自动检测故障并通过switchType参数指定的策略切换到备用writeHost
    • 切换过程中会触发心跳检测机制(如示例中的select user()
  3. 配置细节

    • 每个writeHost需要定义完整的连接参数:
      • host:主机标识名
      • url:数据库连接地址和端口
      • user/password:认证信息
    • 可选参数包括:
      • maxCon/minCon:连接池大小限制
      • dbType:数据库类型(如MySQL)
      • dbDriver:驱动类型(native/jdbc)

示例配置展示了最简单的单节点配置,实际生产环境通常会包含更复杂的高可用方案:

xml 复制代码
<dataHost name="order_cluster" maxCon="200" minCon="20" balance="1"
          writeType="1" dbType="mysql" dbDriver="native" switchType="2"
          slaveThreshold="100">
    <heartbeat>select 1 from dual</heartbeat>
    
    <!-- 主写节点 -->
    <writeHost host="M1" url="192.168.1.111:3306" user="rw_user" password="securePwd123">
        <!-- 从读节点 -->
        <readHost host="S1" url="192.168.1.112:3306" user="ro_user" password="readonlyPwd"/>
        <readHost host="S2" url="192.168.1.113:3306" user="ro_user" password="readonlyPwd"/>
    </writeHost>
    
    <!-- 备用写节点 -->
    <writeHost host="M2" url="192.168.1.121:3306" user="rw_user" password="securePwd123">
        <readHost host="S3" url="192.168.1.122:3306" user="ro_user" password="readonlyPwd"/>
    </writeHost>
</dataHost>

在这个增强版配置中:

  • 设置了主备双写节点(M1/M2)和多个读节点(S1-S3)
  • 使用更安全的心跳检测语句select 1 from dual
  • 配置了更完善的连接池参数和负载均衡策略(balance="1")
  • 采用更可靠的切换机制(switchType="2")
相关推荐
yookay zhang3 小时前
达梦数据库安装过程报错解决
数据库
我就要用Cx3303 小时前
微服务配置管理
java·运维·微服务
Seven973 小时前
剑指offer-33、丑数
java
okra-3 小时前
文件测试测试用例
java·服务器·eclipse
努力也学不会java3 小时前
【Java并发】深入解析ConcurrentHashMap
java·juc·hash table
qq_316837753 小时前
spring cloud 同一服务多实例 websocket跨实例无法共享Session 的解决
java·websocket·spring cloud
草莓熊Lotso3 小时前
《算法闯关指南:优选算法--滑动窗口》--14找到字符串中所有字母异位词
java·linux·开发语言·c++·算法·java-ee
青云交3 小时前
Java 大视界 -- 基于 Java 的大数据实时流处理在金融高频交易数据分析中的应用
java·大数据·量化交易·异常检测·apache flink·实时流处理·金融高频交易
Lotus_滴滴3 小时前
【金融保研复习】知识点与可能的题目
数据库