Mycat使用入门Windows环境
分类:数据库服务器搭建
标签:mysqlmycatwindows分库数据库配置
尝试启动mycat
下载解压后,运行startup_nowrap.bat:

如果报错找不到主类 **/mycat,需要将mycat文件夹放在没特殊字符或空格的路径下。例如,如果放在D:\Program Files\mycat路径下,就会找不到主类Files/mycat。
如果启动没有异常退出即可,日志中还会有一些错误,需要进行下一步配置。
配置用户、权限
在server.xml中,配置如下,默认就有:
<user name="root">
<property name="password">123456</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服务器。可以使用navicat连接,注意默认端口是8066。

连接成功后,发现有许多表和视图,但是都打不开,这就需要我们下一步的配置。
配置schema、table、节点、主机、分片规则
在schema.xml中:
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<!-- mod rule -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="mod-long" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
上面配置了一个数据库TESTDB,两张数据表travelrecord和company,其中company为全局表(global),会在dn1,dn2,dn3三个节点上各存储一份, travelrecord 是需要按照mod-long算法 分节点 存储的表。 mod-long 算法的配置在rule.xml中,后面再说。
节点、主机配置
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="127.0.0.1:3306" user="root" password="root" />
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
在一个主机上配置了三个节点:dn1、dn2、dn3,这就是前面配置table时的dataNode。此外readHost可以不用配置,如果配置,需要在mysql层面与writeHost数据同步,即主从复制同步。或者也可以像我这样保持数据同步。
此外,还需要在本地主机创建三个数据库,并在每个数据库都创建company和 travelrecord 表。脚本如下:
CREATE TABLE `company` (
`id` int(11) NOT NULL,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `travelrecord` (
`id` int(11) NOT NULL,
`name` varchar(64) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
配置完这些后,重启mycat,刷新navicat,就可以看到数据库只剩下两张表。再使用insert语句,插入测试数据:插入company表的数据,分别复制到了三个本地mysql数据库;插入 travelrecord 时,却报错了。这是因为 travelrecord 表的数据需要分片存储到三个mysql数据库,插入数据时,还需要配置分片存储的规则,需要以下配置。
分片规则
上面配置travelrecord table节点时,指定的rule,在rule.xml文件中,如下:
<tableRule name="mod-long">
<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">3</property>
</function>
其中,id为travelrecord表的主键,3需要与 travelrecord表 的dataNode个数一致。
配置好这个规则,再执行insert语句,即可插入成功。注意,insert语句不能省略列名,否则会出现以下错误:

在mycat端执行select语句验证:

再查看本地的三个数据库节点,数据的分布如下:

所以,travelrecord表的数据按照规则分别存储在三个节点对应的数据库表上。
分类:数据库服务器搭建
标签:mysqlmycatwindows分库数据库配置
