Mycat快速入门教程
Posted 程序员侃世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mycat快速入门教程相关的知识,希望对你有一定的参考价值。
Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者丨sf4y
来源丨 JAVA葵花宝典
https://segmentfault.com/a/1190000022237732
基本原理
安装
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
,建议安装在
usr/local/mycat
,解压到当前目录,目录结构:
bin catlet conf lib logs version.txt
vim /etc/profile
添加
MYCAT_HOME=/usr/local/mycat
运行
linux:
windows:
基本配置:
# Java Additional Parameters
wrapper.java.additional.1=-DMYCAT_HOME=. wrapper.java.additional.2=-server wrapper.java.additional.3=-XX:MaxPermSize=64M wrapper.java.additional.4=-XX:+AggressiveOpts wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false wrapper.java.additional.10=-Xmx1G wrapper.java.additional.11=-Xmn512M
规则配置
-
server.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
<property name="schemas">TESTDB,db1,db2</property>
system
这个标签内嵌套的所有 property 标签都与系统配置有关,如果没有特殊需求默认即可
<system>
<property name="charset">utf8</property>
<!--这个属性主要用于指定系统可用的线程数,默认值为机器 CPU 核心线程数。-->
<property name="processors">1</property>
<!--这个属性主要用于指定 NIOProcessor 上共享的 businessExecutor 固定线程池大小。
mycat 在需要处理一 些异步逻辑的时候会把任务提交到这个线程池中。
新版本中这个连接池的使用频率不是很大了,可以设置一个较 小的值。-->
<property name="processorExecutor">32</property>
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务
(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,
但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
...
</system>
-
schema.xml 文件地址 mycat/conf/schema.xml
,这个xml 是mycat配置的重头戏,里面有几个很关键的标签schema
table
dataNode
dataHost
等等。首先配置schema
标签:table
:schema标签中包含了table
属性,mycat中table有2种类型,一种是全局广播表,一种是分片表,如果没有在这里面配置的表呢,schema 标签有个dataNode
属性,没有配置默认读写在这个库里面,table中还有一个属性subTables
,是指把一个表拆分成多个子表,例如下面表示有3个表 t_order1,t_order2,t_order3
subTables="t_order$1-2,t_order3"
dataNode
: 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是 一个独立的数据分片
dataHost
: 该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具 体的数据库实例、读写分离配置和心跳语句。
writeHost
标签、
readHost
标签, writeHost 指 定写实例、readHost 指定读实例, 用来做读写分离。
<!-- 配置默认的name逻辑库名称,checkSQLschema属性为false的时候,sql查询是会带上逻辑库的名称TESTDB.tableName,
如果不想带上逻辑库名称,设置为true,sqlMaxLimit表示分页最大limit,dataNode表示没有分片的表默认使用这个库-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!-- mycat中table有2种类型,一种是全局广播表,一种是分片表,type="global" 表示全局表,会同步到所有的库,一般是用于数据字典表,
方便join 操作,分片表只type不用指定,默认就是分片,需要配置分片规则, primaryKey对应逻辑表对应真实表的主键,
例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的 DN 上,如果使用
该属性配置真实表的主键。那么 MyCat 会缓存主键与具体 DN 的 信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,
-->
<table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost 对应dataHost 标签上定义的 name 属性,使用名字为 dh01 数据库实例上的 db1 物理数据库 -->
<dataNode name="dn01" dataHost="dh01" database="db01" />
<dataNode name="dn02" dataHost="dh02" database="db02" />
<!-- balance为0 不开启读写分离机制,writeType="0"所有写操作发送到配置的第一个 writeHost,switchType=1 默认值,自动切换 -->
<dataHost name="dh01" writeType="0" switchType="1" balance="0" dbType="mysql" maxCon="1000" minCon="10" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
<!-- 配置读写分离, can have multi read hosts -->
<readHost host="hostS1" url="192.168.1.200:3306" user="root" password="123456" />
</writeHost>
</dataHost>
<!-- 如果是用多台数据库实例,需要配置多个dataHost,如果只是单实例多个数据库,只要配置一个就可以了 -->
<dataHost name="dh02" writeType="0" switchType="1" balance="0" dbType="mysql" maxCon="1000" minCon="10" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="192.168.11.123:3306" user="root" password="root" >
</writeHost>
</dataHost>
</schema>
-
rule.xml
/usr/local/mycat/conf/rule.xml
<tableRule name="rule1"> <rule>
<columns>id</columns>
<algorithm>func1</algorithm> </rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
Mycat 常用的分片规则
1. 分片枚举
<tableRule name="sharding-by-intfile"> <rule>
<columns>user_id</columns> <algorithm>hash-int</algorithm> </rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property> <property name="type">0</property>
<property name="defaultNode">0</property>
</function>
partition-hash-int.txt 配置:
10000=0
10010=1
DEFAULT_NODE=1
-
defaultNode 默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点 * 默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点 -
如果不配置默认节点(defaultNode 值小于 0 表示不配置默认节点),碰到 -
不识别的枚举值就会报错, -
like this:can’t find datanode for sharding column:column_nameval:ffffffff */
2. 固定分片 hash 算法
<tableRule name="rule1"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule>
</tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<!-- dataNote 个数,这边表示3个-->
<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>
</function>
2*256 + 1*512 = 1024
。
<!--平均分为 4 分片,partitionCount*partitionLength=1024 -->
<function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">4</property>
<property name="partitionLength">256</property>
</function>
3. 范围约定
<tableRule name="auto-sharding-long"> <rule>
<columns>user_id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property>
<property name="defaultNode">0</property> </function>
0-500M=0
500M-1000M=1
1000M-1500M=2
或
0-10000000=0
10000001-20000000=1
4. 取 模
<tableRule name="mod-long"> <rule>
<columns>user_id</columns> <algorithm>mod-long</algorithm> </rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes -->
<property name="count">2</property>
</function>
-
按日期(天)分片
<tableRule name="sharding-by-date"> <rule>
<columns>create_time</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
<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="sEndDate">2014-01-02</property>
<property name="sPartionDay">10</property> </function>
-
取模范围约束 -
截取数字做 hash 求模范围约束 -
应用指定 -
截取数字 hash 解析 -
一致性 hash -
按单月小时拆分
日志排查
conf/log4j2.xml
,设置mycat 日志地址
<RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
filePattern="${sys:MYCAT_HOME}/logs/${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
在看点这里好文分享给更多人↓↓
以上是关于Mycat快速入门教程的主要内容,如果未能解决你的问题,请参考以下文章