MyCAT简单入门配置

MyCAT简单入门配置

安装jdk 建议1.7以上

安装mysql

安装MyCAT

Mycat 源码:https://github.com/MyCATApache/Mycat-Server

Mycat 下载地址:https://github.com/MyCATApache/Mycat-download

#上传压缩包
rz 

#解压
tar -zxvf Mycat-server-1.6.5-release-20171228230037-linux.tar.gz

#配置环境变量
vim /etc/profile
增加
export MYCAT_HOME=/gome/mycat
#生效
source /etc/profile

配置

conf目录下编辑service.xml,rule.xml,schema.xml三个文件。

service.xml主要配置mycat服务的参数,比如端口号,myact用户名和密码使用的逻辑数据库等
role.xml主要配置路由策略,主要有分片的片键,拆分的策略(取模还是按区间划分等)
schema.xml文件主要配置数据库的信息,例如逻辑数据库名称,物理上真实的数据源以及表和数据源之间的对应关系和路由策略等。

假设:

两张表users和item,三个数据库db01,db02,db03(三个库在一个数据库实例上)
users只在db01中存储。
item表被分割到db02和db03中存储。

create database db01; 

 CREATE TABLE users (  
    id INT NOT NULL AUTO_INCREMENT,  
    name varchar(50) NOT NULL default '',  
    indate DATETIME NOT NULL default '0000-00-00 00:00:00',  
    PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  

create database db02;  
 CREATE TABLE item (  
    id INT NOT NULL AUTO_INCREMENT,  
    value INT NOT NULL default 0,  
    indate DATETIME NOT NULL default '0000-00-00 00:00:00',  
    PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

create database db03;  
CREATE TABLE item (  
    id INT NOT NULL AUTO_INCREMENT,  
    value INT NOT NULL default 0,  
    indate DATETIME NOT NULL default '0000-00-00 00:00:00',  
    PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8; 

server.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="defaultSqlParser">druidparser</property>  
        <property name="mutiNodeLimitType">1</property>  
        <property name="serverPort">8066</property>  
        <property name="managerPort">9066</property>   
    </system>
    
    <user name="test">  
            <property name="password">test</property>  
            <property name="schemas">TESTDB</property>  
    </user> 

    <user name="user">  
            <property name="password">user</property>  
            <property name="schemas">TESTDB</property>  
            <property name="readOnly">true</property>  
    </user>  

</mycat:server>

schema.xml

<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">  

    <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->  
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">  
        <table name="users" primaryKey="id"  dataNode="node_db01" />  
        <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="role1" />  

    </schema>  

    <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->  
    <dataNode name="node_db01" dataHost="dataHost01" database="db01" />  
    <dataNode name="node_db02" dataHost="dataHost01" database="db02" />  
    <dataNode name="node_db03" dataHost="dataHost01" database="db03" />  

    <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
    <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
            <heartbeat>select user()</heartbeat>  
            <writeHost host="server1" url="127.0.0.1:3306" user="root" password="123456"/>  
    </dataHost>  
</mycat:schema>

role.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="role1">
        <rule>
            <columns>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>
</mycat:rule>

启动

./bin/startup_nowrap.sh

测试

#进入mycat逻辑数据库
mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB

#执行插入sql
insert into users(name,indate) values('kk',now());
insert into users(name,indate) values('ss',now());
insert into item(id,value,indate) values(1,100,now());
insert into item(id,value,indate) values(2,100,now());

登录实际数据库,查询数据

插入的users表中的数据全部在db01中,而item表中的数据通过Id取模后均匀的分布在db02和db03中。这样就根据实际的路由策略进行了分表。

原文地址:https://www.cnblogs.com/zhangyaxiao/p/8267408.html