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中。这样就根据实际的路由策略进行了分表。