mycat进阶
2021-11-13 22:43:16 13 举报
AI智能生成
笔记
作者其他创作
大纲/内容
分库分表原理
1、前端连接接收 MySQL 命令
2、解析 MySQL,Mycat 用的是 Druid 的 DruidParser
3、获取路由
4、改写 MySQL,例如两个条件在两个节点上,则变成两条单独的 SQL
例如 select * from travelrecord where id in(5000001, 10000001);改写成:
select * from travelrecord where id = 5000001;(dn2 执行)
select * from travelrecord where id = 10000001;(dn3 执行)
又比如多表关联查询,先到各个分片上去获取结果,然后在内存中计算
5、与后端数据库建立连接
6、发送 SQL 语句到 MySQL 执行
7、获取返回结果
8、处理返回结果,例如排序、计算等等
9、返回给客户端
2、解析 MySQL,Mycat 用的是 Druid 的 DruidParser
3、获取路由
4、改写 MySQL,例如两个条件在两个节点上,则变成两条单独的 SQL
例如 select * from travelrecord where id in(5000001, 10000001);改写成:
select * from travelrecord where id = 5000001;(dn2 执行)
select * from travelrecord where id = 10000001;(dn3 执行)
又比如多表关联查询,先到各个分片上去获取结果,然后在内存中计算
5、与后端数据库建立连接
6、发送 SQL 语句到 MySQL 执行
7、获取返回结果
8、处理返回结果,例如排序、计算等等
9、返回给客户端
分片策略
连续分片
范围分片
容易出现冷热数据
按自然月分片
<tableRule name="qs-sharding-by-month">
<rule>
<columns>create_time</columns>
<algorithm>qs-partbymonth</algorithm>
</rule>
</tableRule>
<rule>
<columns>create_time</columns>
<algorithm>qs-partbymonth</algorithm>
</rule>
</tableRule>
离散分片
十进制取模分片
分布均匀,迁移工作量大
枚举分片
适用于枚举值固定的场景
一致性hash分片
固定hash分片
取模范围分片
范围取模分片
应用指定分片 PartitionDirectBySubString
日期范围哈希 PartitionByRangeDateHash
冷热数据分片 PartitionByHotDate
日期范围哈希 PartitionByRangeDateHash
冷热数据分片 PartitionByHotDate
mysql主从复制原理
1、主库开启 binlog,设置 server-id
2、在主库创建具有复制权限的用户,允许从库连接
3、从库/etc/my.cnf 配置,重启数据库
mycat注解
/*!mycat: sql=注解 SQL 语句*/ 跨库关联查询;已经使用了分片规则的字段,不能作为跨库关联的key,
ShareJoin原理
经过循环debug,和对比日志(此处省略一万字),确认了ShareJoin的实现原理:
假如左表 A 与右表 B 通过 joinKey关联。
select a.valA, b. valB from tbl_A a, tbl_B b where a. joinKeyA = b. joinKeyB
先在所有节点(如{ dn1,dn2,dn3 })上查出A表所有的joinKeyA值,比如{1,9}。
select a.valA, joinKeyA from order_info
然后基于joinKey值的集合,在B表中查询所有数据
select b.valB, b.joinKeyB From tbl_B where joinKeyB in {1,9}
得到结果以后,再做匹配汇总。
经过循环debug,和对比日志(此处省略一万字),确认了ShareJoin的实现原理:
假如左表 A 与右表 B 通过 joinKey关联。
select a.valA, b. valB from tbl_A a, tbl_B b where a. joinKeyA = b. joinKeyB
先在所有节点(如{ dn1,dn2,dn3 })上查出A表所有的joinKeyA值,比如{1,9}。
select a.valA, joinKeyA from order_info
然后基于joinKey值的集合,在B表中查询所有数据
select b.valB, b.joinKeyB From tbl_B where joinKeyB in {1,9}
得到结果以后,再做匹配汇总。
DDL 或存储过程
-- 表
/*!mycat: sql=select * from customer where id =1 */ CREATE TABLE test2(id INT);
-- 存储过程
/*!mycat: sql=select * from customer where id =1 */ CREATE PROCEDURE test_proc() BEGIN END ;
/*!mycat: sql=select * from customer where id =1 */ CREATE TABLE test2(id INT);
-- 存储过程
/*!mycat: sql=select * from customer where id =1 */ CREATE PROCEDURE test_proc() BEGIN END ;
读写分离
/*balance*/ select a.* from customer a where a.id=6666;
读写分离数据库选择
/*!mycat: db_type=master */ select * from customer;
/*!mycat: db_type=slave */ select * from customer;
/*#mycat: db_type=master */ select * from customer;
/*#mycat: db_type=slave */ select * from customer;
/*!mycat: db_type=slave */ select * from customer;
/*#mycat: db_type=master */ select * from customer;
/*#mycat: db_type=slave */ select * from customer;
注解原理
Mycat 在执行 SQL 之前会先解析 SQL 语句,在获得分片信息后再到对应的物理节
点上执行。如果 SQL 语句无法解析,则不能被执行。如果语句中有注解,则会先解析注
解的内容获得分片信息,再把真正需要执行的 SQL 语句发送到对应的物理节点上。
所以我们在使用注解的时候,应该清楚地知道目标 SQL 应该在哪个节点上执行,注
解的 SQL 也指向这个分片,这样才能使用。如果注解没有使用正确的条件,会导致原始
SQL 被发送到所有的节点上执行,造成数据错误
点上执行。如果 SQL 语句无法解析,则不能被执行。如果语句中有注解,则会先解析注
解的内容获得分片信息,再把真正需要执行的 SQL 语句发送到对应的物理节点上。
所以我们在使用注解的时候,应该清楚地知道目标 SQL 应该在哪个节点上执行,注
解的 SQL 也指向这个分片,这样才能使用。如果注解没有使用正确的条件,会导致原始
SQL 被发送到所有的节点上执行,造成数据错误
0 条评论
下一页