Mycat
分布式数据库
- 透明性:不用关心逻辑分区和物理位置分布细节;
- 数据冗余性:通过冗余实现系统的可靠性、可用性。多节点存储数据副本,在某一节点损坏时,通过心跳机制,节点自动切换,保证系统可用。热点数据就近分布,减少网络损耗加快访问速度、提升性能;
- 易于扩展性:分布式数据库可以进行水平或者垂直进行扩展提高性能;
- 自治性:本节点上的数据由本地的DBMS管理;
分布式数据库实现原理
分布式数据库的目录管理
存放系统元数据以数据库元数据的全部信息,保证数据被有效、正确地访问
- 全局目录
- 分布式目录
- 全局与本地混合目录
数据分片
将一台数据库的压力分散到多台主机上,多台设备存取,提高性能、提高系统整体的可用性
- 水平切分:按照某个字段的某种规则将数据分散到多个节点库中
- 垂直切分:数据库由多表构成,每个表对应不同的业务,按照业务讲标分散不同的节点上。但是当表的数据量达到一定程度后,扩展较难
- 混合切分:将上述两者综合使用
分布式查询处理
将查询解析到各个数据节点,然后将结果汇总
分布式并发控制
并发控制保证分布式数据中的多个事务并发高效、正确的执行。并发控制保证事务的可串行性
- 加锁并发控制:容易死锁
- 时间戳控制:需要有全局的统一时钟,消除死锁,一旦发生冲突变回重启而不是等待
- 乐观并发控制:对于冲突较少的系统比较适合
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:本地文件中的配置项都配置在此文件中