Mycat

分布式数据库

  • 透明性:不用关心逻辑分区和物理位置分布细节;
  • 数据冗余性:通过冗余实现系统的可靠性、可用性。多节点存储数据副本,在某一节点损坏时,通过心跳机制,节点自动切换,保证系统可用。热点数据就近分布,减少网络损耗加快访问速度、提升性能;
  • 易于扩展性:分布式数据库可以进行水平或者垂直进行扩展提高性能;
  • 自治性:本节点上的数据由本地的DBMS管理;

分布式数据库实现原理

分布式数据库的目录管理

存放系统元数据以数据库元数据的全部信息,保证数据被有效、正确地访问

  • 全局目录
  • 分布式目录
  • 全局与本地混合目录

数据分片

将一台数据库的压力分散到多台主机上,多台设备存取,提高性能、提高系统整体的可用性

  • 水平切分:按照某个字段的某种规则将数据分散到多个节点库中
  • 垂直切分:数据库由多表构成,每个表对应不同的业务,按照业务讲标分散不同的节点上。但是当表的数据量达到一定程度后,扩展较难
  • 混合切分:将上述两者综合使用

分布式查询处理

将查询解析到各个数据节点,然后将结果汇总

分布式并发控制

并发控制保证分布式数据中的多个事务并发高效、正确的执行。并发控制保证事务的可串行性

  • 加锁并发控制:容易死锁
  • 时间戳控制:需要有全局的统一时钟,消除死锁,一旦发生冲突变回重启而不是等待
  • 乐观并发控制:对于冲突较少的系统比较适合

Mycat架构、核心功能

Mycat架构

mycat架构图
mycat架构图

Mycat核心功能

mycat核心功能
mycat核心功能

Mycat核心概念

逻辑库

中间件被当做一个或多个数据库集群构成的逻辑库

逻辑表

  • 分片表:将数据量很大的表切分到多个数据库实例中,例如将 mytable 配置到 dn1 和dn2 两个节点上
    1
    <table name="mytable" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="myRule" />
  • 非分片表:根据业务量,对于不需要分片的表可以只配置到一个节点上
    1
    <table name="mytable" primaryKey="id" autoIncrement="true" dataNode="dn1" />
  • ER表:基于实体关系模型,子表的记录与其所关联的父表记录放在同一个数据分片上,保证关联查询不会跨分片
  • 全局表:业务表规模较大分片后,业务表和附属字典表之间的关联查询比较麻烦,通过冗余数据解决这类关联查询,即所有分片都复制一份数据,这个冗余数据构成的表定义为全局表

分片节点

分片表被分到不同的分片数据库上,每个表所在的分片数据库就是分片节点

节点主机

将数据分片后,同一台机器上有可能有多个分片节点,所在的主机就是节点主机。为了规避单节点主机并发数量限制,尽量将读写压力高的节点合理分放,避免单节点压力过高

配置方式

本地文件

  • schema.xml:mycat 的逻辑库、分片表、分片节点、分片节点主机信息配置
  • server.xml:系统参数配置文件,mycat 优化相关属性
  • rule.xml:分片规则配置文件
  • log4j2.xml:mycat 输出日志配置文件
  • sequence.properties:全局序列配置文件

Zookeeper 配置

  • zk-create.yaml:本地文件中的配置项都配置在此文件中