首页 > mycat > MyCat配置信息详解
2019
05-14

MyCat配置信息详解

一,server.xml

    1,user标签 — 用户配置节点

<!-- 登陆用户名, 即MyCat连接用户名 -->
<user name="root">
    <!-- 登陆密码, 即MyCat连接密码 -->
	<property name="password">123456</property>
    <!-- 数据库名, 即MyCat的逻辑库, 此处会与schema.xml的配置存在关联 -->
	<property name="schemas">db_store,db_user</property>
	
	<!-- 表级 DML 权限设置, 对数据库权限进行精细化管理 -->
    <!-- check表示是否开启权限检查, 默认为false, 表示不检查 -->
	<privileges check="false">
        <!-- 一个schema表示对一个数据库的权限管理, dml顺序:Insert, Update, Select, Delete -->
		<schema name="db_user" dml="0110" >
            <!-- 一个table表示对某张表进行权限管理 -->
			<table name="users" dml="1111"></table>
			<table name="useraddres" dml="1110"></table>
		</schema>
	</privileges>
</user>

    2,system标签 — 系统配置节点

<system>
    <!-- 字符集 -->
    <property name="charset">utf8</property> 
    <!-- 是否开启实时统计 1:开启, 0:关闭-->
	<property name="useSqlStat">0</property>
	<!-- 是否开启全局表一致性检测。1为开启;0为关闭 -->
	<property name="useGlobleTableCheck">0</property>
	<!-- mycat 模拟的 mysql 版本号,默认值为 5.6 版本,如非特需,不要修改这个值,目前支持设置 5.5,5.6,5.7 版本,其他版本可能会有问题 -->
    <property name="fakeMySQLVersion">5.6.20</property>
    <!-- 每次读取流的数量, 默认为4096 -->
	<property name="processorBufferChunk">40960</property>
    <!-- 处理线程数量, 默认为cpu核数 -->
	<property name="processors">1</property> 
    <!-- 创建共享buffer需要占用的总空间大小 -->
    <!-- 值计算方式: processors * processorBufferChunk * 100-->
    <property name="processorBufferPool">4096000</property>
	<!-- 服务线程池大小 -->
	<property name="processorExecutor">32</property> 
    <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
	<property name="processorBufferPoolType">0</property>
    <!-- 二级共享buffer是processorBufferPool的百分比,这里设置的是百分比 -->
    <property name="processorBufferLocalPercent">100</property>
    <!-- 清理 NIOProcessor 上前后端空闲、超时和关闭连接的间隔时间。默认是 1 秒,单位毫秒 -->
    <property name="processorCheckPeriod">1000</property>
    <!--默认是65535 64K 用于sql解析时最大文本长度 -->
	<property name="maxStringLiteralLength">65535</property>
    <!-- 全局ID生成方式。(0:为本地文件方式,1:为数据库方式;2:为时间戳序列方式;3:为ZK生成ID;4:为ZK递增ID生成-->
	<property name="sequnceHandlerType">0</property>
    <!-- 是否开启mysql压缩协议。1为开启,0为关闭,默认关闭 -->
    <property name="useCompression">1</property>
    <!-- 指定 Mysql 协议中的报文头长度。默认 4 -->
    <property name="packetHeaderSize">4</property> 
    <!-- 指定 Mysql 协议可以携带的数据最大长度。默认 16M -->
    <property name="maxPacketSize">16M</property> 
	<property name="backSocketNoDelay">1</property>
	<property name="frontSocketNoDelay">1</property>
	<property name="processorExecutor">16</property>
    <!-- 指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认 30 分钟,单位毫秒 -->
	<property name="idleTimeout">1800000</property> 
    <!-- 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3 -->
    <!-- READ_UNCOMMITTED=1;READ_COMMITTED=2;REPEATED_READ=3;SERIALIZABLE=4; -->
    <property name="txIsolation">3</property>
    <!-- SQL 执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒 -->
    <property name="sqlExecuteTimeout">300</property>
	<!-- 对后端连接进行空闲、超时检查的时间间隔,默认是 300 秒,单位毫秒 -->
	<property name="dataNodeIdleCheckPeriod">300000</property>
	<!-- 对后端所有读、写库发起心跳的间隔时间,默认是 10 秒,单位毫秒 -->
	<property name="dataNodeHeartbeatPeriod">10000</property>
	<!-- mycat 服务监听的 IP 地址,默认值为 0.0.0.0 -->
    <property name="bindIp">0.0.0.0</property> 
	<!-- 定义 mycat 的使用端口,默认值为 8066 -->
	<property name="serverPort">8066</property> 
	<!-- 定义 mycat 的管理端口,默认值为 9066 -->
    <property name="managerPort">9066</property> 
	<property name="frontWriteQueueSize">4096</property> 
	<!-- 分布式事务开关。0为不过滤分布式事务;1为过滤分布式事务;2 为不过滤分布式事务,但是记录分布式事务日志 -->
	<property name="handleDistributedTransactions">0</property>
	<property name="useOffHeapForMerge">1</property>
	<property name="memoryPageSize">1m</property>
	<property name="spillsFileBufferSize">1k</property>
	<property name="useStreamOutput">0</property>
	<property name="systemReserveMemorySize">384m</property>
	<!-- 是否采用zookeeper协调切换 -->
	<property name="useZKSwitch">true</property>
</system>

    3,firewall标签 — 防火墙配置节点

<!-- 白名单和黑名单一般只对一个进行设置 -->
<firewall> 
	<!-- 白名单 -->
	<whitehost>
		<host host="127.0.0.1" user="mycat"/>
		<host host="127.0.0.2" user="mycat"/>
	</whitehost>
	<!-- 黑名单 -->
	<blacklist check="false">
	</blacklist>
</firewall>

二,schema.xml

    1,schema标签:mycat逻辑库相关配置

<!-- 数据库设置,此数据库为逻辑数据库,name与server.xml中schemas对应 -->
<!-- schema : 定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置 -->
<!-- name : 逻辑数据库名,与server.xml中的schemas对应-->
<!-- checkSQLschema	: 数据库前缀相关设置,当该值为true时,例如我们执行语句select * from db_store.company 。mycat会把语句修改为 select * from company 去掉db_store -->
<!-- sqlMaxLimit : 当该值设置为某个数值时,每条执行的sql语句,如果没有加上limit语句,Mycat会自动加上对应的值。不写的话,默认返回所有的值。
* 需要注意的是,如果运行的schema为非拆分库的,那么该属性不会生效。需要自己sql语句加limit -->
<schema name="db_store" checkSQLschema="false" sqlMaxLimit="100">
	<table name="store" dataNode="db_store_dataNode" primaryKey="storeID"/>
	<table name="employee" dataNode="db_store_dataNode" primaryKey="employeeID"/>
</schema>
<schema name="db_user" checkSQLschema="false" sqlMaxLimit="100">
	<table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
	<!-- name : 表名, 物理数据库中表名 -->
	<!-- dataNode : 表存在节点, 多个节点用","隔开, 连续节点通过"$"进行连接处理, 如下 -->
	<!-- primaryKey	: 主键字段名,自动生成主键时需要设置 -->
	<!-- autoIncrement : 是否自增
		* mysql对非自增长主键,使用last_insert_id() 是不会返回结果的,只会返回0.所以,只有定义了自增长主键的表,才可以用last_insert_id()返回主键值
		* mycat提供了自增长主键功能,但是对应的mysql节点上数据表,没有auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的 -->
	<!-- rule : 分片规则名, 具体在rule.xml解析 -->
	<!-- type : 该属性定义了逻辑表的类型,目前逻辑表只有全局表和普通表。全局表: global 普通表:无 -->
	<!-- needAddLimit : 指定表是否需要自动的在每个语句后面加上limit限制,由于使用了分库分表,数据量有时候会特别庞大,这时候执行查询语句,忘记加上limt就会等好久,所以mycat自动为我们加上了limit 100,这个属性默认为true,可以自己设置为false禁用。如果使用这个功能,最好配合使用数据库模式的全局序列 -->
	<!-- subTables : 分表, 分表目前不支持join -->
	<table name="users" dataNode="db_user_dataNode$1-2"  rule="mod-userID-long" primaryKey="userID">
		<!-- childTable : 定义ER分片的子表, 通过属性与父表进行关联 -->
		<!-- name : 子表(物理表)名称 -->
		<!-- joinKey : 子父表关联字段在子表的名称 -->
		<!-- parentKey : 子父表关联字段在父表的名称 -->
		<childTable name="user_address"  joinKey="userID" parentKey="userID" primaryKey="addressID"/>
	</table>
</schema>

    2,dataNode标签:分片分库信息相关配置

<!-- 节点配置 : 分片信息,也就是分库相关配置-->
<!-- dataNode : 定义了mycat中的数据节点,也就是我们所说的数据分片。一个datanode标签就是一个独立的数据分片
	* 如下表述的意思为,使用名字为db_storeHOST数据库实例上的db_store物理数据库,这就组成一个数据分片,最后我们用db_store_dataNode来标示这个分片-->
<!-- name : 定义数据节点的唯一名称, 在table标签上用这个名字建立表与分片对应的关系 -->
<!-- dataHost : 用于定义该分片属于哪个数据库实例,属性与datahost标签上定义的name对应 -->
<!-- database : 用于定义该分片属于数据库实例上的物理库 -->
<dataNode name="db_store_dataNode" dataHost="db_storeHOST" database="db_store" />
<dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user" />
<dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user" />

    3,dataHost标签:mysql物理数据库相关配置

<!-- 节点主机配置 : 物理数据库,真正存储数据的数据库 -->
<!-- 这个标签直接定义了具体数据库实例,读写分离配置和心跳语句 -->
<!-- name : 唯一标示dataHost标签,供上层dataNode使用 -->
<!-- maxCon : 指定每个读写实例连接池的最大连接 -->
<!-- minCon : 指定每个读写实例连接池的最小连接 -->
<!-- balance : 负载均称类型
	* 0 : 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
	* 1 : 全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1-S1,M2-S2 并且M1 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
	* 2 : 所有读操作都随机的在writeHost、readHost上分发
	* 3 : 所有读请求随机的分发到writeHst对应的readHost执行,writeHost不负担读写压力 -->
<!-- writeType : 负载均衡类型
	* 0 : 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
	* 1 : 所有写操作都随机的发送到配置的 writeHost。1.5以后版本废弃不推荐 -->
<!-- switchType	: 节点切换方式
	* -1 : 不自动切换
	*  1 : 默认值 自动切换
	*  2 : 基于MySql主从同步的状态决定是否切换心跳语句为 show slave status
	*  3 :  基于mysql galary cluster 的切换机制(适合集群)1.4.1 心跳语句为 show status like 'wsrep%'-->
<!-- dbType : 指定后端链接的数据库类型目前支持二进制的mysql协议,还有其他使用jdbc链接的数据库,例如:mongodb,oracle,spark等 -->
<!-- dbDriver : 指定连接后段数据库使用的driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb,其他类型的则需要使用JDBC驱动来支持; 如果使用JDBC的话需要符合JDBC4标准的驱动jar 放到mycat\lib目录下 -->
<!-- tempReadHostAvailable : 如果配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、1) -->
<dataHost name="db_storeHOST" maxCon="1000" minCon="10" balance="1"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<!-- 指明用于和后端数据库进行心跳检查的语句 -->
	<!-- mysql : 可以用select user()-->
	<!-- oracle : 可以用select 1 from dual-->
	<heartbeat>select user()</heartbeat>
	<!-- readHost/writeHost : 这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例 -->
	<!-- host : 标识不同的示例, 一般 writeHost 我们使用*M1,readHost 我们用*S1 -->
	<!-- url : 后端实例连接地址。
		* Native:地址:端口
		* JDBC:jdbc的url -->
	<!-- user : 后端存储实例需要的用户名称 -->
	<!-- password : 后端存储实例需要的密码 -->
	<!-- weight : 权重, 配置在 readhost 中作为读节点的权重 -->
	<!-- usingDecrypt : 是否对密码加密,默认0(不加密)。具体加密方法看官方文档 -->
	<writeHost host="hostM1" url="192.168.8.137:3306" user="root"  password="123456">
		<readHost host="hostS1" url="192.168.8.101:3306" user="root" password="123456" />
	</writeHost>
</dataHost>
<dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="userHost1" url="192.168.8.137:3306" user="root"  password="123456">
	</writeHost>
</dataHost>
<dataHost name="db_userHOST2" maxCon="1000" minCon="10" balance="0"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="userHost2" url="192.168.8.101:3306" user="root"  password="123456">
	</writeHost>
</dataHost>

三,rule.xml

    1,tableRule标签

<!-- 定义表拆分规则 -->
<!-- name : 属性指定唯一的名字,用于标识不同的表规则, 与scheme.xml中的rule属性对应 -->
<tableRule name="sharding-by-intfile">
	<rule>
		<!-- 指定要拆分的列名字 -->
		<columns>sharding_id</columns>
		<!-- 表拆分算法, 与function的name对应; 连接表规则和具体路由算法 -->
		<algorithm>hash-int</algorithm>
	</rule>
</tableRule>

    2,function标签

<!-- name : 指定算法名称 -->
<!-- class : 指定算法具体实现的类名称 -->
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
	<!-- 具体算法需要的属性文件, 该文件在mycat文件的conf路径下 -->
	<property name="mapFile">partition-hash-int.txt</property>
</function>

    3,分片规则

         a, 连续分片之自定义数字范围分片,0-2标识节点为数据库节点,取在schema中的节点配置顺序;该配置表示按照索引进行数据分片,索引0-5000000分配在0节点,5000000-10000000分配到1节点,以此类推

<function name="rang-long"
		class="io.mycat.route.function.AutoPartitionByLong">
	<property name="mapFile">autopartition-long.txt</property>
    <!-- 超过范围后的默认节点 -->
	<property name="defaultNode">0</property> 
</function>

MyCat配置信息详解 - 第1张  | 技术人生-孙强

        b,连续分片之按时间(月,天,小时)分片

<!-- 按日期(天)分片: 从开始日期算起,按照天数来分片 -->
<function name=“sharding-by-date” class=“io.mycat.route.function.PartitionByDate">
	<property name=“dateFormat”>yyyy-MM-dd</property>      <!—日期格式-->
	<property name=“sBeginDate”>2014-01-01</property>            <!—开始日期-->
	<property name=“sPartionDay”>10</property> <!—每分片天数-->
</function>

<!-- 按日期(自然月)分片: 从开始日期算起,按照自然月来分片 -->
<function name=“sharding-by-month” class=“io.mycat.route.function.PartitionByMonth">
	<property name=“dateFormat”>yyyy-MM-dd</property>        <!—日期格式-->
	<property name=“sBeginDate”>2014-01-01</property>            <!—开始日期-->
</function>

<!-- 按月小时进行分片, 最多24个分片, 最少1个分片, 一个月完成后从头开始循环, 每个月月尾, 需要手动清理备份数据 -->
<function name="sharding-by-hour" class=“io.mycat.route.function.LatestMonthPartion"> 
	<property name=“splitOneDay”>24</property> <!-- 将一天的数据拆解成几个分片-->
</function>

        c,离散分片之枚举分片 — 通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的

<function name="hash-int" class=“io.mycat.route.function.PartitionByFileMap">
    <!-- 配置文件名称 -->
 	<property name="mapFile">partition-hash-int.txt</property> 
    <!-- type默认值为0(0表示Integer,非零表示String) -->
	<property name="type">0</property> 
    <!-- 默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点 -->
	<property name="defaultNode">0</property> 
</function> 

MyCat配置信息详解 - 第2张  | 技术人生-孙强

       d,十进制求模分片:规则为对分片字段十进制取模运算。数据分布最均匀

<function name="mod-long" class=“io.mycat.route.function.PartitionByMod"> 
	<!-- 参与分片的节点数量  --> 
	<property name="count">3</property> 
</function>

       e,离散分片之应用指定分片 — 规则为对分片字段进行字符串截取,获取的字符串即指定分片

              * 例如 id=05-100000002 在此配置中代表根据 id 中从 startIndex=0,开始,截取 size=2 位数字即 05,05 就是获取的分区,如果                  没传 默认分配到 defaultPartition

<function name="sharding-by-substring“ class="io.mycat.route.function.PartitionDirectBySubString">
    <!-- 开始截取的位置 -->
	<property name="startIndex">0</property>
    <!-- 截取的长度 -->
	<property name="size">2</property>
    <!-- 分片数量 -->
	<property name="partitionCount">8</property>
    <!-- 默认分片 -->
	<property name="defaultPartition">0</property>
</function>

        f,离散分片之字符串截取数字hash分片 — 此规则是截取字符串中的int数值hash分片

<function name="sharding-by-stringhash" class=“io.mycat.route.function.PartitionByString"> 
    <!-- 字符串hash求模基数, count表示分片数量  lenth * count = 1024 -->
	<property name=length>512</property>
	<property name="count">2</property> 
    <!--hash预算位, 没搞懂...-->
	<property name="hashSlice">0:2</property>
</function>

       g,离散分片之一致性Hash分片 — 此规则优点在于扩容时迁移数据量比较少

<function name="murmur" class=“io.mycat.route.function.PartitionByMurmurHash"> 
    <!-- 创建hash对象的种子,默认0--> 
	<property name=“seed”>0</property>
    <!-- 要分片的数据库节点数量,必须指定,否则没法分片--> 
	<property name="count">2</property>
    <!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
	<property name="virtualBucketTimes">160</property>
</ function>

       h,综合分片之范围求模分片

            * 先进行范围分片计算出分片组,组内再求模,可以进行范围分片到0-200M,再组内分片到5个分片其中之一

            * 可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题

            * 分片组内使用求模可以保证组内数据比较均匀,分片组之间是范围分片可以兼顾范围查询

<function name="rang-mod" class=“io.mycat.route.function.PartitionByRangeMod"> 
	<property name="mapFile">partition-range-mod.txt</property>
 	<property name="defaultNode">32</property> 
</function>

           * 以下配置一个范围代表一个分片组,=号后面的数字代表该分片组所拥有的分片的数量

MyCat配置信息详解 - 第3张  | 技术人生-孙强

        i,综合分片之取模范围约束分片 — 对指定分片列进行取模后再由配置决定数据的节点分布

               * 1-32 即代表id%256后分布的范围,=后面的数字表示分配的节点

               * 如果id非数字,则分配在defaoultNode默认节点

<function name="sharding-by-pattern" class=“io.mycat.route.function.PartitionByPattern">
    <!-- 求模基数 -->
 	<property name="patternValue">256</property>
 	<property name="defaultNode">2</property> 
	<property name="mapFile">partition-pattern.txt</property> 
 </function>

MyCat配置信息详解 - 第4张  | 技术人生-孙强

最后编辑:
作者:sunny5156
喜欢技术....

留下一个回复