Mycat简单学习
简介
Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统。
mycat是一个数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,即数据库感受不到mycat的存在,认为是直接连接的mysql数据库(实际上是连接的mycat,mycat实现了mysql的原生协议)
总结:MyCat是目前最流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。
mycat的三大功能:分表,读写分离,主从切换
使用Mycat之后的架构图
使用Mycat之后的优势
数据量级
单一的Mysql数据存储量和操作量级有限,Mycat可以管理若干Mysql数据库,可以实现数据库的存储和操作。
开源性质
Mycat是Java编写的中间件,开源,免费,有非常多的人和组织对Mycat实行开发、维护、管理、更新。Mycat是阿里原应用corba转型而来的。
Mycat中的概念
一、切分
逻辑上的切分,在物理层面使用多库,多表实现切分。
1.1 纵向切分/垂直切分
就是把原来存储在一个库中的数据存储在多个库上,由于数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的问题。例如:我们会建立定义数据库workDB、商品数据库payDB,用户数据库userDB、日志数据库logDB等。
优点:
- 减少增量数据写入时的锁对查询的影响。
- 由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,是的单表单次查询所需检索的行数表少,减少了磁盘IO、时延变短。
缺点:
- 无法解决但表数据量太大的问题。
1.2 横向切分/水平切分
把原本存储于一个表的数据分块存储到多个表上。
当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表上。
例如:我们userDB中的userTable中数据量很大,那么可以把userDB切分为结构相同的多个userDB,以此类推,然后将这些表按照一定的规则存储到多个userDB上
优点:
- 单表的并发能力提高了,磁盘的I/O性能也提高了
- 如果出现高并发的话,总表可以根据不同的查询,将并发压力发到不同的小表里。
缺点:
- 无法实现表连接查询
二、逻辑库-Schema
Mycat中定义的database是逻辑上存在的,但是物理上是不存在的。主要是针对纵向切分提供的概念。
三、逻辑表-Table
Mycat中定义的table逻辑上存在,物理上不存在的,主要是针对横向切分提供的概念。
四、默认端口
- mysql:3306
- mycat:8066
- Tomcat:8080
- Oracle:1521
- nginx:80
- http:协议默认端口80
- redis:6379
五、数据主机-DataHost
物理Mysql存放的主机地址,可以使用主机名,IP,域名定义。
六、数据节点-DataNode
配置物理的database。数据保存的物理节点就是database
七、分片规则
当控制数据库的时候,如何访问database和table,就是访问dataHost和dataNode的算法。在Mysql处理CRUD时,如何访问datahost和datanode的算法?如:哈希算法,crc32算法等。
Mycat的使用
1.读写分离
原理:需要搭建主从模式,让主数据库处理增、删、改,而从数据库处理查操作。Mycat配合数据库本身的复制功能,可以解决读写分离的问题。
2.主从备份概念
主从备份:就是一种主备模式的数据库应用,主库(master)数据与备库(slave)数据完全一致,实现诗句的多重备份,保证数据的安全。可以在Master[InnoDB]和Slave[MyISAM]中使用不同的数据库引擎,实现读写分离。
主从备份目的:
- 实现主备模式,保证数据安全,尽量避免数据丢失
- 实现读写分离,使用不同的数据库引擎,实现读写分离,提高所有的操作效率。
Mycat配置文件
Mycat是代理,Mycat后面是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是mycat。
Mycat的配置文件在conf目录下面,这里介绍几个常用的配置文件
文件 | 说明 |
---|---|
server.xml | Mycat的配置文件,设置账号,参数等 |
shema.xml | Mycat对用的物理数据库和数据库表设置 |
rule.xml | Mycat分片(分库分表)规则 |
server.xml
1 | <property name="serverPort">8066</property> <!-- Mycat 服务端口号 --> |
配置Mycat服务信息
如:Mycat中的用户,用户可以访问的逻辑库,可以访问的逻辑表,服务的端口号等:
schema.xml
最重要的配置文件,首先看默认的配置文件
1 |
|
用于定义逻辑库和逻辑表的配置文件,在配置文件中可以定义读写分离,逻辑库,逻辑表,dataHost,dataNode等信息:
节点与属性介绍:
标签schema:配置逻辑库标签
- 属性name:逻辑库名称
- 属性checkSQLschema:是否检查sql语法中的schema信息
- 属性sqlMaxLimit:Mycat在执行SQL的时候,如果SQL语句中没有limit字句,自动增加limit子句,避免一次性得到过多的数据,影响效率。limit子句的限制数量默认配置为100.如果SQL中有具体的limit子句,当前属性失效。
标签table:定义逻辑表的标签
- 属性name;逻辑表名
- 属性dataNode:数据节点名称,即物理数据库中的database名称,多个名名称使用逗号分割
- 属性rule:分片规则名称,具体的分片规则名称参考rule.xml配置文件
标签dataNode:定义数据节点的标签
- 属性name:数据节点名称,是定义的逻辑名称,对于具体的物理数据库database
- 属性dataHost:引用dataHost标签的name值,代表使用的物理数据所在位置和配置信息
- 属性database:在dataHost物理机中,具体的物理数据库database名称
dataHost标签:定义数据主机的标签
- 属性name:定义逻辑上的数据主机名称
- 属性maxCon/minCon:最大连接数和最小连接数
- 属性dbType:数据库类型:mysql数据库
- 属性dbDriver:数据库驱动类型,native,使用mycat提供的本地驱动
dataHost子标签writeHost:写数据的数据库定义标签,实现读写分离操作
- 属性host:数据库命名
- 属性url:数据库访问路径
- 属性user:数据库访问用户名
- 属性password:数据库访问密码
rule.xml
用于定义分片规则的配置文件
mycat默认分片规则:以500万为单位,实现分片规则