分布式数据库架构及企业实践——基于Mycat中间件(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-18 07:20:45

点击下载

作者:周继锋

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

分布式数据库架构及企业实践——基于Mycat中间件

分布式数据库架构及企业实践——基于Mycat中间件试读:

前言

随着移动互联网的兴起和大数据的蓬勃发展,系统的数据量正呈几何倍数增长,系统的压力也越来越大,这时最容易出现的问题就是服务器繁忙,我们可以通过增加服务器及改造系统来缓解压力,然后采用负载均衡、动静分离、缓存系统来提高系统的吞吐量。然而,当数据量的增长达到一定程度的时候,增加应用服务器并不能明显地提高系统的效率,因为所有压力都会传导到数据库层面,而大多数系统都是用一个数据库来存储和管理系统数据的。这时,Mycat应运而生。

谈到Mycat就不得不谈谈Cobar,Cobar是阿里巴巴开源的数据库中间件,由于其存在使用限制及一些比较严重的问题,Leader-us在其基础上于2013年年底实现了Mycat 1.0版本,Mycat一经发布便引起了很多人的关注。之后Mycat社区对Cobar的代码进行了彻底重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合、Join等基本特性,同时兼容了绝大多数数据库,使之成为通用的数据库中间件。Mycat在1.4版本以后完全脱离了Cobar内核,同时采用了Mycat集群管理、自动扩容及智能优化,成为了高性能的数据库中间件。Mycat从诞生至今已有三年多了,一直在坚持做最好的开源数据库中间件产品。

本书总计8章,涵盖了Mycat入门、进阶、高级技术实战、企业运维、架构剖析、核心技术分析、多数据库支持原理与实现等内容,内容详尽、图文并茂,几乎囊括了Mycat所涉及的方方面面,无论是对于软件工程师、测试工程师、运维工程师、软件架构师、技术经理,还是对于资深IT人士来说,本书都极具参考价值。

第1章:介绍了分布式系统和分布式数据库系统的原理,介绍Mycat的起源和发展状况,并对各种数据库中间件做了简要介绍和对比。

第2章:讲解了Mycat的入门知识,介绍了Mycat的安装环境、核心概念和分库分表的原理,以及Mycat源码开发调试的过程。

第3章:讲解了Mycat的进阶知识,主要介绍Mycat的各种配置和分片算法。

第4章:讲解了Mycat和MySQL实战案例,由拥有丰富的Mycat线上实战经验的专家和DBA共同编写而成,有很高的参考价值。

第5章:简要介绍了用于Mycat性能监控的工具—Mycat-web,详细讲解了Mycat和MySQL的优化技术,是DBA的亲身总结和经验之谈。

第6章:重点阐述了Mycat的架构,包括网络、线程、连接池、内存管理及缓存实现等,是了解Mycat框架的基础。

第7章:介绍了Mycat的核心技术,包括分布式事务的实现、跨库Join的三种实现方式等,介绍了多节点数据汇聚和排序的原理,并详细阐述了在Mycat 1.6版本中实现的一致性分布式事务的功能。

第8章:介绍了MySQL和PostgreSQL的通信协议及Mycat对这些通信协议的实现,然后介绍了Mycat对JDBC及多种数据库的支持,例如Oracle、SQL Server、MongoDB等。

本书的编写和校对历经一年,参与编写的作者都是Mycat开源项目中参与度比较高、提交过不少代码或有丰富的实战经验的资深人士。非常感谢参与本书编写、指导或校对的专家:Leader-us、南哥(曹宗南)、从零开始(宋伟)、小张哥(张超)、yuanfang(杨鹏飞)、顽石神(张治春)、冰麒麟(杨峰)、望舒(胡雅辉)、明明Ben(朱阿明)、零(章爱国)、little-pan(潘自朋)、CrazyPig(陈建欣)、毛茸茸的逻辑(王成瑞)、海王星(林志强)、石头狮子(林晁)、HanSenJ(姬文刚)、武(王灯武)、战狼(刘胡波)、KK(刘军)、董海雄(易班网)、arx(李秋伟)、正能量(王金剑)、吉光(李伟)。

由于作者的写作水平有限,书中难免会有不妥或者疏漏之处,欢迎读者批评指正。冰风影Mycat社区负责人2016年11月6日于广州番禺第1章数据库中间件与分布式数据库的实现从第一台计算机产生至今的半个多世纪里,计算机已经深入人们的生活,在各个领域得到广泛应用,并不断地改变人们的生活方式。从电子管到晶体管,从集成电路到超大规模集成电路,从单个 CPU、存储器、外设和一些终端在内的集中式计算到大量CPU通过高速网络连接组成的并行计算,计算机的发展有着惊人的进步。1.1什么是分布式系统

分布式系统是指其组件分布在网络上,组件之间通过传递消息进行通信和动作协调的系统。它的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。它的主要特点如下。

· 透明性:分布式系统对于用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统,可让用户不必了解其内部结构就能使用。

· 扩展性:分布式系统的最大特点是可扩展性,它能够根据需求的增加而扩展,可以通过横向扩展使集群的整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能(上升空间有限,使用不多)使服务器集群的性能得到提升。

· 可靠性:分布式系统不允许单点失效的问题存在,它的基本思想是,如果一台机器坏了,则其他机器能够接替它进行工作,具有持续服务的特性。

· 高性能:高性能是人们设计分布式系统的一个初衷,如果建立了一个透明、灵活、可靠的分布式系统,但是它运行起来像蜗牛一样慢,那么这个分布式系统是失败的。

分布式系统在拥有众多优点的同时自然有其缺点。

· 在节点通信部分的开销比较大,线程安全问题也变得复杂,需要在保证数据完整性的同时兼顾性能。

· 过分依赖网络,网络信息的丢失或饱和将会抵消分布式系统的大部分优势。

· 有潜在的数据安全和网络安全等安全性问题。

下面讲讲分布式系统与集中式系统的区别。首先,简单地讲,分布式系统采用并行计算,而集中式系统采用串行计算,这是二者本质上的区别;其次,分布式系统的性价比高,对于处理大规模数据而言,最节约成本的办法是在一个系统中使用集中在一起的大量的廉价CPU;然后,分布式系统的可靠性高,通过把负载分散到众多机器上,单个芯片发生故障时最多会使一台机器停止运行,而其他机器不会受到影响;另外,分布式系统比集中式系统的可扩展性强,可根据业务量的增长逐渐扩展系统的计算能力;最后,从性能上讲,分布式系统的计算能力比单个大型主机更强。1.2为什么需要分布式数据库

随着计算机和信息技术的迅猛发展和普及,行业应用系统的规模迅速扩大,行业应用所产生的数据量呈爆炸式增长,动辄达到数百TB甚至数百PB的规模,已远远超出现有的传统计算技术和信息系统的处理能力,而集中式数据库面对大规模数据处理逐渐表现出其局限性。因此,人们希望寻找一种能快速处理数据和及时响应用户的访问的方法,也希望对数据进行集中分析、管理和维护。这已成为现实世界的迫切需求。

分布式数据库是在集中式数据库的基础上发展起来的,是计算机技术和网络技术结合的产物。分布式数据库是指数据在物理上分布而在逻辑上集中管理的数据库系统。物理上分布是指分布式数据库的数据分布在物理位置不同并由网络连接的节点或站点上;逻辑上集中是指各数据库节点之间在逻辑上是一个整体,并由统一的数据库管理系统管理。不同的节点分布可以跨不同的机房、城市甚至国家。

分布式数据库的主要特点如下。

· 透明性:用户不必关心数据的逻辑分区和物理位置分布的细节,也不必关心重复副本(冗余数据)的一致性问题,同时不必关心在局部场地上数据库支持哪种数据模型。对于系统开发工程师而言,当数据从一个场地移到另一个场地时不必改写应用程序,使用起来如同一个集中式数据库。

· 数据冗余性:分布式数据库通过冗余实现系统的可靠性、可用性,并改善其性能。多个节点存储数据副本,当某一节点的数据遭到破坏时,冗余的副本可保证数据的完整性;当工作的节点受损害时,可通过心跳等机制进行切换,系统整体不被破坏。还可以通过热点数据的就近分布原则减少网络通信的消耗,加快访问速度,改善性能。

· 易于扩展性:在分布式数据库中能够方便地通过水平扩展提高系统的整体性能,也能够通过垂直扩展来提高性能,扩展并不需要修改系统程序。

· 自治性:各节点上的数据由本地的DBMS管理,具有自治处理能力,完成本场地的应用或局部应用。

分布式数据库还具有经济、性能优越、响应速度更快、灵活的体系结构、易于集成现有系统等特点。

分布式数据库尽管有着天生的高贵血统,但它依赖高速网络,对事务的处理远没有传统数据库成熟,在很长一段时间内分布式数据存储将与传统数据存储共存。若想打造一个高可用、高性能、易扩展、可伸缩且安全的分布式应用系统,则分布式数据库将是必不可少的选择。1.3分布式数据库的实现原理

通过 1.2 节我们已经知道,分布式数据库具有逻辑整体性、物理分布性,正是因为其物理分布性才使得分布式数据库的实现变得更加复杂,因为数据划分后存储在不同的节点上,而为了保证可靠性,需要存储多个副本,所以产生了数据复制的问题。为了保证良好的性能,分布式数据库必须易于扩展。具体来讲分布式数据库应有4个优势:数据分片及复制管理、具有事务的可靠性存取、良好的性能、易于扩展,所以分布式数据库在设计上需要实现分布式数据库的目录管理、数据分片、分布式查询处理、分布式并发控制、分布式锁管理、分布式存储、分布式网络架构、分布式安全管理等。

1.分布式数据库的目录管理

分布式数据库的目录存放着系统元数据及数据库的元数据的全部信息,这些数据的存在是为了正确、有效地访问数据。数据的增、删、改、查操作都需要用到目录,用户授权、安全管理及并发控制等也都需要用到目录,目录结构的合理性直接影响数据库的性能。目录一般包括各级模式的描述、访问方法的描述、关于数据库的统计数据和一致性信息等,系统根据这些信息将用户查询转换为物理数据库上的查询,选择一条最佳的存取路径进行事务管理及安全性、完整性检查等。

分布式数据库的目录可分为全局目录、分布式目录、全局与本地混合目录。

2.数据分片

当数据库过于庞大,尤其是写入过于频繁且很难由一台主机支撑时,我们还是会面临扩展瓶颈。我们将存放在同一个数据库实例中的数据分散存放到多个数据库实例(主机)上,进行多台设备存取以提高性能,在切分数据的同时可以提高系统整体的可用性。

数据分片是指将数据全局地划分为相关的逻辑片段,有水平切分、垂直切分、混合切分三种类型。

· 水平切分:按照某个字段的某种规则分散到多个节点库中,每个节点中包含一部分数据。可以将数据的水平切分简单理解为按照数据行进行切分,就是将表中的某些行切分到一个节点,将另外某些行切分到其他节点,从分布式的整体来看它们是一个整体的表。

· 垂直切分:一个数据库由很多表构成,每个表对应不同的业务,垂直切分是指按照业务将表进行分类并分布到不同的节点上。垂直拆分简单明了,拆分规则明确,应用程序模块清晰、明确、容易整合,但是某个表的数据量达到一定程度后扩展起来比较困难。

· 混合切分:为水平切分与垂直切分的结合。

3.分布式查询处理

分布式查询处理的任务就是把一个分布式数据库上的高层次查询映射为在本地数据库上的操作,查询的解析必须拆分为代数查询的关系运算序列,将要查询的数据定位到各节点,使得查询在各节点进行,最后通过网络通信的操作汇聚查询结果。

4.分布式并发控制

并发控制是分布式事务管理的基本任务之一,其目的是保证分布式数据库中的多个事务并发高效、正确地执行。并发控制用来保证事务的可串行性,也就是说事务的并发执行等价于它们按某种次序的串行执行,从而为用户提供并发的透明性。进行并发控制的方法主要有三种:加锁并发控制、时间戳控制、乐观并发控制。加锁并发控制应用广泛,但是容易发生死锁;时间戳控制消除了死锁,一旦发生冲突便会重启而不是等待,需要有全局的统一时钟;乐观并发控制对于冲突较少的系统较为适合,对于冲突多的系统则效率低下。

总体来看,实现分布式数据库不仅仅是如此简单的几个方面,在实际设计中还需要解决网络架构、分布式存储等问题。每个模块都可以作为一个课题去研究,本节仅是抛砖引玉。1.4Mycat数据库中间件简介

Mycat是一个彻底开源的面向企业应用开发的大数据库集群,支持事务、ACID,是可以替代MySQL的加强版数据库。Mycat被视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群,它是融合了内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server,是结合了传统数据库和新型分布式数据仓库的新一代的企业级数据库产品,也是一个优秀的数据库中间件。1.4.1 Mycat的历史与未来规划

Mycat的诞生,要从其前身Amoeba和Cobar说起。Mycat最初起源于Amoeba(变形虫)项目,这个项目致力于MySQL的分布式数据库前端代理层,主要在应用层访问MySQL时充当SQL路由功能。阿里巴巴在Amoeba的基础上开发出了Cobar,于2012年6月19日正式对外开源。Cobar自诞生之日起,就受到广大程序员的追捧,但是2013年后几乎没有更新,在生产环境的使用中也出现了许多Bug。

2013年,Cobar 在某大型项目的使用过程中被发现存在一些比较严重的问题,于是广大开源爱好者将其改良,Mycat 1.0由此而生。相比当时的Cobar,Mycat在I/O方面的重大改进就是后端由原来的BIO改成NIO,在后来的版本中又增加了AIO,并且通过配置可任选一种I/O。

2014年,Mycat开源社区首次在上海举行的“中华架构师”大会上对外宣讲,引起了业界的关注,随后越来越多的项目采用了Mycat。

2015年是Mycat发展壮大的一年,发生了许多令人兴奋并激动的事情。在这一年里,Mycat 1.3诞生,该版本是Mycat历史上非常重要的一个里程碑,需求、测试和功能开发等各项工作模式首次从以个人为主变为以开源团队为主,更多的人参与到需求、开发、测试及Bug修复活动中,已确定的Bug基本上会在24小时被内修复并有志愿者或用户确认修复。Mycat 1.3的性能与1.2版本相比提升巨大,功能更完备。同年10月,Mycat项目总共有16个Committer。同年11月,超过300个项目采用了Mycat,涵盖银行、电信、电子商务、物流、移动应用、O2O等众多领域和公司。同年12月,超过4000名用户加群、研究讨论、测试或使用Mycat。该年年底发布了1.4版本,其后完全脱离了基本的Cobar内核,结合Mycat集群管理、自动扩容、智能优化等成为高性能的中间件。

Mycat支持Oracle、PostgreSQL,从1.3版本开始支持NoSQL(SequoiaDB及MongoDB)并引入了Druid解析器。Druid完全开源,一方面可以降低SQL解析的入门门槛,使复杂的问题简单化;另一方面可以使解析性能得到很大的提高。Mycat在1.4版本中去掉了Fdbparser,只保留Druidparser方式。

2016年,Mycat发布了1.5版本,这是到目前为止比较稳定的版本。另外,在这一年里,Mycat的Committer发起了众筹,成立了维护团队,这标志着Mycat形成了一个正式组织。

目前,Mycat 1.6的Beta版本已经发布(正式版本预计2017年春节后发布),已有用户将其用于生产环境,暂时未发现重大Bug,但是在生产环境中还是建议使用Mycat 1.5版本。

Mycat 1.6正在开发的功能如下。(1)对子查询的支持。(2)数据一致性的增强:采用分布式事务或消息队列实现;全局表的一致性保证。(3)基于ZooKeeper协调的主从切换。(4)引入测试框架,可以配置用例和进行自动化测试。(5)新增自动迁移功能,实现不停机迁移时不丢数据。

Mycat 1.6对系统稳定性的开发任务如下。(1)解决全局自增ID列无法作为分片字段的问题。(2)解决分片表与对应分片规则的一致性检查问题。(3)解决DirectMemory的管理问题。(4)完善reload config,支持不丢事务。

目前,Mycat 2.0项目(https://github.com/MyCATApache/Mycat2.git)已经启动,核心代码已经提交。Mycat是一个全新的项目,全部重构,目的是打造真正的分布式数据库中间件。其架构设计如图1-1所示。图1-1

其核心功能如图1-2所示。图1-2

多中心支持如图1-3所示。图1-3

在Mycat 2.0的规划中将完全实现分布式事务,完全支持分布式;通过Mycat web(eye)完成可视化配置及智能监控、自动化运维;通过MySQL的本地节点Mycat Booster全面解决数据扩容问题,实现自动扩容机制;支持基于ZooKeeper的主从切换及Mycat集群化管理;通过用Mycat Balance替代第三方的HAProxy、LVS等,全面兼容Mycat集群节点的动态上下线;接入Spark等第三方工具,解决数据分析及大数据聚合的业务场景;通过Mycat智能优化、分析分片热点,提供合理的分片、索引及数据切分实时业务建议;另外Mycat的堆外内存模块正在开发中,预计在2.0版本之前投入使用。

如今Mycat的发展已经超越了Mycat-server本身,希望将来我们可以看到一个以Mycat为中心的开源社区,并且这个开源社区将吸收更多的优秀开源项目,坚持开源不动摇,成为中国版的Apache。1.4.2 Mycat与其他中间件的区别

目前的数据库中间件有很多,本节将介绍主流的中间件,并从各个维度将其与Mycat进行对比。

1.Mango

Mango的中文名是“芒果”,它是一个轻量级的极速数据层访问框架,目前已有十多个大型线上项目在使用它。据称,某一支付系统利用Mango承载了每秒12万的支付下单请求,其超高的性能及超快的响应速度几乎相当于直接使用JDBC。它采用接口与注解的形式定义DAO,完美地结合了db与cache操作;支持动态SQL,可以构造任意复杂的SQL语句;支持多数据源、分表、分库、事务;内嵌“函数式调用”功能,能将任意复杂的对象映射到数据库的表中。但是从整体上看Mango是一个Java Dao Framework,是一个jar包,它的运行依赖于应用系统的项目代码和服务器,采用了JDBC Shard思想,与TDDL是同款产品。

2.Cobar

Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000多个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求。

3.Heisenberg

Heisenberg源于Cobar,结合了Cobar和TDDL的优势,让其分片策略变为分库分表策略,节约了大量的连接。优点是分库分表与应用脱离,分库分表如同使用单库表一样,减少了db连接数的压力,采用热重启配置,可水平扩容,并遵循 MySQL 原生协议,采用读写分离,无语言限制。MySQL Client、C、Java等都可以使用Heisenberg服务器通过管理命令查看和调整连接数、线程池、节点等。Heisenberg采用velocity的分库分表脚本进行自定义分库分表,相当灵活。

4.Atlas

Atlas是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据库中间层项目。它在MySQL-proxy 0.8.2版本的基础上进行了优化,增加了一些新的功能和特性。奇虎360内部使用Atlas运行的MySQL业务,每天承载的读写请求数达几十亿条。Atlas位于应用程序与MySQL之间,实现了MySQL的客户端与服务端协议,作为服务端与应用程序通信,同时作为客户端与MySQL通信。它对应用程序屏蔽了db的细节,同时为了降低MySQL的负担,维护了连接池。

5.Amoeba

Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的Proxy。它集中响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行,基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,Amoeba的作者强调的是Amoeba配置的便捷性(基于XML的配置文件,用SQLJEP语法书写规则,比基于Lua脚本的MySQL Proxy简单)。

Mycat与以上中间件的对比如表1-1所示。表1-11.4.3 Mycat的优势

Mycat对Cobar代码进行了彻底重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合、Join等基本特性,同时兼容绝大多数数据库,成为通用的数据库中间件。Mycat后端以JDBC方式支持Oracle、DB2、SQL Server、MongoDB、SequoiaDB等数据库,支持透明的读写分离机制,减轻了写库的压力,提高了数据库的并发查询能力,支持各种MySQL集群,包括标准的主从异步集群、MySQL Galera Cluster多主同步集群等,提升了数据库的可用性与性能,还可以通过大表水平分片方式支持 100 亿级大表的分布式存储和秒级的并行查询能力,内建数据库集群故障切换机制,实现了自动切换,可满足大部分应用的高可用性要求。

Mycat 现在由一支强大的技术团队维护,吸引和聚集了一大批业内大数据和云计算方面的资深工程师,参与者都是有 5 年以上经验的资深软件工程师、架构师、DBA,优秀的技术团队保证了Mycat 的产品质量。Mycat 不依托于任何一家商业公司,因此不像某些开源项目将一些重要的特性封闭在其商业产品中,Mycat 的发展和壮大主要基于开源社区志愿者的持续努力。

Mycat 还形成了一系列周边产品,比较有名的是 Mycat-web、Mycat-NIO、Mycat-Balance等,已成为一个比较完整的数据处理解决方案,而不仅仅是中间件。1.4.4 Mycat的适用场合

想要用好Mycat,就需要了解其适用场景,以下几个场景适合使用Mycat。

1.高可用性与MySQL读写分离

利用Mycat可以轻松实现热备份,当一台服务器停机时,可以由双机或集群中的另一台服务器自动接管其业务,从而在无须人工干预的情况下,保证系统持续提供服务。这个切换动作由Mycat自动完成。

Mycat还可以轻松实现数据库的读写分离,实现主数据库处理事务的增、改、删(insert、update、delete)操作,而在数据库中处理查询(select)操作。需要强调的是,Mycat的读写分离及自动切换都依赖于数据库产品的主从数据同步。

2.业务数据分级存储保障

企业的数据量总是在无休止地增长,这些数据的格式不一样,访问频率不一样,重要性也不一样。如果将这些数据统一存储在高性能的数据库产品中,则不但价格昂贵,而且随着数据量的不断增长,读写的性能会受到影响,统一存储的性能也会逐渐下降,维护成本相当高,所以此时我们需要对数据进行分级存储。

数据分级存储是指数据客体存放在不同级别的存储设备(磁盘、磁盘阵列、光盘库、磁带库)中,通过分级存储管理软件实现数据客体在存储设备之间的自动迁移及自动访问切换。在企业的数据中,比较重要的交易类热数据通常存放在Oracle等关系型数据库中;历史数据通常存放在其他数据库中;日志数据通常存放在 NoSQL 或其他日志管理产品中;图片数据通常存放在图片分布式系统中。考虑到成本因素,对于不同的数据所采用的磁盘性能也不一样。如何统一管理这些不同的业务数据,并给业务系统提供一个统一的入口呢?此时,Mycat可以派上用场。

Mycat与生俱来的中间件特性决定了它能承担这一重任,并且只需几个配置就能实现。在Mycat中,一个逻辑库可以对应Oracle、MySQL、MongoDB等多个数据源,对于用户而言就像一个数据库,用户并不知道后端有哪些数据库,只需要关注Mycat。

3.100亿大表水平分片,集群并行计算

数据切分是Mycat的核心功能,是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放在多个数据库(主机)中,以达到分散单台设备负载的效果。数据切分有两种切分模式:一种是按照不同的表(或者schema)将数据切分到不同的数据库(主机)中,这种切分可以叫作数据的垂直(纵向)切分;另外一种则是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多个数据库(主机)中,这种切分叫作数据的水平(横向)切分。当数据量超过800万行且需要做分片时,可以利用Mycat实现数据切分。

4.数据库路由器

Mycat基于MySQL实例的连接池复用机制,可以让每个应用最大程度地共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。

5.整合多种数据源

当一个项目需要用到多种数据源如Oracle、MySQL、SQL Server、PostgreSQL时,可以利用Mycat进行整合,只需访问Mycat这一个数据源就行。第2章Mycat入门本章主要讲解Mycat的安装、基本概念和基本原理,这些是学习Mycat的基础,也是深入理解第3章中各项配置属性的基础。2.1环境搭建

Mycat是采用Java开发的开源分布式中间件,支持Windows和Linux运行环境,下面介绍Mycat的Windows和Linux环境搭建方法。

注意:在Mycat文件的目录中,bin目录存放Mycat的执行文件;conf目录存放Mycat的配置文件;lib目录存放Mycat所依赖的jar包;logs目录存放Mycat运行时所产生的日志文件;version.txt记录当前的Mycat版本的信息。2.1.1 Windows环境搭建

1.安装和配置MySQL数据库

首先需要下载MySQL安装包,推荐使用MySQL 5.6,下载地址为http://dev.MySQL.com/downloads/file/?id=461390。

双击安装包进行安装,安装过程比较简单,这里只介绍安装细节。使用navicat连接本地安装好的数据库,如图2-1所示。图2-1

2.配置Java虚拟机的环境变量

通过http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载合适的JDK版本并以默认方式进行安装,安装完成后将环境变量配置为JAVA_HOME(值为C:\Program Files\Java\jdk1.8.0_66)、CLASSPATH (值为%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar)和Path(值为%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin)。

注意:变量JAVA_HOME的值是JDK的安装路径,配置好环境变量后测试配置是否成功,同时按住Win和R键,桌面左下角会弹出“运行”窗口,输入cmd后按回车键。在弹出的DOS命令行窗口中依次输入JAVAC、java-version,观察输出结果是否正确,如果不正确则环境变量配置失败。

3.下载和启动Mycat

可以在GitHub的Mycat-Server项目中找到Mycat安装包,将其解压到根目录。双击startup_nowrap.bat后将启动Mycat(见图2-2),如果未显示错误信息,则表示Mycat启动成功。图2-22.1.2 Linux环境搭建

1.安装和配置MySQL数据库

建议安装MySQL 5.6版本,下载地址为http://dev.MySQL.com/get/MySQL-community-release-el6-5.noarch.rpm,把下载好的文件放到/opt目录下。

安装MySQL仓库:

安装MySQL 5.6:

2.配置Java虚拟机的环境变量

查看当前仓库的Java版本(yum-y list java*),安装当前仓库的JDK 1.8版本,配置好环境变量后通过java-version查看当前安装完成的Java版本。

3.下载和启动Mycat

通过 https://github.com/MyCATApache/Mycat-download/tree/master/1.5-RELEASE 下载对应Linux系统的Mycat安装包并进行安装。使用浏览器下载Linux版本的压缩包,请勿采用wget方式下载,以此方式下载文件后在解压时会报错。下载完成后安装文件会存放到 opt 目录下,通过tar命令解压该安装文件。

通过/opt/mycat/bin/mycat命令进行启动,/mycat console如果没有报错,则说明Mycat启动成功。2.2Mycat核心概念详解2.2.1 逻辑库(schema)

业务开发人员通常在实际应用中并不需要知道中间件的存在,只需要关注数据库,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。

在云计算时代,数据库中间件可以以多租户的形式为一个或多个应用提供服务,每个应用访问的可能是一个独立或者共享的物理库,如图2-3所示为阿里云数据库服务器RDS。图2-32.2.2 逻辑表(table)

既然有逻辑库,就会有逻辑表。在分布式数据库中,对于应用来说,读写数据的表就是逻辑表。逻辑表可以分布在一个或多个分片库中,也可以不分片。

1.分片表

分片表是将指数据量很大的表切分到多个数据库实例中,所有分片组合起来构成了一张完整的表。例如在Mycat上配置t_node的分片表,数据按照规则被切分到dn1、dn2两个节点。

2.非分片表

并非所有的表在数据量很大时都需要进行分片,某些表可以不用分片。非分片表是相对于分片表而言的不需要进行数据切分的表。如下配置中的t_node只存在于节点dn1上。

3.ER表

关系型数据库是基于实体关系模型(Entity Relationship Model)的,Mycat中的ER表便来源于此。基于此思想,Mycat提出了基于E-R关系的数据分片策略,子表的记录与其所关联的父表的记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据关联查询不会跨库操作。

表分组(Table Group)是解决跨分片数据关联查询的一种很好的思路,也是数据切分的一条重要规则。

4.全局表

在一个真实的业务场景中往往存在大量类似的字典表,这些字典表中的数据变动不频繁,而且数据规模不大,很少有超过数十万条的记录。

当业务表因为规模进行分片后,业务表与这些附属的字典表之间的关联查询就成了比较棘手的问题,所以在Mycat中通过数据冗余来解决这类表的关联查询,即所有分片都复制了一份数据,我们把这些冗余数据的表定义为全局表。

数据冗余是解决跨分片数据关联查询的一种很好的思路,也是数据切分规划的另一条重要规则。2.2.3 分片节点(dataNode)

将数据切分后,一个大表被分到不同的分片数据库上,每个表分片所在的数据库就是分片节点。2.2.4 节点主机(dataHost)

将数据切分后,每个分片节点不一定会独占一台机器,同一台机器上可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机。为了规避单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。2.3Mycat原理介绍

Mycat原理并不复杂,复杂的是代码,如果代码也不复杂,那么Mycat早就成为一个传说了。Mycat 原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对SQL语句做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL语句发往后端的真实数据库,并将返回的结果做适当处理,最终再返回给用户,如图2-4所示。图2-4

在图2-4中,Orders表被分为三个分片节点dn1、dn2、dn3,它们分布在两台MySQL Server (dataHost)上,即datanode=database@datahost,因此你可以用1~N台服务器来分片,分片规则(sharding rule)为典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function)。这里的分片字段为prov,分片函数则为字符串枚举方式。

Mycat收到一条SQL语句时,首先解析SQL语句涉及的表,接着查看此表的定义,如果该表存在分片规则,则获取SQL语句里分片字段的值,并匹配分片函数,得到该SQL语句对应的分片列表,然后将SQL语句发送到相应的分片去执行,最后处理所有分片返回的数据并返回给客户端。以select*from Orders where prov=?语句为例,查找prov=wuhan,按照分片函数,wuhan值存放在dn1上,于是SQL语句被发送到Mysql1,把DB1上的查询结果返回给用户。

如果将上述SQL语句改为select*from Orders where prov in('wuhan','beijing'),那么SQL语句会被发送到Mysql1与Mysql2去执行,然后将结果集合并后输出给用户。但通常在业务中我们的SQL语句会有Order By及Limit翻页语法,此时就涉及结果集在Mycat端的二次处理,这部分代码也比较复杂,而最复杂的则是两个表的关联查询问题。为此,Mycat 提出了创新性的ER分片、全局表、HBT(Human Brain Tech,人工智能)的catlet,以及结合了Storm、Spark 引擎等十八般武艺的解决方案,成为目前业界很强大的跨分片 Join 方案,这就是开源的力量!2.4参与Mycat源码开发

Mycat是采用Java开发的,参与者需要有编程基础;熟悉Java、Maven及MySQL、Oracle、PostgreSQL、MongoDB等数据库;熟悉SQL优化与NoSQL技术;了解JDBC技术,可以完善Mycat Server中的JDBC驱动部分;了解Java I/O、多线程、算法;了解连接池、线程池、缓冲池等概念;了解Java中的BIO、NIO、AIO等概念;了解SQL解析原理。如果有条件,则还可以深入学习JVM相关技术;如果想参与Mycat Web开发,则还需要掌握Java Web技术。2.4.1 Mycat源码环境搭建

首先,安装GitHub管理工具、JDK1.7+、Maven、Eclipse,如果操作系统是x64位的,则需要安装64位的JDK和Eclipse。

可以利用Eclipse的Git插件直接获取源码(https://github.com/MycatApache/Mycat-Server.git)到Eclipse中,也可以利用Git工具先获取源码到本地,再导入Eclipse。

因为Maven需要下载项目依赖的jar包,所以第一次导入项目时等待的时间较长。2.4.2 Mycat源码调试

Mycat 运行的 main class 是 MycatStartup,在调试前需要配置相关的启动参数,需要指定Mycat_HOME这个系统变量的值,可以为任意位置,不过一般指定为与源代码同级的目录。可以在IDE运行选项内配置VM arguments,例如:

若启动报错,DirectBuffer内存不够,则可以增加JVM系统参数:

设置好以上环境后,将后端数据库配置好,用鼠标右键单击org.opencloudb.MycatStartup→run as,Mycat就能启动了。下面是Mycat中各包的情况。第3章Mycat进阶本章主要讲解Mycat的配置、分片规则和管理命令等内容。3.1Mycat配置详解

熟悉 Mycat 配置是使用 Mycat 的基础,也是熟练掌握 Mycat 的必经之路。schema.xml 是Mycat的重要配置文件,它管理着逻辑库、分片表、分片节点和分片主机等信息;server.xml是系统参数的配置文件,要掌握Mycat的优化方法,则必须熟悉该文件的配置项;sequence是全局序列的配置文件;log4j.xml是Mycat的日志输出配置文件。3.1.1 Mycat支持的两种配置方式

Mycat从1.5版本开始支持两种配置方式:ZooKeeper及本地XML方式。Mycat默认以本地加载XML的方式启动,如果需要配置成以ZooKeeper的方式启动,则应把conf目录下zk.conf文件中的 loadfromzk 参数设置成 true。ZooKeeper 配置方式解决了统一配置和管理的问题,同时解决了Mycat与周边组件的协调问题。

如果使用ZooKeeper配置方式,则所有的配置参数都在zk-create.yaml文件中,该文件涵盖了conf目录下的schema、server等文件中的所有配置项(见3.1.5节)。

ZooKeeper的配置方式依赖于ZooKeeper,所以需要先安装ZooKeeper并初始化其中的数据,然后执行Mycat_HOME/bin目录下初始化ZooKeeper的脚本。3.1.2 server.xml配置文件

server.xml配置文件包含了Mycat的系统配置信息,对应的源码是SystemConfig.java。它有两个重要的标签,分别是user、system,掌握system标签的各项配置属性是Mycat调优的关键。

1.user标签

server.xml中的标签并不多,user标签主要用于定义登录Mycat的用户和权限。在如上配置中定义了用户名和密码都为test的用户,该用户可以访问的schema只有TESTDB。

若要在schema.xml中定义TESTDB,则TESTDB必须先在server.xml中定义,否则该用户将无法访问该TESTDB。如果使用了use命令,则Mycat会有如下错误提示:

我们可以修改user标签的name属性来指定用户名,修改password的值来修改密码,修改readOnly的值为true或false来限制用户的读写权限。如果需要同时访问多个schema,则多个schema之间使用英文逗号隔开,例如:

1)benchmark属性

通过设置benchmark属性的值来限制前端的整体连接数量,如果其值为0或不对其进行设置,则表示不限制连接数量。例如:

2)usingDecrypt属性

通过设置 usingDecrypt 属性的值来开启密码加密功能。默认值为 0,表示不开启加密;值为1表示开启加密,同时使用加密程序对密码加密,加密命令如下:

说明:采用 Mycat 1.5.1 执行 mycat jar 程序;Mycat-server-1.5.1-RELEASE.jar 为 mycat download下载目录的jar文件。

2.system标签

system标签与系统配置有关,下面一一介绍该标签的所有属性。

1)charset属性

如果需要配置特殊字符集如utf8mb4,则可以在index_to_charset.properties中配置,配置格式为“ID=字符集”,例如“224=utf8mb4”。

配置字符集时一定要保证 Mycat 字符集与数据库字符集的一致性,可以通过变量来查询MySQL字符集:

2)defaultSqlParser属性

由于Mycat的最初版本使用了Foundation DB的SQL解析器,在Mycat 1.3后增加了Druid解析器,所以要使用 defaultSqlParser 属性来指定默认的解析器。目前有两个可用的选项:druidparser和fdbparser。Mycat 1.3默认的解析器为 fdbparser;Mycat 1.4默认的解析器为druidparser;在Mycat 1.4之后的版本中fdbparser解析器作废。

3)processors属性

processors属性指定系统可用的线程数量,默认值为机器CPU核心×每个核心运行线程的数量,processors值会影响processorBufferPool、processorBufferLocalPercent、processorExecutor属性。NIOProcessor的个数也由processors属性决定,所以调优时可以适当地修改processors值。

4)processorBufferChunk属性

processorBufferChunk属性指定每次分配Socket Direct Buffer的默认值为4096个字节,也会影响BufferPool的长度,如果一次性获取的字节过多而导致Buffer不够用,则会经常出现警告,可以适当调大processorBufferChunk值。

5)processorBufferPool属性

processorBufferPool属性指定BufferPool的计算比例。由于每次执行NIO读、写操作都需要使用到Buffer,所以Mycat初始化时会建立一定长度的Buffer池来加快NIO读、写效率,减少建立Buffer的时间。

Mycat中有两个主要的Buffer池:BufferPool、ThreadLocalPool。BufferPool使用ThreadLocalPool作为二级缓存,每次从BufferPool中获取时都会优先获取ThreadLocalPool中Buffer的值,如果ThreadLocalPool未命中,则会获取BufferPool中Buffer的值。ThreadLocalPool中的Buffer在每个线程内部使用。然而,BufferPool是每个NIOProcessor共享的。

processorBufferPool的默认值为:bufferChunkSize(4096)×processors×1000。

如图3-1所示,BufferPool的总长度为BufferPool与BufferChunk的比。如果BufferPool的长度不是BufferChunk的整数倍,则其总长度为前面计算得出的比值的整数部分加1。图3-1

假设系统的线程数为4,其他都为属性的默认值,则BufferPool=4096×4×1000,BufferPool的总长度为4000,即16384000/4096。

6)processorBufferLocalPercent属性

processorBufferLocalPercent属性用来控制ThreadLocalPool分配Pool的比例大小,这个属性的默认值为100。

线程缓存百分比=bufferLocalPercent/processors。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载