这部分与schema.dtd和schema.xml相关。
schema.dtd定义解析规则, 仅与开发相关。如有疑问,请参看xml_dtd_intro。
schema.xml包含具体的数据主机配置,数据节点配置, 数据库配置。
- dataHost
配置名称 | 配置内容&示例 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 节点名称 | 否 | 必需项,无默认值 | dataHost的唯一标识,不允许重复 |
maxCon | 最大连接数,实际作用于每个子host | 否 | 必需项,无默认值 | host的连接总容量阈值 2.弹性伸缩时的最大边界 |
minCon | 空闲时保有最小连接数 | 否 | 必需项,无默认值 | 1.在服务的启动后会根据dataNodeIdleCheckPeriod的时间周期注册的定时任务中会根据这个配置的值来创建/销毁连接,如非有大量请求,是缓慢式增长到最小值的。当空闲连接大于这个值,那么就会删除,如果空闲连接小于这个值并小于maxCon,那么就会创建连接到补齐这个数。注意:当datahost对应的schma的个数大于等于minCon时,建立的默认个数为schema个数+1(用于空schema) |
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 | 子元素,心跳语句 | 否 | 必选项 | 1:会在服务启动时设置的心跳任务里面被使用到,用于进行mysql实例状态的判断 2:同时如果heartbeat满足以下两种情况show slave status如果Seconds_Behind_Master返回的状态有延迟,那么会被记入mysql实例的主从延迟中,影响读请求的路由分发,延迟超限只读主库show status like 'wsrep%'返回状态会根据galera集群的配置信息wsrep_cluster_status=Primary、wsrep_connected=ON、wsrep_ready=ON进行判断,如果状态不正确,心跳结果就视为失败 |
writeHost | 子元素,表示写节点,配置见下writeHost | 是 | 空 | 具体的物理节点配置 |
- 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>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>
- dataNode
配置名称 | 配置内容&示例 | 多节点 | 详细描述 |
---|---|---|---|
name | 数据节点名称,唯一 | 否 | 作为数据节点的标识以及键 |
database | dataNode对应的存在于mysql物理实例中的schema,可以配置多个使用,$-分割 | 否 | 所使用的详细数据库节点 |
dataHost | dataNode对应的数据库实例,可以配置多个使用,$-分割 | 否 | 用于关联对应的Host节点 |
例如:
<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的通配符展开个数必须等于dataHost通配符展开个数与database通配符展开个数之积。
- schema
配置名称 | 配置内容&示例 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | schema名称 | 否 | schema的唯一标识,不允许重复 | |
dataNode | 涉及的数据点 | 否 | 缺省无,最多一个 | 无配置则只加载xml中的table子节点,若配置后,在对应的实际schema下存在的,并且不在配置内的table被视为single node table加入到schema下 |
sqlMaxLimit | 最大返回结果集限制 | 否 | -1 | 在SQL执行之前会根据这个添加限制,如果SQL中已有限制则无效 |
table | 详见table配置选项 | 是 | 每个表格的详细配置信息 |
- table
配置名称 | 配置内容&示例 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 表格名称 | 否 | 必须项 | 表名,可以配置多个使用’,’分割 |
primaryKey | 表格主键 | 否 | 默认空 | 1.主键缓存时使用 2.需要主键是自增列时使用 |
autoIncrement | 主键是否自增 | 否 | false | 主键是否是自增列,注意某些方式需要主键数据类型为bigint |
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中的拆分规则 |
ruleRequired | 是否有绑定具体的rule | 否 | 默认false | 如果是false不需要进行存在规则检查,global表可为false |
childTable | 关联子表信息,详见childTable选项 | 是 | 空 | 路由是通过父子关系进行ER关联 |
- childTable
配置名称 | 配置内容&示例 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 表格名称 | 否 | 必需项 | 表名,可以配置多个使用’,’分割 |
primaryKey | 表格主键 | 否 | 默认空 | 1.主键缓存时使用 2.需要主键是自增列时使用 |
autoIncrement | 主键是否自增 | 否 | false | 主键是否是自增列 |
needAddLimit | 是否需要加返回结果集限制 | 否 | true | 与schemas 中的对应配置效果相同,但是覆盖schema中配置 |
joinKey | 指定同父表进行join操作时的join键 | 否 | 必需项 | 子表和父表关联的字段 |
parentKey | 指定进行join操作时父表中的join键 | 否 | 必需项 | 如果父表为非子表,在父表中该字段必须与其拆分规则/拆分键有对等关系。 |
childTable | 关联子表信息,详见childTable选项 | 是 | 空 | 路由是通过父子关系进行ER关联 |
举例:
<schema name="TESTDB" [sqlMaxLimit="100"] [dataNode="dn1"]>
<table name="payed" [primaryKey="id"] [autoIncrement="true"] [needAddLimit=“true”] [type=“global”] [rule="auto-sharding-long"] dataNode="dn1,dn2"/>
...
<table name="customer" [primaryKey="id"] [autoIncrement="true"] [needAddLimit=“true”] [type=“global”] [rule="auto-sharding-long"] dataNode="dn1,dn2">
<childTable name="orders" [primaryKey="id"] [autoIncrement="true"] [needAddLimit=“true”] joinKey="customer_id" parentKey="id">
<childTable ...>
...
<childTable .../>
...
...
</childTable>
</childTable>
...
</table>
...
</schema>
标签dataHost的属性dbDriver,dbTyp,writeType已废弃,出于兼容考虑,schema.dtd中仍存在。
标签schema的属性checkSQLschema已废弃,出于兼容考虑,schema.dtd中仍存在。
下面是一个schema.xml的完整例子:
<?xml version="1.0"?>
<!DOCTYPE dble:schema SYSTEM "schema.dtd">
<dble:schema xmlns:dble="http://dble.cloud/">
<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" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3,dn4"/>
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2"/>
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4" rule="sharding-by-mod"/>
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-mod">
<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
<childTable name="order_items" joinKey="order_id" parentKey="id"/>
</childTable>
<childTable name="customer_addr" primaryKey="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>