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