schema.xml

Posted liang545621

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了schema.xml相关的知识,希望对你有一定的参考价值。

1.2 schema.xml

1.2.1 相关文件

这部分与schema.dtd和schema.xml相关。

在2.18.12.0之后的版本中server.xml在文件头中添加了version属性,以供运维人员区分配置创建或修改的版本(xml配置version对照表)
verison字段不匹配时,启动和dryrun会给出NOTICE的提示,但不会影响功能

schema.dtd定义解析规则, 仅与开发相关。如有疑问,请参看xml_dtd_intro

schema.xml包含具体的数据主机配置,数据节点配置, 数据库配置。

1.2.2 dataHost配置

  • dataHost
配置名称配置内容&示例多节点可选项/默认值详细描述
name 节点名称 必需项,无默认值 dataHost的唯一标识,不允许重复
minCon 空闲时保有最小连接数 必需项,无默认值 1.在服务的启动后会根据dataNodeIdleCheckPeriod的时间周期注册的定时任务中会根据这个配置的值来创建/销毁连接,如非有大量请求,是缓慢式增长到最小值的。当空闲连接大于这个值,那么就会删除,如果空闲连接小于这个值并小于maxCon,那么就会创建连接到补齐这个数。注意:当datahost对应的schma的个数大于等于minCon时,建立的默认个数为schema个数+1(用于空schema)
maxCon 最大连接数,实际作用于每个子host 必需项,无默认值;当maxCon的数值低于修正后的minCon的值时,将maxCon修改成修正后的minCon,并且仅打印日志进行提示 host的连接总容量阈值 2.弹性伸缩时的最大边界
balance 读操作的负载均衡模式 必需项,无默认值,候选值0/1/2/3 在进行读负载均衡的时候会根据这个配置进行
0:不做均衡,直接分发到当前激活的writeHost,readhost将被忽略,不会尝试建立连接
1:在除当前激活writeHost之外随机选择read host或者standby write host
2:读操作在所有readHost和所有writeHost中均衡。
3:读操作在所有readHost中均衡,具体拓扑结构见负载均衡相关章节
switchType 写结点高可用切换类型 候选值-1、1、2、3;默认值为-1。 故障切换仅针对writeHost实例。 有4种类型可选:
switchType=-1:不自动切换
switchType=1:心跳发生异常时自动切换
switchType=2:基于mysql主从同步的状态决定是否切换,根据心跳延迟结果决定是否切换。需要心跳语句为show slave status。见heartbeat
switchType=3,基于 MySQL galary cluster 的切换机制,根据心跳延迟结果决定是否切换。需要心跳语句为show status like ‘wsrep%‘,见heartbeat
切换仅通过heartbeat对writeHost进行. 切换发生必须满足如下条件:
当前writeHost heartbeat异常。
有多个writeHost
switchtype不为类型-1。
slaveThreshold 指定主从延迟阀值 默认-1,表示无延迟 1:在进行读取负载均衡的时候会根据最近一次的心跳状态以及读库和主库的延迟进行判断,如果延迟超过slaveThreshold配置,则认为此节点不适合进行读取,依赖于心跳为show slave status
2:此配置会影响到进行读负载均衡的时候延迟检测的开启,如果slaveThreshold=-1那么读负载均衡选取的时候不会进行延迟检测
tempReadHostAvailable 写库宕机之后读库是否可以提供服务 默认0,否 对于读请求来说,如果在进入读负载均衡分配的时候发现写库挂掉,就会通过配置进行判断,如果配置为1那么就会在依然存在读库中实现请求下发,否则服务不可用
heartbeat 子元素,心跳语句 必选项 该配置会在服务启动时设置的心跳任务里面被使用到,用于进行mysql实例状态的判断.
该配置有以下几种建议值: 
1.普通心跳只是用于探活,建议使用select 1 
2.使用 select @@read_only 探测结点可用性以及可写性 
3.使用show slave status,可以探活,检查复制是否正常,以及延迟检测。如果Seconds_Behind_Master返回的状态有延迟,那么会被记入mysql实例的主从延迟中,影响读请求的路由分发,延迟超过指定限制读写分离会变为只读主库。 
4.使用show status like ‘wsrep%‘,返回状态会根据galera集群的配置信息wsrep_cluster_status=Primary、wsrep_connected=ON、wsrep_ready=ON进行判断,如果状态不正确,心跳结果就视为失败 
writeHost 子元素,表示写节点,配置见下writeHost 具体的物理节点配置
  • heartbeat
配置名称配置内容&示例多节点可选项/默认值详细描述
timeout heartbeat子元素,心跳超时阈值,单位:秒 默认0 心跳超时阈值。前置知识:dble会按照dataNodeHeartbeatPeriod的间隔向datasource发送心跳
心跳发起时候检会查上次心跳是否为不正常的心跳,如果上次心跳尚未返回,并且距离最近的正常心跳的时间大于timeout,则标记该结点不可达。 
例如:心跳周期(dataNodeHeartbeatPeriod)2秒,第一次心跳正常,2s后的第二次心跳未返回,4s后第三次心跳发起时候发现上次不正常,不会真的再次下发,而是会根据4s和timeout的大小来确定该节点是否真正超时(该节点使用时候才会真正用到) 如果未超时,则什么也不做,继续下一个周期。如果超时了,则尝试杀掉超时的连接,无论是否杀成功,都会在下一个周期换一个连接继续做心跳,极端情况下会消耗很多连接 
2. 心跳连续返回失败后,dble使用时,该结点时,会检查距离第一次失败的时间差,如果大于timeout,则报改结点不可达。
errorRetryCount heartbeat子元素,心跳失败后的尝试次数 默认0,表示不重试 心跳失败后,开始重试errorRetryCount次。
1.重试期间成功,则标记回OK。
(目的:防止网络抖动或者连接异常断开场景)
2.重试期间超时,按照超时逻辑处理。
  • writeHost
配置名称配置内容&示例多节点可选项/默认值详细描述
host 写节点名称 节点名称作为标识
url 写节点地址ip:port 被分成IP和PORT用于连接数据库
user 写节点用户 用于连接数据库
password 写节点用户密码 用于连接数据库
usingDecrypt 是否启用加密password 候选值0/1,默认值0 如果设置为1,password属性值应该为用工具encrypt.sh加密串 1:{host}:{user}:{password} 得到的串
weight 节点权重(负载均衡时候使用) 默认0 负载均衡过程中会查看所有节点的权重是否相等,如果不相等,那么就会根据权重来配置压力
readHost 子元素,对应读写分离读节点配置信息,详见readHost 用来关联读写节点关系
  • readHost
配置名称配置内容&示例多节点可选项/默认值详细描述
host 写节点名称 节点名称作为标识
url 写节点地址ip:port 被分成IP和PORT用于连接数据库
user 写节点用户 用于连接数据库
password 写节点用户密码 用于连接数据库
usingDecrypt 是否启用加密password 候选值0/1,默认值0 如果设置为1,password属性值应该为用工具encrypt.sh加密串 1:{host}:{user}:{password} 得到的串
weight 节点权重(负载均衡时候使用) 默认0 负载均衡过程中会查看所有节点的权重是否相等,如果不相等,那么就会根据权重来配置压力

举例如下:

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" switchType="1" slaveThreshold="100"  [tempReadHostAvailable=""]>
          <heartbeat errorRetryCount="3" timeout ="5" >select user()</heartbeat>
          <writeHost host="hostM1" url="192.168.2.177:3307" user="root" password="root" usingDecrypt=""/>
                   <readHost host="hosts1" url="192.168.2.177:3309" user="root" password="root" weight="" usingDecrypt=""/>
                    ...
         </writeHost>
        ...
</dataHost>

1.2.3 dataNode配置

  • dataNode
配置名称配置内容&示例多节点详细描述
name 数据节点名称,唯一,例如"dn,dn$0-5" 作为数据节点的标识以及键,节点个数的计算方法为:从值出发,以‘,’(逗号)分隔字符串,如果其中有连续几项拥有相同的字符串前缀X(不能为空)并且后续其他几位为连续的数字时(比如0到5),可以以"X$0-5"来省略表示,个数为:以逗号分隔的字符串个数加上包含$的连续个数。name的个数必须等于database与dataHost的个数之积。
database dataNode对应的存在于mysql物理实例中的schema,可以配置单个或多个使用,例如"db,db$0-5" 所使用的详细数据库节点,节点个数的计算方法为:从值出发,以‘,’(逗号)分隔字符串,如果其中有连续几项拥有相同的字符串前缀X(不能为空)并且后续其他几位为连续的数字时(比如0到5),可以以"X$0-5"来省略表示,个数为:以逗号分隔的字符串个数加上包含$的连续个数。
dataHost dataNode对应的数据库实例,可以配置单个或多个使用,例如"dh,dh$0-5" 用于关联对应的Host节点,节点个数的计算方法为:从值出发,以‘,’(逗号)分隔字符串,如果其中有连续几项拥有相同的字符串前缀X(不能为空)并且后续其他几位为连续的数字时(比如0到5),可以以"X$0-5"来省略表示,个数为:以逗号分隔的字符串个数加上包含$的连续个数。

例如:

<dataNode name="dn1" dataHost="localhost1" database="db1" />

name, datahost, database均可用如下格式在单个配置中配置多个节点: xxx$n0-n1, xxx, 这种格式的意义为:xxxn0,... , xxxnm, ... ,xxxn1, xxx, 其中

n0 < nm < n1。

例如: 配置

<dataNode name="dn1$0-19" dataHost="localhost1$0-9" database="db1$0-1" />

等同于:

<dataNode name="dn10" dataHost="localhost10" database="db10" />
<dataNode name="dn11" dataHost="localhost10" database="db11" />
<dataNode name="dn12" dataHost="localhost11" database="db10" />
<dataNode name="dn13" dataHost="localhost11" database="db11" />
   ...
<dataNode name="dn119" dataHost="localhost19" database="db11" />

注意:如果是使用通配符的配置,那么dataNode(name)的通配符展开个数必须等于dataHost通配符展开个数与database通配符展开个数之积,上例中,name的个数为20,dataHost的个数为10,database的个数为2; 又例如

<dataNode name="dn,dn1$0-19,dnx" dataHost="localhost,localhost1$0-9" database="db1$0-1" />

中,name的个数为22,dataHost的个数为11,database的个数为2。

注意:自版本2.19.07.0开始,若出现两个不同的dataNode拥有同样的database以及dataHost,在配置检查的时候会报错(包括从通配符批量生成的dataNode)

1.2.4 schema配置

  • schema
配置名称配置内容&示例多节点可选项/默认值详细描述
name schema名称   schema的唯一标识,不允许重复
dataNode 涉及的数据点 缺省无,最多一个 未配置则只加载xml中的table子节点;
若配置后:1.table子节点的配置会覆盖schema中的配置,2.物理schema下存在的,并且不在配置内的table被视为single node table
sqlMaxLimit 最大返回结果集限制 -1 当且仅当查询的SQL符合下列条件时,产生效果
1 整个查询属于单表查询,包括简单查询以及(order/group/聚合函数) 
2 表格对应的shema需要有对应的sqlMaxLimit配置
3 表格的needAddLimit配置选项不能为false
4 表格的查询过程中不含有缓存键(配置cacheKey)过滤条件
table 详见table配置选项   每个表格的详细配置信息
  • table
配置名称配置内容&示例多节点可选项/默认值详细描述
name 表格名称 必须项 表名,可以配置多个使用’,’分割
cacheKey 表格缓存唯一键 默认空 主键缓存时使用,请确保业务上的key值唯一性
incrementColumn 表格自增列 默认空 指定表格自增列,指定自增列的表格会有自增
needAddLimit 是否需要加返回结果集限制 true 与schemas 中的对应配置效果相同,但是覆盖schema中配置
type 表格类型 默认default global 标记表格是全局表还是拆分表
dataNode 表格涉及的数据节点 两种格式:
1.xxx$n0-n1
此种格式指定xxxn0, ..., xxxnm, ..., xxxn1作为该表的数据节点。
2.distribute(xxx$n0-n1)此种格式同样指定xxn0, ..., xxxnm, ..., xxxn1作为该表的数据节点, 但根据主机进行重排。
例如.,dn1关联host1,dn2关联host1,dn3关联host2,dn4关联host2,dn5关联host3,dn6关联host3,,
如果用格式1,dataNode=“dn1,dn2, dn3,dn4,dn5,dn6”,其结果为:dn1,dn2, dn3,dn4,dn5,dn6,
如果用格式2,dataNode=distribute(“dn1,dn2, dn3,dn4,dn5,dn6”),其结果为:dn1,dn3,dn5,dn2,dn4,dn6
rule 表格使用的分片规则 引用rule.xml中的拆分规则
globalCheck 是否启用全局表检查 false true启用检查,false不检查
globalCheckClass 全局表检查类 CHECKSUM 全局表检查自定义类名或者是缩写
dble自带CHECKSUM和COUNT两种默认实现
cron 全局表一致性检查周期 0 0 0 * * ? quartz定时任务时间设置
详见:http://www.quartz-scheduler.org/api/2.4.0-SNAPSHOT/org/quartz/CronScheduleBuilder.html
ruleRequired 是否有绑定具体的rule 默认false 如果是false不需要进行存在规则检查,global表可为false
childTable 关联子表信息,详见childTable选项 路由是通过父子关系进行ER关联
  • childTable
配置名称配置内容&示例多节点可选项/默认值详细描述
name 表格名称 必需项 表名,可以配置多个使用’,’分割
cacheKey 表格缓存唯一键 默认空 主键缓存时使用,请确保业务上的key值唯一性
incrementColumn 表格自增列 默认空 显式指定表格自增列
needAddLimit 是否需要加返回结果集限制 true 与schemas 中的对应配置效果相同,但是覆盖schema中配置
joinKey 指定同父表进行join操作时的join键 必需项 子表和父表关联的字段
parentKey 指定进行join操作时父表中的join键 必需项 如果父表为非子表,在父表中该字段必须与其拆分规则/拆分键有对等关系。
childTable 关联子表信息,详见childTable选项 路由是通过父子关系进行ER关联

举例:

<schema name="TESTDB" [sqlMaxLimit="100"]  [dataNode="dn1"]>
        <table name="payed" [cacheKey="id"] [autoIncrement="true"] [needAddLimit=“true”] [type="global"]  [rule="auto-sharding-long"] dataNode="dn1,dn2"/>
        ...
        <table name="customer" [cacheKey="id"] [incrementColumn="id"] [autoIncrement="true"] [needAddLimit="true"] [type="global"]  [rule="auto-sharding-long"] dataNode="dn1,dn2">
                <childTable name="orders"  [cacheKey="id"] [autoIncrement="true"] [needAddLimit="true"] joinKey="customer_id" parentKey="id">
                         <childTable ...>
                                     ...
                                                 <childTable .../>
                                                 ...
                                    ...
                        </childTable>
             </childTable>
                ...
        </table>
        ...
</schema>

1.2.5 注意事项

标签dataHost的属性dbDriver,dbTyp,writeType已废弃。
标签schema的属性checkSQLschema已废弃。
一个物理表不能配置给多个逻辑表使用,否则使用后结果不可知,比如#862

1.2.6 举例

下面是一个schema.xml的完整例子:

<?xml version="1.0"?>
<!DOCTYPE dble:schema SYSTEM "schema.dtd">
<dble:schema xmlns:dble="http://dble.cloud/" version="9.9.9.9">

    <schema name="TESTDB">
        <!-- auto sharding by id (long) -->
        <table name="travelrecord" dataNode="dn1,dn2" rule="sharding-by-hash2"/>

        <!-- global table is auto cloned to all defined data nodes ,so can join
            with any table whose sharding node is in the same data node -->
        <table name="company" cacheKey="ID" type="global" dataNode="dn1,dn2,dn3,dn4"/>
        <table name="goods" cacheKey="ID" type="global" dataNode="dn1,dn2"/>
        <!-- random sharding using mod sharind rule -->
        <table name="hotnews" cacheKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4" rule="sharding-by-mod"/>
        <table name="customer" cacheKey="ID" dataNode="dn1,dn2" rule="sharding-by-mod">
            <childTable name="orders" cacheKey="ID" joinKey="customer_id" parentKey="id">
                <childTable name="order_items" joinKey="order_id" parentKey="id"/>
            </childTable>
            <childTable name="customer_addr" cacheKey="ID" joinKey="customer_id" parentKey="id"/>
        </table>
    </schema>
    <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> -->
    <dataNode name="dn1" dataHost="localhost1" database="db1"/>
    <dataNode name="dn2" dataHost="localhost1" database="db2"/>
    <dataNode name="dn3" dataHost="localhost1" database="db3"/>
    <dataNode name="dn4" dataHost="localhost1" database="db4"/>
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
            <!-- can have multi read hosts -->
            <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx"/>
        </writeHost>
        <writeHost host="hostS1" url="localhost:3316" user="root" password="123456"/>
        <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>
</dble:schema>

1.2.7 MySQL用户权限说明

权限项目作用
SELECT 数据查询权限
INSERT 新增数据权限
UPDATE 更新数据权限
DELETE 删除数据权限
FILE load data等数据导出导入的权限
CREATE 建库(管理端),建表,建索引权限
DROP 删除表的权限
ALTER 变更表结构的权限
LOCK TABLES lock tables的权限
ALTER ROUTINE (hint)变更/删除存储过程的权限
CREATE ROUTINE (hint)创建存储过程的权限
EXECUTE (hint)执行存储过程的权限
INDEX 建立/删除索引权限
SUPER 用于KILL功能
SHOW DATABASES 部分GUI工具会使用INFORMATION_SCHEMA SCHEMATA表
PROCESS 用于管理端show processlist 功能
REPLICATION CLIENT 可能场景:
1.用于配置了主从关系的数据结点,使用了读写分离
2.使用show slave status作为心跳
3.需要使用show @@binlog_status功能
REFERENCES 外键约束(纯语法支持,无使用意义)

以上是关于schema.xml的主要内容,如果未能解决你的问题,请参考以下文章

schema.xml

Schema模式简介

schema.xml的配置

在我的 schema.xml 中包含视图

mycat schema.xml 详解

认识配置文件schema.xml(managed-schema)