分库的原则:有紧密关联关系的表应该在一个库里,相互没有关联的表可以分配到不同的库里。
因为单个数据库达到了瓶颈,所以进行了分库操作,也就是说把单个数据库的表分配到不同的数据库中,分摊压力。
因为单个数据表达到了瓶颈,所以进行了分库操作,也就是说把数据库中的的单个表按字段进行拆分。(拆分的数据包不能在一个数据库中,否则就没有了意义)
1.修改 schema 配置文件
vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2" ></table>
<table name="orders" dataNode="dn1" ></table>
<table name="orders_detail" dataNode="dn1" ></table>
<table name="dict_order_type" dataNode="dn1" ></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="orders" />
<dataNode name="dn2" dataHost="host2" database="orders" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="master1" url="192.168.10.1:3306" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="master2" url="192.168.10.2:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
2.新增两个空白库
##在数据节点192.168.10.1和192.168.10.2上分别创建数据库 orders
CREATE DATABASE orders;
3、 启动 Mycat
./mycat console
4.访问mycat进行分库
mysql -umycat -p123456 -h 192.168.10.1 -P 8066
use TESTDB
##下面命令是创建数据表
#客户表 rows:20万
CREATE TABLE customer(id INT AUTO_INCREMENT,NAME VARCHAR(200),PRIMARY KEY(id));
#订单表 rows:600万
CREATE TABLE orders(id INT AUTO_INCREMENT,order_type INT,customer_id INT,amount DECIMAL(10,2),PRIMARY KEY(id));
#订单详细表 rows:600万
CREATE TABLE orders_detail(id INT AUTO_INCREMENT,detail VARCHAR(2000), order_id INT, PRIMARY KEY(id));
#订单状态字典表 rows:20
CREATE TABLE dict_order_type(id INT AUTO_INCREMENT, order_type VARCHAR(200), PRIMARY KEY(id));
#查看表信息,可以看到成功分库
相对来说:分表比分库要复杂的多。
需要根据实际情况来划分。
1.分析
选择达到瓶颈的表,然后分析,需要根据哪一字段进行拆分。
我们这边拆分了orders表,按“customer_id”进行拆分。
2.修改配置文件schema.xml
`
##为 orders 表设置数据节点为 dn1、dn2,并指定分片规则为 mod_rule(自定义的名字)
<table name="orders" dataNode="dn1,dn2" rule="mod\\_rule" ></table>
##在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,
##还有选择分片算法 mod-long(对字段求模运算),customer_id 对两个节点求模,根据结果分片
##配置算法 mod-long 参数 count 为 2,两个节点
##mod_rule是新添加的规则
4、 在数据节点 192.168.10.2上建 orders 表
`
mysql -uroot -p123456
CREATE TABLE orders.orders(id INT AUTO_INCREMENT,order_type INT,customer_id INT,amount DECIMAL(10,2),PRIMARY KEY(id));
**5、 重启 Mycat,让配置生效**
**`**
cd /usr/local/mycat/bin/
./mycat restart
6、 验证是否分表成功:访问 Mycat 实现分片
`
##在 mycat 里向 orders 表插入数据,INSERT 字段不能省略
use TESTDB;
INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
#在mycat、dn1、dn2中查看orders表数据,分表成功
## 三. mycat的分片“”join“”(关联)
orders表已经进行的分表,orders\_detail如何与之关联呢?
如果orders\_detail部分表又会造成什么样的后果?
如果order\_detail不分表,当用户去查询数据时首先到mycat,mycat对sql进行分片分析,分别到两台数据库,这时mysql1上只有3条数据,同时也有orders\_detail的3条数据,成功返回mycat,但是将sql发给mysql2时,发现这台数据库没有orders\_detail表,这时就会进行报错,把信息交给mycat,mycat合并,结果报错。所以说orders\_detail必须分表。那么又该怎么分呢?
orders\_detail相当于是orders的子表,之间有紧密的关联性。
##修改 schema.xml 配置文件
##删除第8 9行。

##在 dn2 创建 orders\_detail 表
CREATE TABLE orders.orders_detail(id INT AUTO_INCREMENT,detail VARCHAR(2000), order_id INT, PRIMARY KEY(id));
##重启 Mycat
./mycat restart
##访问 Mycat 向 orders_detail 表插入数据
INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1);
INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6);
##在mycat、192.168.10.1, 192.168.10.2中运行两个表join语句
Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。