MYCAT入门实践

MYCAT入门实践

本教程是在window环境下运行的,实际生产推荐在Linux上运行。必备条件:

  • jdk1.7以上
  • mysql5.5以上
  • navicat或者dbvisualizer测试

mycat下载地址

http://dl.mycat.io/1.6-RELEASE/
下载解压即可
修改安装目录下conf文件夹中的server.xml、rule.xml、schemas.xml文件,server中主要是配置登录mycat逻辑库的用户名和密码以及端口号,rule中主要配置表的分片规则,schemas中配置物理表和逻辑表映射规则,物理主机信息等。

Server.xml配置



<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>

Rule.xml配置修改

<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>

Schema.xml配置修改



<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>

三种负载均衡类型:

负载均衡:Balance

  1. balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
  2. balance=”1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
  3. balance=”2”,所有读操作都随机的在writeHost、readhost上分发。
  4. balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3没有。

负载均衡writeType:

  1. writeType=”0”, 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
  2. writeType=”1”,所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。

负载均衡dataType

  • 表示不自动切换
  • 默认值,自动切换
  • 基于MySQL主从同步的状态决定是否切换

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 :

如何设置主键自增长:

通过本地文件sequence_conf.properties

获取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);

基于时间戳创建

推荐用第二种方式

修改后实现主键的自动增长,不带主键插入不报错

你可能感兴趣的:(mycat)