MyCat 分库表
此教程使用的是单表分两库
目录
三:修改 schema.xml 逻辑库的配置 主要配置的是逻辑库,逻辑表,数据节点,和实际数据源之间的关系
ー:下载
目前只有 1.6.5版本 以上支持单库分表。
下载,解压使用即可。
解压后,修改配置文件,在 mycat/conf 下
二:修改 server.xml MyCat 服务级别的配置
MyCat 的配置文件,设置账号、参数等.
<!-- mycat的8066 端口连接的用户名,密码,逻辑数据库名 -->
<user name="lsq" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mydb</property>
</user>
设置 user name,password 及 schemas; 主要做的功能就是 逻辑库与用户 做映射。
name 和 password 在连接代理数据库 MyCat 时使用;
schemas 是逻辑库,要和 schema.xml 里的 schema name 对应。
三:修改 schema.xml 逻辑库的配置 主要配置的是逻辑库,逻辑表,数据节点,和实际数据源之间的关系
mycat 逻辑数据库、表的映射关系
mysql 数据节点、所属物理数据库的映射关系。
Mycat 对应的物理数据库和数据库表的配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mydb" checkSQLschema="true" sqlMaxLimit="100">
<table name="lsqtable" primaryKey="id" autoIncrement="true" dataNode="dn$1-2" rule="mod-long" />
<!-- <table name="jointable" primaryKey="id" type="global" dataNode="dn$1-2" autoIncrement="true" /> -->
</schema>
<dataNode name="dn1" dataHost="localhost1" database="mydb" />
<dataNode name="dn2" dataHost="localhost2" database="mydb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" maxRetryCount="4">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.85.128:3306" user="root" password="***">
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" maxRetryCount="4">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.85.130:3306" user="root" password="***">
</writeHost>
</dataHost>
</mycat:schema>
schema name 要和 server.xml 对应上,既多个用户拥有对该逻辑库的权限。
<schema name="mydb">
city表 设置分表三张,单库多表只能设置一个 datanote,rule 采用取模模式 mod-long 取模分片。
<table name="lsqtable" primaryKey="id" autoIncrement="true" dataNode="dn$1-2" rule="mod-long" />
writeHost 和 readHost 设为同一数据库。
四:修改 rule.xml
MyCat 分片(分库分表)规则,mod-long 取模分片 取模列为 id 取模算法为 mod-long
<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">2</property>
</function>
此次选用默认的 mod-long 规则,只需修改 count 数.
修改 property count 等于 2。
这样,配置已经完成。
五:修改 MySQL 数据库
先在 MySQL 库上,建 2 张表,lsqtable 。
启动 Mycat
启动:
./mycat start
查看启动状态:
./mycat status
停止:
./mycat stop
重启(改变上面的 xml 配置不用重启,管理端可以重新载入):
./mycat restart
查看 logs/ 下的 wrapper.log 和 mycat.log 可以查看运行时问题和异常。
mycat 启动日志:
cat ./logs/wrapper.log
mycat 应用日志:
cat ./logs/mycat.log
六:测试
mysql 创建 mydb 数据库,两个数据源分别创建 lsqtable。
连接 mycat, 端口:8066,账号:lsq, 密码:123456 // 对应 server 表中的 user 标签
执行 sql 语句,查看执行过程。
EXPLAIN
insert into lsqtable(id, l, s, q) VALUES (1, 'l1', 's1', 'q1')
可以分析 update 语句,或者 select 语句,可知偶数的 id 都被路由到了第一个库,奇数的 id 都被路由到了第二个库,因为 datanode1 作为第一个节点 0,datanode2 作为第二个节点 1。使用除留余数法,偶数的余数都为 0,而奇数的余数都为 1。打开 mysql 中的 mydb 数据库 lsqtable 表可看到数据:
可查看执行过程路由到物理表 dn1 库所在表上:
explain SELECT * FROM lsqtable WHERE id = 3
datanode sql
dn2 SELECT * FROM lsqtable WHERE id = 3
3 % 2 = 1 会路由到 1 的节点。dn2 在 xml 配置中属于 1 的节点。从 0 开始