Mycat++ 分库分表扩展实践

2022-02-17 16:34:56 浏览数 (1)

代码语言:javascript复制
MyCat  
分库分表:以空间换取时间
1.通过查询mysql中的数据库表([1]),和 mycat中配置的schema([2]) 和 rule([3]) 信息,构建一个路由图
  并根据路由规则自动创建子表,mycat server 保存着分库分表的元数据信息,这些元数据信息
  可根据[1],[2],[3]进行重建;
  dataBase-hostNode 分配策略;数据库应该分配在哪台mysql服务器上;
  table-dataBase 分配策略;表应该分到哪个database里。
  分配算法:顺序分配,随机分配,hash分配,负载最小优先分配等

2.路由图:
  涉及概念表:全局表,er关系表(保持相同)
  全局表:在所有服务器都存在
  关系表:根据shema的配置信息,构建一个依赖图,将数据冗余的放入到对应的数据库中
  A-->B-->C
  A-->D-->C
  A-->F-->D

3.reverse rule  
  在服务启动后,根据每次查询后的结果进行构建
  根据schema table中的配置,配置逻辑索引,构建倒排路由表,根据查询中的非路由列的值,查询倒排路由表,
  查找最终路由到的物理表。
  key为字符串时,倒排表中的key使用radix tree 构建,减少内存空间
  key为数值型,为每个分片表的索引列构建一个bitmap,用于快速判断数据是否在该分片中
  
4.mycatMonitor
  在每台mysql服务器上安装 mycatMonitor,设置配置中心的地址,该进程用于搜索本地的mysql服务,并汇报到配置中心,
  汇报信息:地址,端口,主从标识,数据库,数据库中的表。
  mycatServer 在监听到配置中心的信息后,构建内部数据,dataHost-物理机地址,对于表应该落在那个dataNode中,
  是根据monitor汇报的信息,反向构建的。
        schema 配置的是实际的数据库名
       <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
           配置该数据库下要代理的表
      <table name="travelrecord,address" rule="auto-sharding-long" splitTableNames ="true"/>
       </schema>
        根据monitor汇报的 地址,端口,数据库,表,就可以知道该表应该落在哪几个节点上。
  需要扩容时,安装mysql数据库,定义数据库名,mycat自动创建对应的表。
  (后期加入docker,自动安装配置mysql服务器,自动扩容)

0 人点赞