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 | 外键约束(纯语法支持,无使用意义) |