本教程是在window环境下运行的,实际生产推荐在Linux上运行。必备条件:
http://dl.mycat.io/1.6-RELEASE/
下载解压即可
修改安装目录下conf文件夹中的server.xml、rule.xml、schemas.xml文件,server中主要是配置登录mycat逻辑库的用户名和密码以及端口号,rule中主要配置表的分片规则,schemas中配置物理表和逻辑表映射规则,物理主机信息等。
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparserproperty>
<property name="mutiNodeLimitType">1property>
<property name="serverPort">8066property>
<property name="managerPort">9066property>
system>
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">TESTDBproperty>
user>
<user name="user">
<property name="password">userproperty>
<property name="schemas">TESTDBproperty>
<property name="readOnly">trueproperty>
user>
mycat:server>
<tableRule name="mod-long">
<rule>
<columns>idcolumns>
<algorithm>mod-longalgorithm>
rule>
tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2property>
function>
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="users" primaryKey="id" autoIncrement="true" dataNode="dn2" />
<table name="item" primaryKey="id" autoIncrement="true" dataNode="dn0,dn1" rule="mod-long" />
<table name="products" primaryKey="id" autoIncrement="true" dataNode="dn0,dn1,dn2" rule="mod-long" />
<table name="orders" primaryKey="id" autoIncrement="true" dataNode="dn0,dn1,dn2" rule="mod-long" />
schema>
<dataNode name="dn0" dataHost="localhost1" database="db0" />
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<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="root">
writeHost>
dataHost>
mycat:schema>
将一个逻辑数据库TESTDB中表item、users数据按id取模或者其他分片方式分配到不同的物理数据库节点中.
1、创建3个物理数据库节点,db0,db1,db2
2、在db0,db1中创建一个主键为id的item表,在db0中创建一个主键位id 的users表
3、在mycat安装目录的conf文件下的schema中配置逻辑库和物理库的映射信息
<table name="users" primaryKey="id" autoIncrement="true" dataNode="dn2" />
<table name="item" primaryKey="id" autoIncrement="true" dataNode="dn0,dn1" rule="mod-long" />
4、通过navicat连接逻辑库
5、在逻辑数据库中,的item中添加一条记录,这条记录将根据id mode 2 的路由规则,分配到物理数据库db0,db1其中一个中。
分表的目的:大表拆分,mycat不支持多节点分表,只支持单机分表
<table name=”user” primaryKey=”id” subTables=”user$1-3” dataNode=”dn1” rule=”mode-long”>
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。 但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。因为写的时候要加行锁、表锁。
Mysql复制可能会出现延时,读写分离针对的是那些当前用户不需要立马知道其他用户该表的情形,例如,在评论的时候。然而对于那些实时性要求高的场景,读写分离不可使用,例如抢券的时候。
<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="root">
<readHost host=”rm” url=”localhost:3307” user=”root” password=”root” />
writeHost>
dataHost>
Mycat不管主从复制的复制过程,由mysql自己实现。
对job_detail 和 application_sys都做了分库分表,SELECT * FROM job_detail a INNER JOIN application_sys b ON a.SYSTEM_ID = b.ID。db1只会对db1中的两个表进行innerjoin,db2也同样,最后将所有的集合汇总得到一个总的集合。
全局表:在所有分片都备份
Er join :其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION的效率和性能问题,根据这一思路,提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。
<table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>
table>
问题描述:在不带主键id插入的时候报错
mycat sequnce err.io.mycat.config.util.ConfigException: can’t find definition for sequence :
获取id的方式为
SELECT 1187251302183342080 (MYCATSEQ_GLOBAL,MYCATSEQ_COMPANY是本地文件中配置的),每次执行 1187251302187536384都会将值加一
优点是快,缺点是每次mycat重启,值会重新计算。
Server.xml中配置0
首先,数据库脚本文件在conf目录下的deseq.sql文件,在数据节点dn1执行它
然后,1
接着,配置sequence_db_conf.properties文件中的数据节点dn1
将主键要自增长的表加入sequence序列中dn1节点
INSERT INTO MYCAT_SEQUENCE VALUES (‘JOB_DETAIL’, 100, 1);
推荐用第二种方式
修改后实现主键的自动增长,不带主键插入不报错