Appearance
5 基础配置
5.1 server.xml
该配置文件主要提供LIBRA系统参数配置以及外部用户访问LIBRA需要的用户和权限等参数的配置。
系统参数如下表所示:
模块 | 配置名称 | 配置内容 | 默认值/单位 | 详细作用原理或应用 | 配置范围 | 范围 | 版本变更 |
---|---|---|---|---|---|---|---|
后端连接socket 配置 | backSocketSoRcvbuf | 后端套接字接收缓冲区大小 | 1024×1024×4 ,单位字节 | 在创建后端管道的时候作为buffer大小使用 | 正整数 | 实例 | - |
backSocketSoSndbuf | 后端套接字发送缓冲区大小 | 1024×1024 ,单位字节 | 在创建后端管道的时候作为buffer大小使用 | 正整数 | 实例 | - | |
backSocketNoDelay | 后端Nagle算法是否禁用 | 默认1/单位无 | 在创建后端管道的时候禁用延迟加载,会影响网络包的情况 | 1-是, 0-否 | 实例 | - | |
前端连接socket 配置 | frontSocketSoRcvbuf | 前端套接字接受缓冲区大小 | 10241X1024 ,单位字节 | 在读取网络传输信息的时候作为每次缓冲的大小使用 | 正整数 | 实例 | - |
frontSocketSoSndbuf | 前端套接字发送缓冲区大小 | 1024×1024×4 ,单位字节 | 在创建前端管道的时候作为buffer大小使用 | 正整数 | 实例 | - | |
frontSocketNoDelay | 前端Nagle算法是否禁用 | 默认1 | 在创建前端管道的时候禁用延迟加载 | 1-是,0-否 | 实例 | - | |
Session预留内存配置 | orderMemSize | session中的复杂查询order预留内存 | 默认4,单位M | 在session初始化的时候创建内存分配对象,在复杂查询order by的时候使用到 | 正整数 | 实例 | |
otherMemSize | session中的复杂查询其他预留内存 | 默认4,单位M | 在session初始化的时候创建内存分配对象,在复杂查询subQuery以及distinctd的时候使用 | 正整数 | 实例 | ||
joinMemSize | session中的复杂查询join预留内存 | 默认4,单位M | 在session初始化的时候创建内存分配对象,在复杂查询join使用到 | 正整数 | 实例 | ||
堆外内存管理 | bufferPoolChunkSize | 内存池中分配的最小粒度 | 默认4096 ,单位字节 | 内存池中分配的最小粒度,需要的大小除以此粒度,向上取整 | 实例 | ||
bufferPoolPageNumber | 预分配内存池页数量 | 默认20× java虚拟机核数 | 在初始化的时候通过和bufferPoolPageSize的相乘确定缓冲池最后的大小,内存配置 | 实例 | - | ||
bufferPoolPageSize | 预分配内存池页大小 | 默认512×1024×4 ,单位字节 | 在初始化的时候通过和bufferPoolPageNumbe的相乘确定缓冲池最后的大小, 注意:虚拟机参数MaxDirectMemorySiz需要大于bufferPoolPageNumber * bufferPoolPageSize,否则会触发OOM | 实例 | - | ||
mappedFileSize | 文件映射区单个文件最大体积 | 默认1024×1024×64 ,单位字节 | 在初始化的时候此参数确定文件映射区最大容量,参见内存管理章节 | 实例 | |||
系统服务基本参数 | bindIp | 服务IP | 默认 "0.0.0.0" | 在服务初始化的时候作为侦听的IP | 有效IP地址, 推荐默认 | 实例 | |
serverPort | 服务端口 | 默认8066 | 在服务初始化的时候作为服务侦听的端口 | 机器空闲端口 | 实例 | - | |
managerPort | 控制端口 | 默认9066 | 在服务初始化的时候作为控制侦听的 | 机器空闲端口 | 实例 | - | |
maxCon | 控制最大连接数 | 默认1024 | 大于此连接数之后,建立连接会失败.注意当各个用户的maxcon总和值大于此值时,以当前值为准 | 正整数 | 实例 | ||
processors | NIO前端处理器的数量 | 默认java虚拟机核数 ,单位个 | 进行前端网络IO吞吐的线程数 | 正整数 | 实例 | - | |
backendProcessors | NIO后端处理器的数量 | 默认java虚拟机核数 ,单位个 | 进行后端网络IO吞吐的线程数 | 正整数 | 实例 | ||
processorExecutor | 前端业务处理线程池数量 | 默认 (单核为2,否则等于宿主机核数) | 进行前端具体业务处理的线程池大小,负责解析路由下发 | 正整数 | 实例 | - | |
backendProcessorExecutor | 后端业务处理线程池数量 | 默认 (单核为2,否则等于宿主机核数) | 进行后端具体业务处理的线程池大小,负责回收结果集并合并 | 正整数 | 实例 | ||
complexExecutor | 复杂查询后端业务线程池数量 | 默认 (单核为2,否则等于宿主机核数,宿主机核数大于8时,数量为8 | 负责复杂查询或者子命令结果集的回收 | 正整数 | 实例 | ||
sequnceHandlerType | 全局序列(主键)处理器的方式 | 默认normal ,单位无 | 在初始化的时候根据这个配置选择不同的序列生成器进行加载 mysqlTable,MySQL offset-step序列方式, sequence信息存储在数据库中 timer,时间戳方式(类Snowflake), 依赖sequence_time_conf.properties normal,基于数据库表的实现 db2Sequence,基于db2自身序列服务 oracleSequence,基于oracle自身序列服务 | mysqlTable,normal,oracleSequence,db2Sequence,timer | 全局 | - | |
serverNodeId | 服务编号 | 默认1 | 在分布式事务的时候构造 XATXID,同组中必须不同 其形式为$ServerName$.serverNodeId.xid | 正整数 | 实例 | - | |
serverBacklog | 前端tcp连接 backlog | 默认2048 | 前端tcp连接 backlog | 正整数 | 实例 | ||
showBinlogStatusTimeout | 拉取一致性binlog线的超时时间 | 默认60000 ,单位毫秒 | 拉取一致性binlog线的超时时间 | 正整数 | 全局 | ||
usePerformanceMode | 是否启用性能模式 | 默认0/单位无 | 开启之后LIBRA会大量占用CPU资源,并提供更高的性能体现,慎用 | 1-是0-否 | 实例 | ||
功能性配置 | useCompression | 是否启用数据压缩 | 默认 0否 | 使用mysql压缩协议 | 1 - 是 0 - 否 | 全局 | - |
useZKSwitch | 是否启用useZKSwitch转换 | 默认 true | 是否使用ZK记录节点切换的结果,当且仅当myid.properties中的ZK配置有效时才启用,会将本地文件状态下的dnindex.properties信息保存到ZK的对应路径中使用 | true 是 false否 | 全局 | - | |
连接缺省值 | charset | 字符集 | utf-8 | 应用于所有字符集相关的部分,包括前端连接和后端连接 | 有效字符集 | 全局 | - |
maxPacketSize | 包大小限制 | 默认 16×1024×1024 | 前后端管道建立的时候用作参数使用 | 正整数 | 全局 | - | |
txIsolation | 隔离级别 | 默认 3 | 执行具体SQL的时候会比较前后端连接, 如果不一致将会执行session级别的事务set | 1-READ_UNCOMMITTED 2-READ_COMMITTED 3-REPEATABLE_READ 4-SERIALIZABLE | 全局 | - | |
一致性检查 | checkTableConsistency | 表格一致性检查 | 默认0 | 如果值为1,那么在服务初始化的时候会启动一个定时任务,在 定时任务会检查DB是不是存在,表格是不是存在,表结构是否一致 | 1-是,0-否 | 实例 | - |
checkTableConsistencyPeriod | 表格一致性检查周期 | 默认30×60×1000 ,单位毫秒 | 表格一致性检查周期 | 正整数 | 实例 | - | |
useGlobleTableCheck | 全局表一致性检测是否开启 | 默认1开启 | 在服务初始化时候会根据这个开启全局表一致性检查globalTableConsistencyCheck,周期为 glableTableCheckPeriod 会去查看记录数量以及内部列是否一致 | 1 -开启 0- 不开启 | 全局 | - | |
glableTableCheckPeriod | 全局表一致性检查周期 | 默认24 * 60 * 60 * 1000 ,单位毫秒 | 上一个定时任务的周期 | 正整数 | 实例 | - | |
心跳任务周期 | dataNodeIdleCheckPeriod | 后端空闲连接心跳周期 | 默认5×60×1000 ,单位毫秒 | 后端空闲连接心跳检查,超时关闭,调整容量 | 正整数 | 实例 | - |
dataNodeHeartbeatPeriod | 数据节点心跳任务周期 | 10X1000 ,单位毫秒 | 根据这个周期在服务初始化的时候注册心跳任务 | 正整数 | 实例 | - | |
processor内部前后端连接检查 | sqlExecuteTimeout | 后端连接执行超时时间 | 默认 300 ,单位秒 | 如果超过这个时间没有完毕,就直接关闭连接 | 正整数 | 实例 | - |
idleTimeout | (前端)连接无响应超时时间 | 默认 30×60 × 1000 ,单位毫秒 | 在processor定时连接检查时,发现前端连接上一次的读写距今超过阀值,会直接关闭连接 | 正整数 | 实例 | - | |
processorCheckPeriod | processor定时任务检查周期 | 1000 ,单位毫秒 | 根据此配置定时的检查在processor中的前后端连接的状态 | 正整数 | 实例 | - | |
视图相关参数 | viewPersistenceConfBaseDir | 视图记录本地文件路径 | LIBRA目录/viewConf | 用于存放视图本地记录文件的文件路径 | 绝对路径 | 集群配置时无意义 | |
viewPersisten ceConfBaseName | 视图记录本地文件名 | viewJson | 视图记录的文件文件名 | 符合运行系统 文件的命名规范 | 集群配置时无意义 | ||
cluster相关参数 | clusterHeartbeatPass | - | |||||
clusterHeartbeatUser | - | ||||||
队列大小参数 | joinQueueSize | join时,左右结点的暂存数据行数的队列大小 | 1024 | 当行数大于此值而又没有及时被消费者消费掉,将会阻塞,目的是防止接收数据量太大,堆积在内存中 | 正整数 | 实例 | |
mergeQueueSize | merge时,左右结点的暂存数据行数的队列大小 | 1024 | 当行数大于此值而又没有及时被消费者消费掉,将会阻塞,目的是防止接收数据量太大,堆积在内存中 | 正整数 | 实例 | ||
orderByQueueSize | 排序时,时,左右结点的暂存数据行数的队列大小 不支持INSERT INTO ... SELECT ...FROM...的语法; | 1024 | 当行数大于此值而又没有及时被消费者消费掉,将会阻塞,目的是防止接收数据量太大,堆积在内存中 | 正整数 | 实例 | ||
useIndirectRouteSwitch | 间接路由启动开关 | true/false。默认false | false |
示例
xml
<!-- 系统参数定义,服务端口、管理端口,处理器个数、线程池等。 -->
<!--友情提示!!!不是必配项,各参数都有默认值,根据具体需求配置 -->
<system>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="initExecutor">16</property>
<property name="timerExecutor">4</property>
<property name="managerExecutor">4</property>
<property name="processors">4</property>
<property name="processorHandler">8</property>
<property name="processorExecutor">8</property>
<property name="clusterHeartbeatUser">_HEARTBEAT_USER_</property>
<property name="clusterHeartbeatPass">_HEARTBEAT_PASS_</property>
</system>
user - 管理用户
配置名称 配置内容 多节点 可选项/默认值 详细描述 name 用户名 否 符合mysql用户名规范 用户名唯一标识、用于登陆校验 manager 是否为manager用户 否 true-是false-否 默认否 是否是manager用户,若一个用户是manager用户,则只能执行管理端命令 password 密码 否 用户密码校验 benchmark 负载限制 否 用户的连接数限制,会在用户登陆时限制 usingDecrypt 是否启用加密 否 默认 0否 启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进⾏配置 举例: encrypt.sh 0:xxx:123456 fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ== 配置项: password fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ== user xxx 登录项: -u root -p123456 user - 业务用户配置
配置名称 配置内容 可选项/默认值 多节点 详细描述 name 用户名 符合mysql用户名规 否 用户名唯一标识、用于登陆校验 password 密码 用户密码 否 benchmark 负载限制 用户的连接数限制,会在用户验证登录的时候进行校验 否 readOnly 行户只读标志 在执行SQL的时候进行判断,如果是readonly不执行查询以外的SQL 否 schemas 用户对应使用schema.xml中的选项 用户权限的schemas 列表,通过,进行分割(db1,db2,db3) 否 usingDecrypt 是否启⽤加密 默认 0否 否 启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置 举例: encrypt.sh 0:xxx:123456 fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ== 配置项: password fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ== user xxx 登录项: -u root -p123456 privileges 权限 详情user.privileges 否 user.privileges – 用户权限
配置名称 配置内容 多节点 可选项/默认值 详细描述 check 是否需要检查 否 默认否 true-是 false-否 是否启用检查校验 schema 用户的schema节点权限情况 是 空 配置为空的情况下默认拥有所有有效schema的权限 user.privileges.schema 配置
配置名称 配置内容 多节点 可选项/默认值 详细描述 name schema名称 否 用以标识对应schema 实例 dml dml权限 否 0 权限判断, 每一位分别表示INSERT UPDATE SELECT DELETE四种权限 1- 拥有权限 0-没有权限 例如拥有所有权限为1111 table 是 如果没有配置, 则table继承schema的权限 user.privileges.schema.table
配置名称 配置内容 多节点 可选项/默认值 详细描述 name 表名称 否 在权限判断的时候作为key值 实例 dml dml权限 否 0 权限判断, 每一位分别表示INSERT UPDATE SELECT DELETE四种权限 1- 拥有权限 0-没有权限 例如拥有所有权限为1111
示例
<!--友情提示!!!用户访问定义,用户名、密码、schema等信息。 -->
<user name="root">
<property name="password">123456</property>
<!--友情提示!!!可以配置多个schema用‘,’分隔 -->
<property name="schemas">TESTDB</property>
<!--友情提示!!!不是必配项 根据具体需求配置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111">
<table name="acct" dml="0100"></table>
</schema>
</privileges>
</user>
fireWall – 配置
配置名称 是否可以配置多个 配置内容 可选项/默认值 详细描述 whitehost 否 白名单 白名单配置顶层标签 blacklist 否 黑名单 黑名单配置顶层标签
示例
xml
<!-- 友情提示!!! 防火墙不是必配项,根据需求自行决定是否需要配置 -->
<firewall>
<whitehost>
<!—友情提示!!!用户ip与用户名 ,支持通配符‘*’-->
<host host="192.167.172.12" user="TESTDB"></host>
<host host="192.167.172.*" user="TEST"></host>
</whitehost>
<!—友情提示!!!系统级别的SQL黑名单-->
<blacklist check="true">
<!—友情提示!!!具体参数可以参考下面说明-->
<property name="updateAllow">true</property>
</blacklist>
</firewall>
- SQL黑名单参数
配置名称 | 配置内容 | 默认值 | 可选项 | 详细作用原理 |
---|---|---|---|---|
selectHavingAlwayTrueCheck | 是否允许复杂select having 条件结果恒为真 | true | true - 允许false -禁止 | 1、having部分的结果为真 2、SQL语句需要以注释结尾(不能有换行之类的) 3、条件部分不是简单SQL(单个条件、含有简单数值对等或大小比较、直接是真假值的表达式等) 符合以上三个条件的查询在校验的时候会被阻止, 举例:select * from test having id = id and hujh = hujh /*lxxLIBRAsgdfsfdqwesfct*/; |
wayTrueCheck | 是否允许复杂select where 条件结果恒为真 | true | true - 允许 false -禁止 | 1、where部分的结果为真 2、SQL语句需要以注释结尾(不能有换行之类的) 3、条件部分不是简单SQL(单个条件、含有简单数值对等或大小比较、直接是真假值的表达式等) 符合以上三个条件的查询在校验的时候会被阻止, 举例:select * from test where id = id and hujh = hujh /*lxxLIBRAsgdfsfdqwesfct*/; |
doPrivilegedAllow | druid内部权限控制使用 | false | true - 允许 false -禁止 | druid内部函数调用flag,在dble中没有作用 |
wrapAllow | 是否允许调用 isWrapFor和unwrap方法 | true | true - 允许 false -禁止 | druid内部函数调用flag,在dble中没有作用 |
metadataAllow | 是否允许调用getmetadata方法 | true | true - 允许 false -禁止 | druid内部函数调用flag,在dble中没有作用 |
completeInsertValuesCheck | 在dble依赖的1.0.31版本中没有效果 | false | true - 允许 false -禁止 | druid内部函数调用flag,在dble中没有作用 |
mergeAllow | 是否允许merge语句 (在mysql中不支持) | true | true - 允许 false -禁止 | 会校验是否是merge语句 |
conditionLikeTrueAllow | 是否允许like之后包含永真条件 | true | true - 允许 false -禁止 | 会根据SQL里面的内容进行判断,如果发现有like '%'就会抛出异常 |
conditionDoubleConstAllow | 是否允许连续两个常量判断 | false | true - 允许 false -禁止 | 会根据SQL里面的内容进行判断,如果发现有两个常量判断抛出异常 select * from suntest asdf where 1 = 1 and 2 = 1; |
conditionAndAlwayFalseAllow | 是否允许and连接的语句存在 恒为false的条件 | false | true - 允许 false -禁止 | 会根据where之后and跟随的条件进行判断,如果发现恒为假的情况会抛出异常 举例:select * from suntest where id = 567 and 1 != 1; |
conditionAndAlwayTrueAllow | 是否允许and连接的语句存在 恒为true的条件 | false | true - 允许 false -禁止 | 会根据where之后and跟随的条件进行判断,如果发现恒为真的情况会抛出异常 举例:select * from suntest where id = 567 and 1 = 1; |
selectAllColumnAllow | 是否允许查询所有列 | true | true - 允许 false -禁止 | 会根据查询sql进行判断,如果发现直接查询*会有这个异常, 但是如果带有别名(x.*)则不在此列 |
multiStatementAllow | 是否允许一次提交多条sql | false | true - 允许 false -禁止 | 会检查sql的数量,如果超过一则抛出异常 |
constArithmeticAllow | 是否允许常量运算 | true | true - 允许 false -禁止 | 在SQL中如果发现包含有常量运算会抛出异常 select * from suntest asdf where id = 2 -1; |
alterTableAllow | 是否允许alter table 语句 | true | true - 允许 false -禁止 | 在执行alter table之前会纯粹根据SQL进行语句的校验 ,发现SQL是alter table语句会抛出异常返回错误信息 |
commitAllow | 是否允许commit语句 | true | true - 允许 false -禁止 | 在执行commit之前会纯粹根据SQL进行语句的校验, 发现commit语句会抛出异常返回错误信息 |
createTableAllow | 是否允许create table 语句 | ture | true - 允许 false -禁止 | 在执行create table之前会纯粹根据SQL进行语句的校验, 发现SQL是create table语句会抛出异常返回错误信息 |
deleteAllow | 是否允许delete语句 | true | true - 允许 false -禁止 | 在执行delete之前会纯粹根据SQL进行语句的校验,发现delete语句会抛出异常返回错误信息 |
dropTableAllow | 是否允许drop table 语句 | ture | true - 允许 false -禁止 | 在执行drop table之前会纯粹根据SQL进行语句的校验,发现SQL是drop table语句会抛出异常返回错误信息 |
insertAllow | 是否允许insert | true | true - 允许 false -禁止 | 在执行insert之前会纯粹根据SQL进行语句的校验,发现insert语句会抛出异常 返回错误信息 |
intersectAllow | 是否支持intersect | true | true - 允许 false -禁止 | 在执行intersect之前会纯粹根据SQL进行语句的校验,发现intersect语句会抛出异常返回错误信息 |
lockTableAllow | 是否允许lock tables语句 | true | true - 允许 false -禁止 | 在执行lock tables之前会纯粹根据SQL进行语句的校验,发现lock语句会抛出异常返回错误信息 |
minusAllow | 是否支持minus语句 | true | true - 允许 false -禁止 | 在执行minus之前会纯粹根据SQL进行语句的校验,发现minus语句会抛出异常返回错误信息 |
callAllow | 是否允许call语句 | true | true - 允许 false -禁止 | 在执行query之前会纯粹根据SQL进行语句的校验, 发现SQL是CALL语句会抛出异常返回错误信息 |
selectIntoOutfileAllow | 是否允许SELECT ... INTO OUTFILE | false | true - 允许 false -禁止 | 在执行query之前会纯粹根据SQL进行语句的校验,发现SQL是 SELECT ... INTO OUTFILE句会抛出异常返回错误信息 |
selectIntoAllow | 是否允许select into 语句 | true | true - 允许 false -禁止 | 在执行query之前会纯粹根据SQL进行语句的校验, 发现SQL是select into语句会抛出异常返回错误信息 |
selelctAllow | 是否允许select语句 | true | true - 允许 false -禁止 | 在执行query之前会纯粹根据SQL进行语句的校验, 发现SQL是select语句会抛出异常返回错误信息 |
renameTableAllow | 是否允许rename table 语句 | true | true - 允许 false -禁止 | 在执行rename table之前会纯粹根据SQL进行语句的校验,发现SQL是rename table语句会抛出异常返回错误信息 |
replaceAllow | 是否允许replace语句 | true | true - 允许 false -禁止 | 在执行replace之前会纯粹根据SQL进行语句的校验,发现replace语句会抛出异常返回错误信息 |
rollbackAllow | 是否允许rollback | true | true - 允许 false -禁止 | 在执行rollback之前会纯粹根据SQL进行语句的校验,发现rollback语句会抛出异常返回错误信息 |
setAllow | 是否允许set语句 | true | true - 允许 false -禁止 | 在执行set之前会纯粹根据SQL进行语句的校验,发现set语句会抛出异常返回错误信息 |
describeAllow | 是否支持describe语句 | true | true - 允许 false -禁止 | 在执行SQL之前会纯粹根据SQL进行语句的校验, 发现describe语句会抛出异常返回错误信息 |
limitZeroAllow | 是否允许出现limit 0的情况 | false | true - 允许 false -禁止 | 在执行SQL之前会纯粹根据SQL进行语句的校验, 发现limit 0语句会抛出异常返回错误信息 |
showAllow | 是否允许show语句 | true | true - 允许 false -禁止 | 在执行SQL之前会纯粹根据SQL进行语句的校验, 发现show语句会抛出异常返回错误信息 |
hintAllow | 是否允许sql 包含hint | true | true - 允许 false -禁止 | 在执行sql之前会纯粹根据SQL进行语句的校验 ,发现SQL是包含hint语句会抛出异常返回错误信息 |
commentAllow | 是否允许在SQL中存在注释 | true | true - 允许 false -禁止 | 在执行SQL之前会纯粹根据SQL进行语句的校验,发现注释语句会抛出异常 返回错误信息 |
mustParameterized | 是否必须参数化 | false | true - 是 false -否 | 在执行SQL之前会纯粹根据SQL进行语句的校验, 发现类似 name = 'sdfasdf' ,id = 1语句会抛出异常返回错误信息 |
conditionOpXorAllow | 是否允许SQL中使用关系符XOR | false | true - 允许 false -禁止 | 在执行SQL之前会纯粹根据SQL进行语句的校验, 发现类似运算符语句会抛出异常返回错误信息 |
conditionOpBitwseAllow | 查询条件中是否允许有"&"、 "~"、"|"、"^"运算符。 | true | true - 允许 false -禁止 | 在执行SQL之前会纯粹根据SQL进行语句的校验, 发现类似运算符语句会抛出异常返回错误信息 |
startTransactionAllow | 是否允许START TRANSACTION | true | true - 允许 false -禁止 | 在执行START TRANSACTION之前会纯粹根据SQL进行语句的校验, 发现START TRANSACTION语句会抛出异常返回错误信息 注:现阶段如果开启黑名单检查begin无法通过校验, 这个是由于在druid中不支持的缘故 |
truncateAllow | 是否允许truncate语句 | true | true - 允许 false -禁止 | 在执行truncate之前会纯粹根据SQL进行语句的校验, 发现truncate语句会抛出异常 返回错误信息 |
updateAllow | 是否允许update语句 | true | true - 允许 false -禁止 | 在执行update之前会纯粹根据SQL进行语句的校验,发现update语句会抛出异常 返回错误信息 |
useAllow | 是否允许use语句 | true | true - 允许 false -禁止 | 在执行use之前会纯粹根据SQL进行语句的校验,发现use语句会抛出异常 返回错误信息 |
blockAllow | 是否允许语句块 | true | true - 允许 false -禁止 | 在解析SQL阶段会判断SQL是否属于SQL语句块,如果是的话就会抛出错误 举例:BEGIN select * from suntest;END;// |
deleteWhereNoneCheck | 是否允许delete语句没有where条件 | false | true - 启用 false -不启用 | 如果发现delete语句没有限定条件会抛出异常 举例:delete from suntest; |
updateWhereNoneCheck | 是否允许update语句没有where条件 | false | true - 启用 false -不启用 | 如果发现update语句没有限定条件会抛出异常 举例:update suntest set name = '33'; |
deleteWhereAlwayTrueCheck | 是否允许delete语句存在恒真条件 | true | true - 启用 false -不启用 | 如果解析发现delete语句存在恒真条件,并且满足sql以注释结尾 ,并且where条件不是简单条件的,会抛出异常 举例:delete from suntest where id = id and name = name /*sdfaasdf*/; |
updateWhereAlayTrueCheck | 是否允许delete语句存在恒真条件 | true | true - 启用 false -不启用 | 如果解析发现delete语句存在恒真条件,并且满足sql以注释结尾 ,并且where条件不是简单条件的,会抛出异常 举例:update suntest set name = '33' where id = id,name = name /*sdfsdf*/; |
selectIntersectCheck | 是否进行intersect check | true | true - 进行 false -不进行 | 如果进行校验,则不允许except语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where name = 'ff' INTERSECT select * from dual; |
selectExceptCheck | 是否进行except check | true | true - 进行 false -不进行 | 如果进行校验,则不允许except语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where name = 'ff' except select * from dual; |
selectMinusCheck | 是否进行MINUS check | true | true - 进行 false -不进行 | 如果进行校验,则不允许MINUS语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where namec = 'fff' minus select * from dual; |
selectUnionCheck | 是否进行union check | true | true - 进行 false -不进行 | 如果进行校验,则不允许unoin语句 举例:select * from sbtest1 unoin select * from suntest; |
caseConditionConstAllow | 是否允许复杂查询中外部是一个常量 | false | true - 允许 false -禁止 | 是否允许复杂查询中外部是一个常量, 如果子查询外部对应的是常量那么就在SQL检查的时候抛出异常 举例:delete from suntest where id = 123 and 'name' = (select case 'fname' whe dsome' else 'good' end from xtest ) /*sdfaasdf*/; |
strictSyntaxCheck | 是否启用严格语法检查 | true | true - 是 false - 否 | 是否进行严格的语法检测,Druid SQL Parser在某些场景不 能覆盖所有的SQL语法,属于调试级别的参数,在正常的使用中不建议更改 |
schemaCheck | 检测是否使用了禁用的schema | true | true - 启用 false -禁止 | 这个需要配合drui的配置模式使用,在dble此功能无法被使用 |
tableCheck | 检测是否使用了禁用的table | true | true - 启用 false -禁止 | 这个需要配合drui的配置模式使用,在dble此功能无法被使用 |
functionCheck | 检测是否使用了禁用的function | true | true - 启用 false -禁止 | 这个需要配合drui的配置模式使用,在dble此功能无法被使用 |
objectCheck | 检测是否使用了禁用的object | true | true - 启用 false -禁止 | 这个需要配合drui的配置模式使用,在dble此功能无法被使用 |
variantCheck | 检测是否使用了禁用的变量 | true | true - 启用 false -禁止 | 这个需要配合drui的配置模式使用,在dble此功能无法被使用 |
5.2 rule.xml
这部分主要与rule.dtd和rule.xml相关,rule.dtd文件作用主要限制在rule.xml中可以配置的内容与不可以配置的内容,防止开发人员在配置rule.xml文件时出现错误配置项。rule.xml定义实际⽤到的分区算法的配置, 它包括如下两类信息
- 分区规则定义
分区规则定义如下形式:
tableRule:
配置名称 | 配置内容 | 可设多值 | 备注 |
---|---|---|---|
name | 规则名称 | 否 | tableRule属性,该规则名将被schema.xml中表配置引用,必须在整个文件中唯一 |
rule | 规则详细 | 否 | rule子结构 |
rule:
配置名称 | 配置内容 | 可设多值 | 默认值/可选项 |
---|---|---|---|
columns | 拆分列名 | 否 | |
algorithm | 执行function的名字 | 否 | 只能在function中声明过的算法 |
示例
xml
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
分区算法定义
分区算法定义有如下形式:
name: 定义分区算法名, 在分区规则定义中被引用。
class: 指定分区算法实现类。 每种分区算法要求的参数个数, 类型各不相同,
property name:部分用于指定相应分区算法的参数。 这部分请参考各分区算法描述。
function :
配置名称 | 配置内容 | 可设多值 | 说明 |
---|---|---|---|
name | 函数名称 | 否 | 在分区规则定义中引用 |
class | 拆分算法 | 否 | 选择实现的拆分算法 |
property | 算法属性 | 根据具体的function配置需要的参数 |
示例
xml
<function name="rang-long"
class="com.actiontech.dble.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
5.3 schema.xml
schema.xml包含具体的数据表配置, 序列配置,数据节点配置, 数据库配置。
5.3.1 dataHost配置
- dataHost
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 节点名称 | 否 | 必需项 | 唯一标识,不允许重复 |
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 | 该参数仅针对MySQL数据库;故障切换仅针对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 |
heartbreat | 子元素,心跳语句 | 否 | 必选项 | 用于检测各数据库是否连通的测试语句 |
witeHost | 子元素,表示写节点,配置见下writeHost | 是 | 空 | 具体的物理节点配置 |
- writeHost
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
host | 写节点名称 | 否 | 空 | |
url | 写节点地址 | 否 | 空 | |
user | 写节点用户 | 否 | 空 | |
password | 写节点用户密码 | 否 | 空 | |
usingDecrypt | 是否启用加密password | 否 | 候选值0/1,默认值0 | 如果设置为1,password属性值应该为用工具encrypt.sh加密串 1:{host}:{user}:{password} 得到的串 |
weight | 节点权重(负载均衡时候使用) | 否 | 默认0 | 负载均衡过程中会查看所有节点的权重是否相等,如果不相等,那么就会根据权重来配置压力 |
readHost | 子元素,对应读写分离读节点配置信息,详见readHost | 是 | 空 | 用来关联读写节点关系 |
- readHost
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
host | 读节点名称 | 否 | 空 | |
url | 读节点地址 | 否 | 空 | |
user | 读节点用户 | 否 | 空 | |
password | 读节点用户密码 | 否 | 空 | |
usingDecrypt | 是否启用加密password | 否 | 候选值0/1,默认值0 | 如果设置为1,password属性值应该为用工具encrypt.sh加密串 1:{host}:{user}:{password} 得到的串 |
weight | 节点权重(负载均衡时候使用) | 否 | 默认0 | 负载均衡过程中会查看所有节点的权重是否相等,如果不相等,那么就会根据权重来配置压力 |
示例
xml
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<readHost host="hostS2" url="192.168.1.111:3306" user="root" password="xxx"/>
</writeHost>
</dataHost>
</dble:schema>
5.3.2 dataNode配置
- dataNode
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 数据节点名称,唯一 | 否 | 作为数据节点的标识以及键 | |
database | dataNode对应的存在于mysql物理实例中的schema;oracle与db2对应的为用户 | 否 | 所使用的详细数据库节点 | |
datahost | 对应datahost中的名称,与之绑定 | 否 | 用于关联对应的Host节点 |
示例
xml
<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"/>
5.3.3 schema配置
5.3.3.1 schema配置
- schema
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | schema名称 | 否 | schema的唯一标识,不允许重复 | |
datanode | 涉及的数据点 | 否 | 缺省无,最多一个 | 无配置则只加载xml中的table子节点,若配置后,在对应的实际schema下存在的,并且不在配置内的table被视为single node table加入到schema下 |
sqlMaxLimit | 最大返回结果集限制 | 否 | -1 | 在SQL执行之前会根据这个添加限制,如果SQL中已有限制则无 |
table | 详见table配置选项 | 是 | 每个表格的详细配置信息 | |
dbType | 数据库类型 | 否 | mysql、db2、oracle | 必填项 |
5.3.3.2 table配置
- table
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 表名称 | 否 | 必须项 | |
primaryKey | 表主键 | 否 | 默认空 | 1.主键缓存时使用 2.需要主键是自增列时使用 |
autoIncrment | 主键是否自增 | 否 | false | 主键是否是自增列,注意某些方式需要主键数据类型为bigin |
type | 表类型 | 否 | 默认global | 标记表格是全局表还是拆分表 |
dataNode | 表涉及数据节点 | 否 | 空 | 上边配置的dataNode |
rule | 表使用分片规则 | 否 | 空 | 引用rule.xml中的拆分规则 |
ruleRequired | 是否需要绑定具体的rule | 否 | false | 如果是false不需要进行存在规则检查,global表可为false |
sequenceName | 与schema下配置的序列绑定 | 否 | 必填项 | 如果没有指定序列且使用自增序列,则使用默认的序列,默认的序列在server.xml配置,详情参考上边配置说明 |
childTable | 关联子表信息,详见childTable配置 | 是 | 空 | 路由是通过父子关系进行ER关联 |
indirectKeys | 间接关联字段 | 否 | 空 | 跟分片键一对一映射关系的字段(多个之间用“,"分隔),主要用于间接路由,提升查询效率。 |
subTable | 分表信息 | 具体分多少表,比如分10张表,示例subTable="0,9" |
序列配置示例
xml
<schema name="TESTDB" sqlMaxLimit="100">
<!--友情提示!!!sequenceName 必须是同一schema下定义的sequence -->
<table name="client" dataNode="dn1,dn2" primaryKey="id" rule="rule2" sequenceName="oracle"></table>
<!--友情提示!!!name符合命名规范即可,sequenceceHandlerType必须是如下几种类型 -->
<!-- mysqlTable : MySQL offset-step序列方式, sequence信息存储在数据库中 -->
<!-- normal: 基于数据表实现-->
<!-- timer: 时间戳方式-->
<!-- oracleSequence:基于oracle自身提供序列服务实现-->
<!-- db2Sequence: 基于db2自身提供的序列服务实现-->
<sequence name="oracle" sequenceHandlerType="oracleSequence"></sequence>
</schema>
5.3.3.3 childTable
- childTable
配置名称 | 配置内容 | 多节点 | 可选项/默认值 | 详细描述 |
---|---|---|---|---|
name | 表名称 | 否 | 必须项 | |
primaryKey | 表主键 | 否 | 默认空 | 1.主键缓存时使用 2.需要主键是自增列时使用 |
autoIncrment | 主键是否自增 | 否 | false | 主键是否是自增列,注意某些方式需要主键数据类型为bigin |
joinKey | 指定同父表进行join操作时的join键 | 否 | 必需项 | 子表和父表关联的字段 |
parentKey | 指定进行join操作时父表中的join键 | 否 | 必需项 | 如果父表为非子表,在父表中该字段必须与其拆分规则/拆分键有对等关系 |
sequenceName | 与schema下配置的序列绑定 | 否 | 必填项 | 如果没有指定序列且使用自增序列,则使用默认的序列,默认的序列在server.xml配置,详情参考上边配置说明 |
childTable | 关联子表信息,详见childTable选项 | 是 | 空 | 路由是通过父子关系进行ER关联 |
5.3.4 完整示例
xml
<schema name="TESTDB" dbType="mysql">
<table name="travelrecord" dataNode="dn1,dn2" rule="sharding-by-hash2"/>
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3,dn4"/>
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2"/>
<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" 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">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456"/>
</dataHost>