基于 MyCat 分布式数据库解决方案的学汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MyCat 分布式数据库解决方案的学汇总
最近公司推荐了mycat分布式中间件解决数据库分布式方案,今天到mycat官网学了一翻
(),汇总下几个重点:
1、mycat是什么?
mycat是一个开源的分布式数据库系统,是一个实现了MySQL 协议的Server,前端用户可以把它看作是一个数据库代理,用MySQL 客户端工具和命令进行访问,后端可以用MySQL 原生(Native)协议访问数据库(不限于MYSQL数据库), 其核心功能是分表分库,即将一个多表水平分割为N 个小表,存储在后端的数据库中。
以下是几种通俗的方式介绍MYCAT:
1)对于DBA 来讲:
Mycat 就是MySQL Server,而Mycat 后面连接的MySQL Server,就好象是MySQL 的存储引擎,如InnoDB,MyISAM 等,因此,Mycat 本身并不存储数据,数据是在后端的MySQL 上存储的,因此数据可靠性以及事务等都是MySQL 保证的,简单的说,Mycat 就是MySQL 最佳伴侣,它在一定程度上让MySQL 拥有了能跟Oracle PK 的能力。
2)对于开发来讲:
Mycat 就是一个近似等于MySQL 的数据库服务器,你可以用连接MySQL 的方式去连接Mycat(除了端口不同,默认的Mycat 端口是8066 而非MySQL 的3306,因此需要在连接字符串上增加端口信息),大多数情况下,可以用你熟悉的对象映射框架使用Mycat,但建议对于分片表,尽量使用基础的SQL 语句,因为返样能达到最佳性能,特别是几千万甚至几百亿条记录的情况下。
3)对于架构师来讲:
Mycat 是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的Mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据返些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。
2)双活部署
mycat、zk均采用双中心部署
3、常见的数据库切分优化方案
传统数据库存在着先天性的弊端,但是NoSQL 数据库又无法将其替今,NoSQL 只能作为传统数据的补充而不能将其
替今,数据库性能优化除了在应用层对数据检索方面的调优,在架构方面主要对数据库进行切分,接下来主要从数据库切分的两个方面进行介绍:
1)垂直切分:
如果应用系统各业务或服务之间的耦合度低,相互影响小,可以接不同的模块分解,将数据库切分到不同的数据库。
2)水平切分:
上面垂直切分,当某个业务量很大时仍然会有性能问题,比如某个表的数据量过大,这时需要进行水平切分,将大表切分为多个子表。各个子表之间根据预先设置的分布规则,再通过数据库查询JOIN在一起。
水平分片常见的规则有:
用户ID
日期
其它特定的字段
有了数据分布,现在要解决的问题是如何让应用更加透明的
访问分片的数据,目前主要有两种思路:
1)客户端模式:在每个应用程序模块中配置管理自己需要
的一个或多个数据源,直接访问各个数据库,在模块内完成数据的整合;
2)通过中间代理层来统一管理数据源,后端数据库集群对
前端应用程序透明;
mycat提供了模式2的解决方案。
不过,因为分片需要注意以下几件事:
能不切分尽量不切分
如果要切分要选择合适的规则
数据切分尽量通过数据冗余或表分组来降低跨库JOIN的可能
4、mycat的几个主要组成概念
MyCAT使用MySQL的通讯协议模拟成一个MySQL服务器,并建立了完整的Schema(数据库)、Table (数据表)、User (用户)的逻辑模型,并将这套逻辑模型映射到后端的存储节点DataNode(MySQL Instance)上的真实物理库中,这样一来,所有能使用MySQL的客户端以及编程语言都能将MyCAT当成是MySQLServer来使用,不必开发新的客户端协议。
当MyCAT收到一个客户端发送的SQL请求时,会先对SQL 进行语法分析和检查,分析的结果用于SQL路由,SQL路
由策略支持传统的基于表格的分片字段方式进行分片,也支持独有的基于数据库E-R关系的分片策略,对于路由到多个数据节点(DataNode)的SQL,则会对收到的数据集进行“归并”然后输出到客户端。
SQL执行的过程,简单的说,就是把SQL通过网络协议发送给后端的真正的数据库上进行执行,对于MySQL Server 来说,是通过MySQL网络协议发送报文,并解析返回的结果,若SQL不涉及到多个分片节点,则直接返回结果,写入客户端的SOCKET流中,这个过程是非阻塞模式(NIO)。DataNode是MyCAT的逻辑数据节点,映射到后端的某一个物理数据库的一个Database,为了做到系统高可用,每个DataNode可以配置多个引用地址(DataSource),当主DataSource被检测为不可用时,系统会自动切换到下一个可用的DataSource上,这里的DataSource即可认为是Mysql的主从服务器的地址。
在介绍mycat的主要组成部份时,先了解一下MYCAT的原理:
MyCat技术原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
1)数据库中间件
数据被分到多个分片数据库后,应用如果需要读取数据,需要多个数据源的数据,如果没有数据库中间件,那么应用需要花大量的工作去处理分片后的数据访问问题,所以mycat 首先是一个数据库中间件,对于数据库能用的事务、数据处理由中间件处理。
数据库中间件的方式,使底层分布式数据对于上层应用而言是透明的,相当一个逻辑数据库。
2)逻辑表
上面提到MYCAT是一个逻辑库,那上面的表即是逻辑表,具体包括:
分片表:一个表被切分多个表部署在多个为上;
非分片表:不需要分片的表
ER表:父子关联的表,为了保证效率,数据上有关联的表需要放在一个库上,减少跨库访问
全局表:变动不频繁、能用的配置、参数类型的表
3)分片节点: