mycat2读写分离
mysql主从复制
mycat2 分库分表 实在 配置mycat2 读写分离 及主从复制的基础上完成的
以下所有操作 在mycat 登录
后执行
一、配置分库分表数据源
name:数据名称 一般以以最后一个字母判断 r 是读 w是写
url: 真实数据源ip地址 理论上是每一个ip都不相同的 我这儿是为了测试 做成的相同
user:数据库账号
password:数据库密码
#第一个写库
/*+ mycat:createDatasource{"name":"dw0","url":"jdbc:mysql://192.168.245.132:3306","user":"root","password":"Root_123"} */
#第二个读库
/*+ mycat:createDatasource{"name":"dr0","url":"jdbc:mysql://192.168.245.132:3306","user":"root","password":"Root_123"} */
#第二个写库
/*+ mycat:createDatasource{"name":"dw1","url":"jdbc:mysql://192.168.245.136:3306","user":"root","password":"Root_123"} */
#第二个读库
/*+ mycat:createDatasource{"name":"dr1","url":"jdbc:mysql://192.168.245.136:3306","user":"root","password":"Root_123"} */
显示所有数据源
/*+ mycat:showDataSources{} */;
二、配置分库分表集群
name: 建议以c
开头
masters: 主机数据源名称
replicas: 从机数据源名称
#配置第一组集群
/*! mycat:createCluster{"name": "c0", "masters": ["dw0"], "replicas": ["dr0"]}*/;
#配置第二组集群
/*! mycat:createCluster{"name": "c1", "masters": ["dw1"], "replicas": ["dr1"]}*/;
# 显示所有集群
/*+ mycat:showClusters{} */;
创建、使用数据库
CREATE DATABASE mycat_test;
use mycat_test;
分库分页方法
一、分片表配置
CREATE TABLE orders(
id BIGINT NOT NULL,
order_type INT,
customer_id INT,
amount DECIMAL(10, 2),
PRIMARY KEY(id)
) ENGINE = INNODB DEFAULT CHARSET = utf8
dbpartition BY mod_hash(id )tbpartition BY mod_hash( id )tbpartitions 1 dbpartitions 2;
dbpartition BY mod_hash(id) 这部分是在说数据库级别的分区。“dbpartition”
意思是对数据库进行分区。“mod_hash (id)” 是分区的方式,它会根据 “id” 这个字段的值来做分区。
“mod_hash” 是一种哈希算法,叫取模哈希。就好像有一个公式,把 “id” 的值放进去算一下,得到一个结果。根据这个结果把数据分散存到不同的数据库分区里,这样做可以让数据分布得更均匀,就像把很多东西分别放在不同的盒子里,而不是都堆在一个盒子里,方便以后查找和管理。
tbpartition BY mod_hash(id) 这是关于表级别的分区。“tbpartition” 表示对表进行分区。同样是用
“id” 字段,通过 “mod_hash”
这种算法来分区。这就好比在每个盒子(数据库分区)里,再把东西用小隔板(表分区)分开,也是为了让数据分布得更合理,让查询数据的时候能更快地定位到需要的数据在哪里。
tbpartitions 1 dbpartitions 2 “tbpartitions 1” 是说表分区的数量是 1个。修改这个值来增加表分区数量。
“dbpartitions 2”表示数据库分区的数量是 2 个,就是说数据会被分成两部分存到两个不同的数据库分区里面。
插入数据
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(1,101,100,100100.00);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300.00);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000.00);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000.00);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400.00);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020.00);
主机会多出一个mycat_test_0表 从机会多出mycat_test_1表
mycat_test_0表 内容
mycat_test_1表 内容
通过Mycat 查询 得出完整数据
二、全局表(广播表)通过 BROADCAST
创建
CREATE TABLE orders(
id BIGINT NOT NULL,
order_type INT,
customer_id INT,
amount DECIMAL(10, 2),
PRIMARY KEY(id)
) ENGINE = INNODB DEFAULT CHARSET = utf8 BROADCAST
插入数据
INSERT INTO broadcast_test (id,name) VALUES (1,'a');
INSERT INTO broadcast_test (id,name) VALUES (2,'b');
INSERT INTO broadcast_test (id,name) VALUES (3,'c');
INSERT INTO broadcast_test (id,name) VALUES (4,'d');
会发现两张表的内容相同
关联表(ER表)分片规则一样mod_hash
关联表也成为绑定表或者ER表。表示数据逻辑上有关联性的两个或多个表,例如订单和订单详情表。对于关联表,通常希望他们能够有相同的分片规则,这样在进 行关联查询时,能够快速定位到同一个数据分片中。
在一
的order表基础上创建order_detail表 分片规则一样
mycat2 分片规则
CREATE TABLE orders_detail(
`id` BIGINT NOT NULL,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8
dbpartition BY mod_hash(order_id )tbpartition BY mod_hash( order_id )tbpartitions 1;
查看er表
/*+ mycat:showERGroup{} */
插入数据
INSERT INTO mycat_test.orders_detail(id,detail,order_id) VALUES(1,'detail1',1);
INSERT INTO mycat_test.orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
INSERT INTO mycat_test.orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
INSERT INTO mycat_test.orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
INSERT INTO mycat_test.orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
INSERT INTO mycat_test.orders_detail(id,detail,order_id) VALUES(6,'detail1',6);
查询数据
SELECT * FROM orders o INNER JOIN orders_detail od on o.id = od.order_id;
结果