Skip to content

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预留内存配置orderMemSizesession中的复杂查询order预留内存默认4,单位M在session初始化的时候创建内存分配对象,在复杂查询order by的时候使用到正整数实例
otherMemSizesession中的复杂查询其他预留内存默认4,单位M在session初始化的时候创建内存分配对象,在复杂查询subQuery以及distinctd的时候使用正整数实例
joinMemSizesession中的复杂查询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总和值大于此值时,以当前值为准正整数实例
processorsNIO前端处理器的数量默认java虚拟机核数 ,单位个进行前端网络IO吞吐的线程数正整数实例-
backendProcessorsNIO后端处理器的数量默认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级别的事务set1-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定时连接检查时,发现前端连接上一次的读写距今超过阀值,会直接关闭连接正整数实例-
processorCheckPeriodprocessor定时任务检查周期1000 ,单位毫秒根据此配置定时的检查在processor中的前后端连接的状态正整数实例-
视图相关参数viewPersistenceConfBaseDir视图记录本地文件路径LIBRA目录/viewConf用于存放视图本地记录文件的文件路径绝对路径集群配置时无意义
viewPersisten ceConfBaseName视图记录本地文件名viewJson视图记录的文件文件名符合运行系统 文件的命名规范集群配置时无意义
cluster相关参数clusterHeartbeatPass-
clusterHeartbeatUser-
队列大小参数joinQueueSizejoin时,左右结点的暂存数据行数的队列大小1024当行数大于此值而又没有及时被消费者消费掉,将会阻塞,目的是防止接收数据量太大,堆积在内存中正整数实例
mergeQueueSizemerge时,左右结点的暂存数据行数的队列大小1024当行数大于此值而又没有及时被消费者消费掉,将会阻塞,目的是防止接收数据量太大,堆积在内存中正整数实例
orderByQueueSize排序时,时,左右结点的暂存数据行数的队列大小 不支持INSERT INTO ... SELECT ...FROM...的语法;1024当行数大于此值而又没有及时被消费者消费掉,将会阻塞,目的是防止接收数据量太大,堆积在内存中正整数实例
useIndirectRouteSwitch间接路由启动开关true/false。默认falsefalse

示例

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 配置

    配置名称配置内容多节点可选项/默认值详细描述
    nameschema名称用以标识对应schema实例
    dmldml权限0权限判断, 每一位分别表示INSERT UPDATE SELECT DELETE四种权限 1- 拥有权限 0-没有权限 例如拥有所有权限为1111
    table如果没有配置, 则table继承schema的权限
  • user.privileges.schema.table

    配置名称配置内容多节点可选项/默认值详细描述
    name表名称在权限判断的时候作为key值实例
    dmldml权限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 条件结果恒为真truetrue - 允许false -禁止1、having部分的结果为真 2、SQL语句需要以注释结尾(不能有换行之类的) 3、条件部分不是简单SQL(单个条件、含有简单数值对等或大小比较、直接是真假值的表达式等) 符合以上三个条件的查询在校验的时候会被阻止, 举例:select * from test having id = id and hujh = hujh   /*lxxLIBRAsgdfsfdqwesfct*/;
wayTrueCheck是否允许复杂select where 条件结果恒为真truetrue - 允许 false -禁止1、where部分的结果为真 2、SQL语句需要以注释结尾(不能有换行之类的) 3、条件部分不是简单SQL(单个条件、含有简单数值对等或大小比较、直接是真假值的表达式等) 符合以上三个条件的查询在校验的时候会被阻止, 举例:select * from test where id = id and hujh = hujh   /*lxxLIBRAsgdfsfdqwesfct*/;
doPrivilegedAllowdruid内部权限控制使用falsetrue - 允许 false -禁止druid内部函数调用flag,在dble中没有作用
wrapAllow是否允许调用 isWrapFor和unwrap方法truetrue - 允许 false -禁止druid内部函数调用flag,在dble中没有作用
metadataAllow是否允许调用getmetadata方法truetrue - 允许 false -禁止druid内部函数调用flag,在dble中没有作用
completeInsertValuesCheck在dble依赖的1.0.31版本中没有效果falsetrue - 允许 false -禁止druid内部函数调用flag,在dble中没有作用
mergeAllow是否允许merge语句 (在mysql中不支持)truetrue - 允许 false -禁止会校验是否是merge语句
conditionLikeTrueAllow是否允许like之后包含永真条件truetrue - 允许 false -禁止会根据SQL里面的内容进行判断,如果发现有like '%'就会抛出异常
conditionDoubleConstAllow是否允许连续两个常量判断falsetrue - 允许 false -禁止会根据SQL里面的内容进行判断,如果发现有两个常量判断抛出异常 select * from suntest asdf where 1 = 1 and 2 = 1;
conditionAndAlwayFalseAllow是否允许and连接的语句存在 恒为false的条件falsetrue - 允许 false -禁止会根据where之后and跟随的条件进行判断,如果发现恒为假的情况会抛出异常 举例:select * from suntest where id = 567 and 1 != 1;
conditionAndAlwayTrueAllow是否允许and连接的语句存在 恒为true的条件falsetrue - 允许 false -禁止会根据where之后and跟随的条件进行判断,如果发现恒为真的情况会抛出异常 举例:select * from suntest where id = 567 and 1 = 1;
selectAllColumnAllow是否允许查询所有列truetrue - 允许 false -禁止会根据查询sql进行判断,如果发现直接查询*会有这个异常, 但是如果带有别名(x.*)则不在此列
multiStatementAllow是否允许一次提交多条sqlfalsetrue - 允许 false -禁止会检查sql的数量,如果超过一则抛出异常
constArithmeticAllow是否允许常量运算truetrue - 允许 false -禁止在SQL中如果发现包含有常量运算会抛出异常 select * from suntest asdf where id = 2 -1;
alterTableAllow是否允许alter table 语句truetrue - 允许 false -禁止在执行alter table之前会纯粹根据SQL进行语句的校验 ,发现SQL是alter table语句会抛出异常返回错误信息
commitAllow是否允许commit语句truetrue - 允许 false -禁止在执行commit之前会纯粹根据SQL进行语句的校验, 发现commit语句会抛出异常返回错误信息
createTableAllow是否允许create table 语句turetrue - 允许 false -禁止在执行create table之前会纯粹根据SQL进行语句的校验, 发现SQL是create table语句会抛出异常返回错误信息
deleteAllow是否允许delete语句truetrue - 允许 false -禁止在执行delete之前会纯粹根据SQL进行语句的校验,发现delete语句会抛出异常返回错误信息
dropTableAllow是否允许drop table 语句turetrue - 允许 false -禁止在执行drop table之前会纯粹根据SQL进行语句的校验,发现SQL是drop table语句会抛出异常返回错误信息
insertAllow是否允许inserttruetrue - 允许 false -禁止在执行insert之前会纯粹根据SQL进行语句的校验,发现insert语句会抛出异常 返回错误信息
intersectAllow是否支持intersecttruetrue - 允许 false -禁止在执行intersect之前会纯粹根据SQL进行语句的校验,发现intersect语句会抛出异常返回错误信息
lockTableAllow是否允许lock tables语句truetrue - 允许 false -禁止在执行lock tables之前会纯粹根据SQL进行语句的校验,发现lock语句会抛出异常返回错误信息
minusAllow是否支持minus语句truetrue - 允许 false -禁止在执行minus之前会纯粹根据SQL进行语句的校验,发现minus语句会抛出异常返回错误信息
callAllow是否允许call语句truetrue - 允许 false -禁止在执行query之前会纯粹根据SQL进行语句的校验, 发现SQL是CALL语句会抛出异常返回错误信息
selectIntoOutfileAllow是否允许SELECT ... INTO OUTFILEfalsetrue - 允许 false -禁止在执行query之前会纯粹根据SQL进行语句的校验,发现SQL是 SELECT ... INTO OUTFILE句会抛出异常返回错误信息
selectIntoAllow是否允许select into 语句truetrue - 允许 false -禁止在执行query之前会纯粹根据SQL进行语句的校验, 发现SQL是select into语句会抛出异常返回错误信息
selelctAllow是否允许select语句truetrue - 允许 false -禁止在执行query之前会纯粹根据SQL进行语句的校验, 发现SQL是select语句会抛出异常返回错误信息
renameTableAllow是否允许rename table 语句truetrue - 允许 false -禁止在执行rename table之前会纯粹根据SQL进行语句的校验,发现SQL是rename table语句会抛出异常返回错误信息
replaceAllow是否允许replace语句truetrue - 允许 false -禁止在执行replace之前会纯粹根据SQL进行语句的校验,发现replace语句会抛出异常返回错误信息
rollbackAllow是否允许rollbacktruetrue - 允许 false -禁止在执行rollback之前会纯粹根据SQL进行语句的校验,发现rollback语句会抛出异常返回错误信息
setAllow是否允许set语句truetrue - 允许 false -禁止在执行set之前会纯粹根据SQL进行语句的校验,发现set语句会抛出异常返回错误信息
describeAllow是否支持describe语句truetrue - 允许 false -禁止在执行SQL之前会纯粹根据SQL进行语句的校验, 发现describe语句会抛出异常返回错误信息
limitZeroAllow是否允许出现limit 0的情况falsetrue - 允许 false -禁止在执行SQL之前会纯粹根据SQL进行语句的校验, 发现limit 0语句会抛出异常返回错误信息
showAllow是否允许show语句truetrue - 允许 false -禁止在执行SQL之前会纯粹根据SQL进行语句的校验, 发现show语句会抛出异常返回错误信息
hintAllow是否允许sql 包含hinttruetrue - 允许 false -禁止在执行sql之前会纯粹根据SQL进行语句的校验 ,发现SQL是包含hint语句会抛出异常返回错误信息
commentAllow是否允许在SQL中存在注释truetrue - 允许 false -禁止在执行SQL之前会纯粹根据SQL进行语句的校验,发现注释语句会抛出异常 返回错误信息
mustParameterized是否必须参数化falsetrue - 是 false -否在执行SQL之前会纯粹根据SQL进行语句的校验, 发现类似 name = 'sdfasdf' ,id = 1语句会抛出异常返回错误信息
conditionOpXorAllow是否允许SQL中使用关系符XORfalsetrue - 允许 false -禁止在执行SQL之前会纯粹根据SQL进行语句的校验, 发现类似运算符语句会抛出异常返回错误信息
conditionOpBitwseAllow查询条件中是否允许有"&"、 "~"、"|"、"^"运算符。truetrue - 允许 false -禁止在执行SQL之前会纯粹根据SQL进行语句的校验, 发现类似运算符语句会抛出异常返回错误信息
startTransactionAllow是否允许START TRANSACTIONtruetrue - 允许 false -禁止在执行START TRANSACTION之前会纯粹根据SQL进行语句的校验, 发现START TRANSACTION语句会抛出异常返回错误信息 注:现阶段如果开启黑名单检查begin无法通过校验, 这个是由于在druid中不支持的缘故
truncateAllow是否允许truncate语句truetrue - 允许 false -禁止在执行truncate之前会纯粹根据SQL进行语句的校验, 发现truncate语句会抛出异常 返回错误信息
updateAllow是否允许update语句truetrue - 允许 false -禁止在执行update之前会纯粹根据SQL进行语句的校验,发现update语句会抛出异常 返回错误信息
useAllow是否允许use语句truetrue - 允许 false -禁止在执行use之前会纯粹根据SQL进行语句的校验,发现use语句会抛出异常 返回错误信息
blockAllow是否允许语句块truetrue - 允许 false -禁止在解析SQL阶段会判断SQL是否属于SQL语句块,如果是的话就会抛出错误 举例:BEGIN  select * from suntest;END;//
deleteWhereNoneCheck是否允许delete语句没有where条件falsetrue - 启用 false -不启用如果发现delete语句没有限定条件会抛出异常 举例:delete from suntest;
updateWhereNoneCheck是否允许update语句没有where条件falsetrue - 启用 false -不启用如果发现update语句没有限定条件会抛出异常 举例:update suntest set name = '33';
deleteWhereAlwayTrueCheck是否允许delete语句存在恒真条件truetrue - 启用 false -不启用如果解析发现delete语句存在恒真条件,并且满足sql以注释结尾 ,并且where条件不是简单条件的,会抛出异常 举例:delete from suntest where id = id and name  = name /*sdfaasdf*/;
updateWhereAlayTrueCheck是否允许delete语句存在恒真条件truetrue - 启用 false -不启用如果解析发现delete语句存在恒真条件,并且满足sql以注释结尾 ,并且where条件不是简单条件的,会抛出异常 举例:update suntest set name = '33' where id = id,name = name /*sdfsdf*/;
selectIntersectCheck是否进行intersect checktruetrue - 进行 false -不进行如果进行校验,则不允许except语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where name = 'ff' INTERSECT  select * from dual;
selectExceptCheck是否进行except  checktruetrue - 进行 false -不进行如果进行校验,则不允许except语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where name = 'ff' except  select * from dual;
selectMinusCheck是否进行MINUS  checktruetrue - 进行 false -不进行如果进行校验,则不允许MINUS语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where namec = 'fff' minus select * from dual;
selectUnionCheck是否进行union checktruetrue - 进行 false -不进行如果进行校验,则不允许unoin语句 举例:select * from sbtest1 unoin select * from suntest;
caseConditionConstAllow是否允许复杂查询中外部是一个常量falsetrue - 允许 false -禁止是否允许复杂查询中外部是一个常量, 如果子查询外部对应的是常量那么就在SQL检查的时候抛出异常 举例:delete from suntest where id = 123 and 'name' = (select case 'fname' whe dsome' else 'good' end from xtest ) /*sdfaasdf*/;
strictSyntaxCheck是否启用严格语法检查truetrue - 是 false - 否是否进行严格的语法检测,Druid SQL Parser在某些场景不 能覆盖所有的SQL语法,属于调试级别的参数,在正常的使用中不建议更改
schemaCheck检测是否使用了禁用的schematruetrue - 启用 false -禁止这个需要配合drui的配置模式使用,在dble此功能无法被使用
tableCheck检测是否使用了禁用的tabletruetrue - 启用 false -禁止这个需要配合drui的配置模式使用,在dble此功能无法被使用
functionCheck检测是否使用了禁用的functiontruetrue - 启用 false -禁止这个需要配合drui的配置模式使用,在dble此功能无法被使用
objectCheck检测是否使用了禁用的objecttruetrue - 启用 false -禁止这个需要配合drui的配置模式使用,在dble此功能无法被使用
variantCheck检测是否使用了禁用的变量truetrue - 启用 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数据节点名称,唯一作为数据节点的标识以及键
databasedataNode对应的存在于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
配置名称配置内容多节点可选项/默认值详细描述
nameschema名称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是否需要绑定具体的rulefalse如果是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>