Mycat配置文件

Mycat配置文件

Mycat简介中有提到Mycat有三个重要的配置文件schema.xmlserver.xmlrule.xml ,还有一些其他的依赖配置文件,接下来就分别介绍一下

server.xml配置文件

定义Mycat用户以及系统相关变量,如用户名、密码、端口等

两个重要的标签为user标签和system标签

user标签

主要用于定义登录Mycat的用户和权限

<!-- 用户 name表示用户名-->
<user name="mycat" defaultAccount="true">

       <property name="password">123456</property>
          <!-- 该用户可以访问的schema -->
        <property name="schemas">TESTDB,db1,db2</property>
        <property name="defaultSchema">TESTDB</property>
  			<!-- 是否只读 -->
        <property name="readOnly">true</property>
  			<!-- benchmark用于现在整体连接数量,如果为0或不设置则表示不限制 -->
  			<property name="benchmark">1000</property>
  <!-- 是否使用密码加密功能,默认为0 
			加密命令为java -cp Mycat-server-1.6.7.4-release.jar org.opencloudb.util.DecryptUtil 0:user:password
  -->
  			<property name="usingDecrypt">1000</property>
                <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

                <!-- 表级 DML 权限设置 -->
                <!--
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>
                 -->
 </user>

system标签

配置的为系统配置

<system>
  <!-- 字符集,在index_to_charset.properties中配置特殊字符集,如utf8mb4,格式为ID=字符集  要保证和数据库配置的字符集一致 `show variables like 'collation_%';show variables like 'character_set_%'` -->
  <property name="charset">utf8</property> 
  <!-- 默认的sql解析器 -->
  <property name="defaultSqlParser">druidparser</property>
  <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="nonePasswordLogin">0</property> 
  <!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
	在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
	<property name="ignoreUnknownCommand">0</property>
	<property name="useHandshakeV10">1</property>
    <property name="removeGraveAccent">1</property>
  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useSqlStat">0</property>  
  <!-- 会在全局表中增加_MYCAT_OP_TIME字段来进行一致性检测 1为开启全局表一致性检测、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  
   <!-- SQL 执行超时,超过该时间,会直接关闭连接 单位:秒-->
		<property name="sqlExecuteTimeout">300</property> 
  <!-- 全局序列的类型  0.本地文件 1.数据库 2.时间戳序列 -->
		<property name="sequnceHandlerType">1</property>
		<!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
		INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
		-->
		<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
		<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
	<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
   <!--1为开启mysql压缩协议-->
      <!--  <property name="useCompression">1</property>-->
   <!--设置模拟的MySQL版本号-->
        <property name="fakeMySQLVersion">5.6.20</property>
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 指定系统可用线程数量 -->
	<property name="processors">1</property> 
  <!-- 每次分配给Socket Diect Buffer的字节数,默认4096,如果一次性获取的字节过多会导致Buffer不够用,此时会出现警告,可以适当调大该值 -->
  <property name="processorBufferChunk">4096</property> 
  <!-- 指定BufferPool的计算比例,计算逻辑为 processorBufferChunk*processors*1000-->
  <property name="processorBufferPool">4096000</property> 
  <!-- 用来控制ThreadLocalPool分配Pool的比例大小,默认100-->
  <property name="processorBufferLocalPercent">100</property> 
  <!-- 指定NIOProcessor上共享businessExecutor固定线程池的大小 -->
	<property name="processorExecutor">32</property> 
	 
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
		<property name="processorBufferPoolType">0</property>
		<!--默认是65535 64K 用于sql解析时最大文本长度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		
		<!-- Mycat的使用端口 -->
			<property name="serverPort">8066</property> 
  <!-- Mycat的管理端口 -->
			<property name="managerPort">9066</property> 
  <!-- 连接空闲时间的超时时间,超过将会回收,单位毫秒 -->
			<property name="idleTimeout">300000</property> 
  <!-- 服务监听的IP地址 -->
			<property name="bindIp">0.0.0.0</property>
			<!-- 5 * 60 * 1000L; 连接空闲检查 -->
			<property name="dataNodeIdleCheckPeriod">300000</property> 
			<property name="frontWriteQueueSize">4096</property> 
  	
		<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
		<property name="handleDistributedTransactions">0</property>
		
			<!-- 是否启用非堆内存处理跨分片结果集
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">0</property>

		<!--
			单位为m
		-->
        <property name="memoryPageSize">64k</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否采用zookeeper协调切换  -->
		<property name="useZKSwitch">false</property>

		<!-- XA Recovery Log日志路径 -->
		<!--<property name="XARecoveryLogBaseDir">./</property>-->

		<!-- XA Recovery Log日志名称 -->
		<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
		<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
		<property name="strictTxIsolation">false</property>
		
		<property name="useZKSwitch">true</property>
		<!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
		<property name="parallExecute">0</property>
  
  
	</system>

schema.xml配置文件

定义逻辑库,表、分片节点等内容

schema标签

定义逻辑库,可以有多个逻辑库

<!-- dataNode 用于绑定逻辑库到具体的数据库上
 checkSQLschema 设置为true时,mycat会自动去掉sql语句中对应的schema字符。如select * from TESTDB.order 会变为  select * from order
   sqlMaxLimit 对于执行的sql语句,如果没有limit的话,会自动加上limit  
 -->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
		<!-- auto sharding by id (long) -->
		<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
		<table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/> 
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
	</schema>
table标签

table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要在table标签中定义

<!-- name 定义逻辑表的名称
   dataNode 逻辑表所属的dataNode
   rule  规则的名字,是在rule.xml中定义的
	 ruleRequired  指定表是否绑定分片规则,如果为ture,但是没有配置分片规则,会报错
   primaryKey  主键
   type  逻辑表类型  global表示全局表,不指定的话为非全局表
	 autoIncrement  自增,mysql对于非自增的使用last_insert_id()只会返回0,只有设置了自增才会返回主键的值
   subTables  分表,使用subTables="t_order$1-2,t_order3"方式
	 needAddLimit  指定表是否需要自动加上limit
-->
<table name="t_order" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
childTable标签

用来配置ER分片的子表,通过标签上的属性与父表相连

<!-- 
   joinKey  插入子表时会使用这个值查找父表存储的数据节点
   parentKey  与父表建立关联关系的列名
-->
<childTable name-"order_detail" primaryKey="id" joinKey="order_id" parentKey="id">

dataNode标签

定义了Mycat中的数据节点,每一个dataNode标签就是一个独立的数据分片

<!-- dataHost 使用的是dataHost标签的name,定义该分片所属的数据库实例
	 database  定义该分片所属数据库实例上的具体的库
-->
<dataNode name="dn1" dataHost="host1" database="mybatis" />

如果对应的dataNode比较多的话,可以使用

<!-- 这里配置database="db$0-99" 表示的是mysql中的dn0~dn99的数据库 -->
<dataNode name="multipleDn" dataHost="host1" database="db$0-99" />
<dataNode name="multipleDn2" dataHost="host2" database="db$100-199" />

dataHost标签

定义了具体的数据库实例、读写分离以及心跳

<!-- maxCon 每个读写实例连接池的最大连接数
	   minCon  每个读写实例连接池的最小连接数,初始化连接池的大小
     balance是用来配置读写分离的
         0:不开启读写分离,所有的读请求都发送到当前可用的writeHost写主机上
         1:全部的readHost与writeHost(备主写)参与select语句的负载均衡,双主双从,且双主互为主备
         2:所有的读操作随机在writeHost和readHost上分发
         3:所有的读请求随机分发到readHost,writeHost不负担读压力

writeType 多主配置使用
  0:所有写操作都发送到第一个writeHost,第一个挂了切换到第二个writeHost,当第一个恢复过来也不会切换,切换记录在dnindex.properties中
	1:所有写操作都随机发送到配置的writeHost,1.5后废弃不推荐使用
dbType  指定连接的数据库类型,如mysql
dbDriver  连接数据库所使用的Driver,可选native和JDBC。native执行的是二进制的MySQL协议,可使用的有MySQL和MariaDB;其他类型数据库都需要使用JDBC驱动来支持
switchType 写主机切换方式
	1:默认值,自动切换
  -1:不自动切换
  2:基于Mysql主从同步的状态决定是否切换,`show slave status`
	3. 基于mysql galary cluster的切换机制,适用于集群  `show status like 'wsrep%'`
-->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<!-- 心跳检测 -->
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<!-- 写主机 
     url  如果dbDriver为native,形式为address:port;如果dbDriver为JDBC,则形式为jdbc:MySQL://localhost:3306
		weight  在readHost中作为度节点的权重
    usingDecrypt  是否加密
   -->
		<writeHost host="hostM1" url="localhost:3306" user="root"
				   password="123456">
		</writeHost>
  <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/>

		<!-- 读主机 -->
		<readHost host="hostS1" url="localhost:3307" user="root"
				   password="123456"></readHost>
		
	</dataHost>

sequence配置文件

Mycat使用sequence配置文件来实现全局的分布式sequence,根据不同的配置方式来使用不同的配置文件

在server.xml中配置的system标签中的sequnceHandlerType 0.本地文件 1.数据库 2.时间戳序列

详细的使用见分布式全局序列

本地文件方式

配置在sequence_conf.properties配置文件中,格式如下

#default global sequence
# HISIDS表示使用过的历史分段
GLOBAL.HISIDS=
# MINID表示最小ID
GLOBAL.MINID=10001
# MAXID表示最大ID
GLOBAL.MAXID=20000
# CURID表示当前ID
GLOBAL.CURID=10000

# self define sequence
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000

数据库方式

配置在sequence_db_conf.properties配置文件中,格式如下

#sequence stored in datanode
# 配置所在的dataNode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1

时间戳序列方式

配置在sequence_distributed_conf.properties配置文件中

#sequence depend on TIME
# 多个节点配置不同的WORKID、DATAACENTERID,这样使得生成的id不会重复
WORKID=01
DATAACENTERID=01

rule.xml配置文件

定义了拆分表的所有规则,包含了tableRule标签和function标签

tableRule标签

定义规则

<tableRule name="sharding-by-date">
		<rule>
      <!-- columns 指定对应的表用于分片的列名
      		 algorithm  对应function中指定的算法的名称
      -->
			<columns>createTime</columns>
			<algorithm>partbyday</algorithm>
		</rule>
	</tableRule>

function标签

定义规则使用的算法

<function name="partbyday"
			  class="io.mycat.route.function.PartitionByDate">
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sNaturalDay">0</property>
		<property name="sBeginDate">2014-01-01</property>
		<property name="sEndDate">2014-01-31</property>
		<property name="sPartionDay">10</property>
	</function>