Mycat安装需要JDK;
官网下载然后解压:http://www.mycat.io/ (备注Mycat库:http://dl.mycat.io/)
启动和关闭Mycat命令:
在bin目录下输入命令: ./mycat start 和 ./mycat stop
配置:(个人理解一些重要的配置文件)
Mycat目录格式参照常见格式(bin/conf/logs/lib)
server.xml: Mycat服务器参数调整和用户授权
schema.xml:逻辑库定义和表以及分片定义的配置文件(设置逻辑库,表,数据节点信息)
rule.xml:分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件
日志文件:日志存放在logs/log,每天一个文件,日子的配置是在conf/log4j.xml中,可以根据需要调整输出级别(建议debug,可以输出更多信息)
三.Mycat使用:(配置文件解析)
3.1 server.xml:
3.1.1 <system>标签:
配置所有mycat参数设置(解析器,端口(默认8066)等),使用<property>标签配置
注意:q开头被划掉的为个人解读版,待验证
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0-->
<property name="useHandshakeV10">1</property><!-- q:发送握手数据包 -->
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property><!--q:"0"表示使用本地文件的方式配置mycat全局序列号,对应sequence_conf.properties文件;"1"表示使用数据库表的方式配置mycat全局序列号-->
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property> -->
<property name="processorBufferPoolType">0</property>
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool-->
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="idleTimeout">300000</property>
<!-- 指定连接的空闲超时时间默认30分钟,配置时,数据源超时时间要小于 mycat的空闲超时时间-->
<property name="processors">32</property> --> <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</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">true</property>
<!-- XA Recovery Log日志路径 -->
<!--<property name="XARecoveryLogBaseDir">./</property>-->
<!-- XA Recovery Log日志名称 -->
<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
<!-- 其他属性:
charset :连接的初始化字符集,默认utf8
txlsolation:前端连接的初始化事务隔离级别,默认是和mysql的repeated_read可重复读隔离级别一致
sqlExecuteTimeout:sql执行超时时间,默认是300秒
-->
</system>
3.1.2<user>
配置用户参数
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
3.1.3其他标签
防火墙:
<!-- 全局SQL防火墙设置 -->
<!--白名单可以使用通配符%或着*-->
<!--
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="root"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
3.2 schema.xml
3.2.1 <schema>标签
逻辑库配置,可以有多个;如果不配置该标签,所有表的配置都会属于一个默认的逻辑库.
<shceme>属性:
name属性:定义逻辑库名,需要跟server.xml中的引用对应
checkSQLschema属性:当该值设置为true时,执行SQL语句时,Mycat会去掉schema的字符(eg:"select * from TTESTDB.travelrecord"会被Mycat修改成"select * from travelrecord"),当SQL语句没有schema指定的名字,则不会更改SQL语句, 如果将存在schema字符的sql语句发往数据库会报"(ERROR 1146 (42S02): Table 'testdb.travelrecord' doesn’t exist)."错误
sqlMaxLimit属性:设置每天sql语句自动加上limit属性
dataNode属性:绑定逻辑库到某个具体的dataNode上,如果定义了这个属性,这个逻辑库就不能工作在分库分表模式下,这个逻辑库的所有操作都会直接作用到绑定的dataNode上,这个schema就可以用作读写分离和主从切换,可以直接方法,注意该属性只能配置一个databas
子标签<table>标签:定义逻辑表,所有需要拆分的表都必须在这个标签下定义.
<table>属性:
name属性:逻辑表表名,同一个schema标签中table标签name属性唯一;
dataNode属性:定义这个逻辑表所属的dataNode,跟后面dataNode标签name属性对应(多个对应时可以使用如下方式);
<table name="testdb" dataNode="dn$0-2,multipleDn2$100-199" rule="auto-sharding- long" ></table>
<dataNode name="dn" dataHost="localhost1" database="db$0-99" ></dataNode>
<dataNode name="dn2" dataHost="localhost1" database=" db$0-99" ></dataNode>
rule属性:指定逻辑表使用的规则名,需要在rule.xml中有对应<tableRule>标签.
ruleRequired属性:指定是否绑定分片规则,为true时必须配置具体rule.
primaryKey属性: 标记了逻辑表对应真实表的主键(例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN上,如果使用该属性配置真实表的主键,那么mycat会缓存主键与具体DN的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的DN 来获取数据。)
type属性: 定义逻辑表类型,global(全局表)&无(普通表)
autoIncrement属性: mysql对非自增长主键,使用last_insert_id() 是不会返回结果的,只会返回0.所以,只有定义了自增长主键的表,才可以用last_insert_id()返回主键值。 mycat提供了自增长主键功能,但是对应的mysql节点上数据表,没有auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的。如果使用这个功能,最好配合使用数据库模式的全局序列。
needAddLimit属性:指定表是否需要自动给sql语句加上limit,这个属性默认为true,默认100条,可以设置false关闭这个功能
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
rule="mod-long" /> -->
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<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>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
<ChildTable>标签: childTable标签用于定义E-R分片的子表。通过标签上的属性与父表进行关联。
joinKey属性: 插入子表的时候会使用这个列的值查找父表存储的数据节点。
parentKey属性:属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinkey的值,再通过**parentKey**属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<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>
3.2.2 <dataNode>标签
配置分片,表切分后需要配置映射到哪几个数据库,mycat的分片其实是库的别名.
name属性:定义数据节点名,唯一.
dataHost属性: 定义该分片属于哪个物理库,与<datahost>标签上的name属性对应
dataBase属性:定义该分片属于数据库实例上的物理库
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
3.2.3 <dataHost>标签
定义了物理库分片映射,可配置读写分离,单库和心跳语句
name属性:标识dataHost标签,唯一.
maxCon属性:指定每个读写实例连接池最大连接.
minCon属性:指定每个读写实例连接池最小链接,初始化连接池大小.
balance属性:指定负载均衡类型
{"0" : 不开启读写分离,所有操作由发往writeHost--"1" : 所有readHost和stand by writeHost参与select语句的负载均衡,即所有写操作由第一个writeHost执行,读操作由其他所有可用host参与-- "2" : 所有select操作随机分发所有host--"3" : 1.4版本后新加入,所有select操作由writeHost对应的readHost执行,}
writeType属性: 配置主从相关属性
{"-1" : 不自动切换--"1" 默认值,自动切换--"2": 基于MySql主从同步状态决定是否切换,心跳语句为show slace status -- "3" : 1.4.1,基于mysql galary cluster 的切换机制(集群状态下) ,心跳语句为show status like 'wsrep%'}.
dbType属性:指定后端连接的数据库目前支持二进制的mysql协议,还有其他使用jdbc链接的数据库.
DBDriver属性: 指定连接后段数据库使用的driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb,其他类型的则需要使用JDBC驱动来支持。如果使用JDBC的话需要符合JDBC4标准的驱动jar 放到mycat\lib目录下,并检查驱动jar包中包括如下目录结构文件 META-INF\services\java.sql.Driver。 在这个文件写上具体的driver类名,例如com.mysql.jdbc.Driver
connectionInitSql属性:主要是当使用Oracla数据库时,需要执行的初始化SQL语句就这个放到这里面来
<heartbeat>: 指定用于物理库进行心跳检测的语句
<writeHost> <readHost>
指定后端数据库的相关配置给mycat,用于实例化后端连接池。
host属性:用于标识不同实例,一般writeHost我们使用*M1,readHost我们用*S1。
url属性:后端实例连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/。
user属性:后端存储实例需要的用户名字
password属性:后端存储实例需要的密码
<dataHost name="localhost1" 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 -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
3.3 rule.xml
配置具体的表分片规则