官方地址不能下载了,但是可以看一下关于Mycat的文档,也是不错的。
官方下载地址
conf目录下的server.xml和schema.xml
server.xml
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">mydbproperty>
user>
schema.xml
<schema name="mydb" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<table name="t_company" primaryKey="id" autoIncrement="true"
dataNode="dn1,dn2,dn3" rule="range-sharding-by-members-count"/>
schema>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123">
writeHost>
dataHost>
1)直接双击运行
2)命令行方式运行
建议使用命令行方式运行,在修改配置文件后方便重启。
1)测试数据库连接
即可看到根据配置自动生成的表
2)测试分库
CREATE DATABASE db1 CHARCTER SET 'utf8';
CREATE DATABASE db2 CHARCTER SET 'utf8';
CREATE DATABASE db3 CHARCTER SET 'utf8';
CREATE TABLE t_customer(
id BIGINT PRIMARY KEY,
name VARCHAR(100) not NULL,
province int not null
);
insert into t_customer(id,name,province) values(1,'stephanie01',1001);
insert into t_customer(id,name,province) values(4,'stephanie04',1004);
insert into t_customer(id,name,province) values(5,'stephanie05',1005);
db2
insert into t_customer(id,name,province) values(2,'stephanie02',1002);
db3
insert into t_customer(id,name,province) values(3,'stephanie03',1003);
发现数据也同步到了mycat 【因为(3)配置中的schema.xml 配置了t_customer同步db1,db2,db3三个节点】
数据库中间件:对应用mycat就是数据库服务,mycat是后端数据库集群的代理。
逻辑库:mycat数据库服务中定义、管理的数据库。
逻辑表:逻辑库中包含的需分库分表存储的表。
dataNode:数据节点(分片节点),逻辑表分片的存放节点。
dataHost:数据主机(节点主机),数据节点所在的主机。
schema.xml
<mycat:schema>
<schema name=”testdb”>
<table name=”orders” primaryKey=”ID”
type=”global” dataNode=”dn1,dn2” />
schema>
<dataNode name=”dn1” dataHost=”dhost1” database=”db1”/> <dataHost name=”dhostl” ...>
<heartbeat>select user() heartbeat>
<writeHost host=”hostM1” url=”localhost:3306”...
host=”hostS2” url=”192.168.1.2:3306”.../>
writeHost>
dataHost>
mycat:schema>
writeHost:写主机,真实的数据库服务主机描述
readHost:读主机,真实的数据库服务主机描述
逻辑库schema配置
<mycat:schema xmlns:mycat=”http//io.mycat/”>
<schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100”>
schema>
mycat:schema>
MyCat可以有多个逻辑库,每个逻辑库都有自己的相关配置。如果不配置schema标签,所有的表配置,会属于同一个默认的逻辑库。
schema元素属性说明
属性名 | 值 | 数量限制 | 说明 |
---|---|---|---|
name | String | (1) | 逻辑数据库名 |
dataNode | String | (0…1) | 该库中未指定dataNode的表的默认存储节点 |
checkSQLschema | boolean | (1) | 是否检查SQL语句中库名(select*from TESTDB.orders;),如果设置为true,会检查;当库名与逻辑库名相同时,会去掉语句中的库名前缀。这么做的目的避免发送到后端数据库执行时报( ERROR 1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist) . |
sqlMaxLimit | int | (1) | 对于拆分库的schema,当该值设置为某个数值时,每条执行的SQL语句,如果没有加上limit子句,MyCat会自动加上。例如:设置值为100,执行select*from TESTDB.travelrecord;的效果为 select * from TESTDB.travelrecord limit 100: |
逻辑表table
<schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100”>
<table name=”travelrecord” dataNode=”dn1,dn2,dn3” rule=”auto-sharding-long”/>
<table name=”goods” primaryKey=”ID” type=”global” dataNode=”dn1,dn2”/>
<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>
table>
schema>
属性名 | 值 | 数量限制 | 说明 |
---|---|---|---|
name | String | (1) | 表名,同个schema标签中定义的名字必须唯一。 |
dataNode | String | (1.*) | 存放表数据的数据节点名。很多难以罗列时,可以这样配置:dataNode=“multipleDn$0-99,multipleDn2$100-199”,$0-99表示0-99 database=”db$0-99”> |
rule | String | (0…1) | 指定逻辑表要使用的分片规则名字,规则名字在rule.xml 中定义,必须与tableRule 标签中name 属性属性值一一对应 。 |
ruleRequired | boolean | (0…1) | 该属性用于指定表是否绑定分片规则,如果配置为true,但没有配置具体rule的话,程序会报错。 |
primaryKey | String | (1) | 该逻辑表对应真实表的主键,当分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN上,如果使用该属性配置了主键,那么MyCat会缓存主键与具体DN的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,会直接发送语句给具体的DN。 注意 :尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的DN,来获得数据。 |
type | String | (0…1) | 定义逻辑表的类型,,目前只有“全局表”和”普通表”两种。对应的配置:全局表:global 普通表:不指定该值为globla的所有表 |
autolncrement | boolean | (0…1) | 是否使用主键自增长 |
subTables | String | (1) | 分表,subTables="t_order$1-2,t_order3" 。目前分表1.6以后开始支持,并且dataNode在分表条件下只能配置一个,分表条件下不支持各种条件的join语句。 |
needAddLimit | boolean | (0…1) | 指定表是否需要自动的在每个语句后面加上limit限制。由于使用了分库分表,数据量有时会特别巨大。这时候执行查询语句,若恰巧忘记了加上数量限制,那么想要查询所有的数据,则需要等待一段时间。所以,mycat就自动的为我们加上LIMIT100。当然,如果语句中有limit,就不会再次添加了。这个属性默认为true,你也可以设置成false禁用掉默认行为。 |
<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>
table>
childTable标签用于定义E-R分片的子表,通过标签上的属性与父表进行关联。
属性名 | 值 | 数量限制 | 说明 |
---|---|---|---|
name | String | (1) | 子表名 |
primaryKey | String | (0…1) | 字表的主键列名 |
joinKey | String | (1) | 字表中与父表关联的列 |
parentKey | String | (1) | 父表中关联的列 |
<dataHost name=”localhostl” maxCon=”1000” minCon=”10” balance=”0”
writeType=”0” dbType=”mysql” dbDriver=”native” switchType=”1” slaveThreshold=”100”>
<heartbeat>select user()heartbeat>
<writeHost host=”hostM1” url=”localhost:3306” user=”root” password=”123456”>
<readHost host=”hostS2” url=”192.168.1.200:3306” user=”root” password=”xxx”/>
writeHost>
dataHost>
dataHost定义Mycat中的数据主机,数据主机定义中定义了具体的数据库服务
、读写分离配置
和心跳语句
。这是与物理数据库服务关联的地方。
<dataHost name=”localhost1” maxCon=”1000” minCon=”10” balance=”0”
writeType=”0” dbType=”mysql” dbDriver=”native” switchType=”1” slaveThreshold=”100”>
<heartbeat>select user()heartbeat>
<writeHost host=”hostM1” url=”localhost:3306” user=”root” password=”123456”>
<readHost host=”hostS2” url=”192.168.1.200:3306” user=”root” password=”xxx”/>
writeHost>
dataHost>
心跳检查
的语句<dataHost name=”localhost1” maxCon=”1000” minCon=”10” balance=”0”
writeType=”0” dbType=”mysql” dbDriver=”native” switchType=”1” slaveThreshold=”100”>
<heartbeat>select user()heartbeat>
<writeHost host=”hostM1” url=”localhost:3306” user=”root” password=”123456”>
<readHost host=”hostS2” url=”192.168.1.200:3306” user=”root” password=”xxx”/>
writeHost>
dataHost>
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。writeHost指定写实例、readHost指定读实例。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。
另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。
属性名 | 值 | 数量限制 | 说明 |
---|---|---|---|
host | String | (1) | 用于标识不同实例,一般writeHost我们使用Ml,readHost我们用S1。 |
url | String | (1) | 后端实例连接地址若是用native的dbDriver,则一般为address:port这种形式。若是用JDBC或其他的dbDriver,则需要特殊指定。(当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/) |
user | String | (1) | 连接后端存储实例的用户名 |
password | String | (1) | 密码 |
加密密码,执行mycatjar程序(1.4.1以后)
java-cp Mycat-server-1.4.1-dev.jar io.mycat.util.DecryptUtil 1:host:user:password
Mycat-server-1.4.1-dev.jar 为 mycat download 下载目录的jar
1:host:user:password中1为db端加密标志,host为dataHost的host名称
配置mysql端主从的数据自动同步,mycat不负责任何的数据同步问题。
Mycat配置读写分离,具体参数参考schema配置。
<dataHost name=”localhostl” maxCon=”1000” minCon=”10” balance=”1” writeType=”0” dbType=”mysql” dbDriver=”native”>
<heartbeat>select user()</heartbeat>
<writeHost host=”hostM1” url=”localhost:3306” user=”root” password=”123456”>
<readHost host=”hostS1” url=”localhost2:3306” user=”root” password=”123456” weight=”1” />
</writeHost>
</dataHost>
<dataHost name=”localhostl” maxCon=”1000” minCon=”10” balance=”1”
writeType=”0” dbType=”mysql” dbDriver=”native”>
<heartbeat>select user()</heartbeat>
<writeHost host=”hostM1” url=”localhost:3306” user=”root” password=”123456”></writeHost>
<writeHost host=”hostS1” url=”localhost:3307” user=”root” password=”123456”></writeHost>
</dataHost>
第一种当写挂了读不可用,第二种可以继续使用(配置了mysql端主从数据同步)。事务内部的一切操作都会走写节点,所以读操作不要加事务。
schema.xml
<xml version=”1.0”>
<mycat:schema xmlns:mycat=”http://io.mycat/”>
<schema name=”mydb1” checkSQLschema=”false” sqlMaxLimit=”100” dataNode=”mydn11”>
schema>
<dataNode name=”mydn1” dataHost=”dhost1” database=”orders” />
<dataNode name=”mydn2” dataHost=”dhost2” database=”orders” />
<dataHost name=”dhost1” maxCon=”1000” minCon=”10” balance=”1”
writeType=”0” dbtype=”mysql” dbDriver=”native”>
<heartbeat>select user()heartbeat>
<writeHost host=”myhostM1” url=”192.168.100.218:3306” user=”stephanie” password=”stephanie123!”>
<readHost host=”myhostS1” url=”192.168.100.219:3306” user=”stephanie” pasisword=”stephanie123! ! weight=”1” />writeHost>
dataHost>
<dataHost name=”dhost2” maxCon=”1000” minCon=”10” balance=”1”
writeType=”0” dbType=”mysql” dbDriver=”native”>
<heartbeat>select user()heartbeat>
<writeHost host=”myhostM2” url=”192.168.100.218:3306” user=”stephanie” password=”stephanie123!”>writeHost>
<writeHost host=”myhostS2” url=”192.168.100.219:3306” user=”stephanie” passwo rd=”stephanie123!”>writeHost>
dataHost>
mycat: schema>
server.xml
<mycat>
<user name=”root” defaultAccount=”true”>
<property name=”password”>123456property>
<property name=”schemas”>mydblproperty>
mycat:server>