mycat-概述

版权声明:如有需要转载,请声明出处 https://blog.csdn.net/hehuang139/article/details/84778861

特性

能做什么不能做什么?

  • 语法支持
    • 不支持DUAL虚拟表
      • mycat会认为是一个实际表
    • 函数/存储过程支持程度
      • 内置函数支持
      • 自定义函数支持有限,不建议使用
        • 结论尽量不要使用,和实际结果差异比较大,需要考虑很多场景才能使用正确
        • 执行效果说明
          • 函数内部定义的sql只会本数据节点中执行,不会经过数据库中间件进行路由
            • 对于count这种语句,执行出来的结果必定是错误的
          • 如果使用select self_func();可以执行,但是从执行的效果上看是随机分配到一个数据分片上执行,是错误的
          • select self_func() from single_table 这种是可以使用,只要函数存在单片表所在的数据库中
          • select self_func() from sharding_table 这种情况
            • 如果函数都存在执行不会有问题,只是执行不会问题,但是执行的结果,要看具体的函数执行的结果
            • 如果函数没有都存在,则执行会报错
    • join支持
      • 全局表
        • 数据同步
          • 对全局表的操作,会到具体的数据节点上执行
          • 单独对单一库操作不会同步到其他库,但是如果每个库都有数据会在全局表查询中也会体现,否则不体现
        • 支持分片表join 最后会合并结果集
        • 支持单库表join
      • 分片表
        • 指定一个冗余的、相同的分片键
          • 这样rule规则只需要一个,否则每个表都需要配置一个rule规则
            • rule需要指定column,sharding_id相同,就能保证数据落到相同分片上
        • 分片键设置方式
          • 通过业务代码自己指定分片键,业务代码需要注意分片键设置
          • 通过平台自动设置 不建议,因为如果分片策略有很多中的情况,不是很好设置
        • 支持分片表join 但必须在相同分片策略,关联查询可以正常查询,从结果上看是做了结果集的合并
        • 不支持笛卡尔积
          • 不会做跨库笛卡尔积
          • 各自笛卡尔然后合并
        • 不支持单片表join,只会查询到部分数据,所以查询需要
      • e-r关系表
        • 目前看不太需要e-r分片表
        • 只需要一般的分片表即可
        • 优点,只需要设置主表的分片键,而对应子表的分片键只需要通过关联关系来配置
      • 拆分策略
        • in的方式还是?
    • 存储过程支持
    • 聚合运算
    • insert into … select 支持有限,不建议使用
      • 部分支持,通过hint,但是支持select的结果都在一个分片内
      • /!mycat: sql=select * from test where test_id = 2/insert into test select * from test_temp ;
      • 同时要求了解分片的原则
  • 全局索引
  • 分库分表
  • 注释
    • 解决不支持的sql如insert into …select
    • 存储过程调用
    • 同一个实例内的跨库关联查询,如用户库和平台库内的表关联
  • 分布式事务
  • 不支持语法
    • 复杂子查询 不建议使用,建议拆分sql
    • 跨库join
      • 分片表笛卡尔积
      • 单片表和分片表
      • 不同分片的分片表关联查询
      • 不同分片单片表
    • 自定义函数 部分支持,不建议使用,只有部分场景支持
    • 不支持from dual
    • insert
      • insert into …select 部分支持,不建议使用
      • 分片表必须insert字段中包含分片键
      • 多行插入 insert into tab_a(c1,c2) values(v1,v2),(v11,v21)… ##针对的是ER分表的从表无法批量插入
    • update
      • 不能更新分片字段,只能删除后新增
      • 多表更新,一般用不到

最佳实践

  • 分片策略
    • 大表分片
      • 数据量操作2000w为准
      • 管理紧密的表需要一起分片,即使数据不大
        • 这个联系讲的是业务层面的联系
      • 多个关联
        • 通过一个外部的sharding_id
        • 手动设置sharding_id
    • 单片表
      • 小表不分片,且和分片表关联不大,且不符合全局表场景
        • 关系指业务层面的关系
    • 全局表
      • 变化不大的配置表,
      • 常规意义上的配置表规格表,如区域,主数据之类
    • e-r表
      • 目前看并没有实际使用的意义
      • 如果要用就是可以以配置替换分片策略
  • 数据库创建
    • 物理数据库
      • schema也携带上分片信息和dn一致
    • dataHost
      • 数据库名使用ip和端口命名
        • dh_ip_port
    • dataNode
      • 表达物理概念
        • dn_ip_port_schema
      • 表达中心概念 推荐
        • center01

方案

  • 使用er表还是分片表?

运维监控

部署集成

  • 数据扩容方案
    • 分片算法
      • 一致性hash
        • 有现成的数据迁移方案
          • io.mycat.util.rehasher.RehashLauncher
      • 无序迁移方案

未完待续…

猜你喜欢

转载自blog.csdn.net/hehuang139/article/details/84778861