基于MySQL的高可用可扩展架构探讨

随着信息量飞涨,信息的存储成为了这个时代至关重要的一项技术。如何来保证数据存储技术能够适应信息量的增长速度和我们对信息的高度依赖,成为一个非常重要的课题。本文将从数据库架构的层面,通过以开源的数据存储软件来构建分布式数据层的思路,期望实现一个低成本的高可用可扩展的数据层架构。

传统数据库架构

纵观各传统商业数据库软件,多以集中式架构为主,鲜有以分布式为设计理念的架构。这些传统数据库软件的最大特点就是将所有的数据都集中在一个数据库中,依靠大型高端设备来提供高处理能力和扩展性。

集中式数据库架构在扩展性方面主要依赖于主机和存放数据的存储设备的扩展能力,也就是说依赖硬件本身的纵向扩展能力,很难做到较好的横向扩展。而其可靠性也同样是以硬件设备为依托,主要通过Share Storage的方式来实现。如大家所熟知的传统商业数据库代表厂商Oracle的RAC,就是一个非常典型的Share Everything 的集中式架构。

我们可以通过图1来简单地描绘一下传统数据库的典型架构:传统架构在主机端大多通过两台主机共享存储设备,平时其中一台主机使用存储通过数据库软件来管理。这样的架构只能有一台主机(RAC除外)上的数据库能够提供服务,另一台主机只能是作为热备冗余,不能启动数据库实例提供服务。所以,其处理能力就完全取决于这台主机的最大扩展能力,很难通过增加主机数量来增加处理能力。而单台主机的扩展能力毕竟是有限的,即使是某些厂商的大型机,同样也有其扩展限制。此外,传统架构对高端设备的依赖,无疑将直接导致系统成本的大幅度增加,甚至可能会导致系统被主机和硬件厂商所“绑架”,不得不持续增加投入成本。

图1 传统数据库的典型架构

基于MySQL的可扩展和高可靠

MySQL 作为开源数据库的佼佼者,无论是软件本身的设计思想,还是推崇给广大使用者们常用的架构思路都和传统的商业数据库软件大相径庭。MySQL弃用了传统的 Share-Everything的思想,而采用了Share-Nothing的思想。MySQL的Replication实现机制,以及 MySQL Cluster的架构设计,都体现了这一思想。也正因如此,给MySQL在可扩展性和高可靠性方面带来了非常灵活的架构设计思路,也让我们的数据库可以摆脱对高端设备的依赖,使用上性价比高很多的PC Server。

可扩展性

在提升扩展性方面,最为常用的是通过MySQL自身的Replication功能,将同一份MySQL的数据以异步的方式同时复制到另外的一台或多台 MySQL主机上,并让这些MySQL主机同时对外提供查询服务。每增加一个复制的节点,查询处理能力也得到相应的增加,新增节点的处理能力就是整个系统增加的处理能力。由于MySQL Replication主要是逻辑方式,同一个集群中可有多家厂商的硬件,也可以使用不同的OS,所以可以做到完全不受任何软/硬件平台限制,摆脱对单一平台的依赖。

人们可能会对MySQL Replication的功能特性不满意,进而通过第三方开源软件,甚至是通过解析其开源的通信协议自行开发出来的复制软件来进行数据实时(或者异步)复制来达到 Replication完全相同甚至更好的效果。传统数据库可能也具有某项功能实现数据的复制,但与MySQL相比,由于只依靠数据库本身特性来完成,在架构的灵活性和可控性方面存在一些不足。

最后,在提升扩展性方面不得不说的数据切分(横向/纵向)的思想,同样可以在MySQL数据库上得到灵活的发挥,无论是以功能模块的方式进行纵向的切分,还是以某个特定键(字段)的类HASH分段的方式进行横向的切分,抑或是通过数据库本身的Partition功能进行切分,都可以在MySQL上得到很好的实现。当然,无论是切分前的数据分散,还是切分后的数据路由和合并都离不开应用层的协作与配合,除非通过MySQL Cluster来实现。对于提升扩展性的架构,通过图2会有一个更为直观的展现。

图2 能够提升扩展性的架构

图中以“Master”为核心,通过不同的方式以三条“路线”将数据复制到相应的 MySQL 集群中对外提供服务。实际的架构中,Master就是一个数据写入点,复制出去的集群则可以对外提供相应的查询请求。常见的Web应用系统中,查询请求远远大于写入请求,所以非常适合通过MySQL 数据库使用类似的架构思想来解决实际的扩展性问题。

高可靠性

在保证高可靠性方面,同样可以通过MySQL的 Replication 为基础,加以应用层架构的简单配合或一些开源的第三方HA管理软件来设计出多种非常灵活的高可靠架构。

对于数据写入点,可以通过MySQL的Replication功能,将两台MySQL主机设置成双A的状态,并通过HA管理软件,对MySQL的状态检测,来判定MySQL的状态,并对外提供供单一的服务 IP 地址,以确保在任何时候有一台MySQL崩溃后马上切换到另外一台MySQL上提供服务。这样自动的方式非常方便地让我们的写入点拥有高可靠性。如果我们的应用程序也可以自动判断当一个点失效后马上自动切换到另外一个点就更好,基本上可以做到对外部完全透明的切换,对可用性的影响之小,比现在一些知名厂商的专业HA管理都要好很多。

对于数据查询点,高可靠性的实现就更容易了,可从双A的两台Master端中的任意一台上通过数据复制搭建多个具有完全相同数据拷贝的MySQL节点,来保证任何时刻都可以有多台MySQL对外提供数据查询服务。当一台MySQL崩溃,系统马上将该节点从可以服务的节点中剔除出去。通过应用架构的帮助这是非常容易做到的事情。

图 3是高可靠性实例图。1描绘了基本架构,2、3和4分别描绘了当读节点失效以及写节点中的任何一个失效后的高可靠性实现。在高可靠性方面,除了自行控制将数据复制到多个MySQL主机上的方式之外,MySQL还提供了更为高级的方案——MySQL Cluster,一个完全的分布式数据库集群,而且是一个非常典型的Share-Nothing的分布式数据库架构。数据层和SQL层分离,每份数据都以两份或更多份拷贝存放在不同的数据节点上,整个数据层的所有节点以分布式计算的思想共同处理整个数据库的数据,在保证高并发的处理能力的同时,以数据冗余的方式保证了高可靠性。

图3 高可靠性实例图

构建基于MySQL、Cache 和Search的数据层

随着Web应用系统负载的增速越来越快,常让系统不堪重压,数据库系统尤甚。而随着对用户体验关注度的提高,响应速度和使用的便利性则成为不可避免的话题。无论如何优化都不可能避免磁盘物理I/O的响应速度与内存中的I/O速度不匹配的问题,所以很自然地想到了通过内存Cache的方式来提高响应速度。

在使用的便利性方面最为典型的就是数据搜索。关系型数据库的特性,决定了它很难提供类似于Google那样的可以全文检索的搜索系统。我们再次以借助“外力”的方式来完善服务,将数据库中的数据通过利用Lucene或者Egothor等类似的搜索引擎系统,或者是利用Sphinx之类的软件和数据库集成,为数据库增加全文检索的能力。

可以设计出一个以数据库(My-SQL)来完成持久化和常规的数据访问功能,以分布式内存Cache系统来提供对响应速度和并发能力极高的数据的访问,以第三方或者自行研发的分布式全文搜索系统来提供全文检索服务的全方位的分布式数据服务层,中间则通过应用架构的帮助实现一个统一的数据访问层,来控制数据的读取写入检索等操作,如图4所示:让MySQL中的数据同步(或异步)写入到Cache和Search系统的实现方式很多,如对实时性要求不是很高,也不希望Data Proxy Layer中有太多的控制逻辑,完全可以通过队列的方式以异步的方式实现;如对实时性要求较高,也可以通过 Data Proxy Layer这一层应用来控制Cache和Search中的数据更新;甚至还可以通过MySQL的用户自定义函数,以 Trigger的方式将数据实时地更新到Cache集群。类似的方式可以想出很多,关键是要根据应用场景,来选择最合适、最简单的方式来实现。

图4 数据写入Cache和Search系统的实现方式

架构无所谓最好的,只有最合适的。任何架构都有其适用的场景,也有其相应的生命周期。应用场景或业务量的变化,都可能导致架构不足以应对的现象。引用一句电影台词:“出来混,迟早要还的!”

转载于:https://www.cnblogs.com/simplelogic/archive/2013/01/10/2854688.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 测试程序性能,推荐一款Linux系统的性能测试软件

bitcnts是mibench众多测试软件中的一个,但足够测试CPU的性能.如果需要全部测试软件,请从密西根大学网站上下载:http://www.eecs.umich.edu/mibench/下面贴上SEP4020Linux2.6上跑1000000位测试时间测试环境CPU88MHz 开LCD NFS网络文件系统/mibench/bitcou…

使用chpasswd命令批量修改系统用户密码

chpasswd命令工作原理&#xff1a;从系统的标准输入读入用户的名称和口令&#xff0c;并利用这些信息来更新系统上已存在的用户的口令&#xff01;语法&#xff1a;1&#xff1a;# echo 用户名:密码 | chpasswd2&#xff1a;# chpasswd < doiido.txt相关参数&#xff1a;-e …

有趣分享:国内产业图谱

IT有趣分享”Microsoft 市值又重新登上全球第一当地时间21年10月29号周五美股收盘微软市值重新登上全球第一&#xff0c;约为2.46万亿美元&#xff0c;超越苹果2.43万亿美元&#xff0c;成为全球市值第一公司。相当于深圳21年前三季度的gdp的总和的两倍。有趣的是专门有人做了公…

性冷淡风的麻将,获红点奖!网友:没有烟火气了

全世界只有3.14 % 的人关注了爆炸吧知识在这个消费升级的时代很多产品都被重新设计着最近&#xff0c;一款麻将引发大家热议有人说惊艳也有人说太冰冷&#xff0c;没了烟火气设计者是THE 90s LAB台湾的一个90后团队这副麻将的名字很洋气叫做&#xff0c;马丘Machill读起来&…

springmvc使用和经验总结(长沙师说网络科技有限公司)

springmvc 先分析下代码&#xff0c;快速学习&#xff0c;先要把配置文件写好&#xff0c; 给上2个类具体看看 package com.shishuo.studio.action;import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframe…

MySQL使用裸设备

1.名词注释&#xff1a;a.裸设备&#xff1a;是一种没有经过格式化&#xff0c;不被Unix/Linux通过文件系统来读取的特殊类型的块设备文件&#xff0c;允许以直接访问硬盘的方式访问一个存储设备&#xff0c;而不经过操作系统的高速缓存和缓冲器。裸设备可以绑定一个分区&#…

c语言md5函数 linux,Linux下C语言计算文件的md5值(长度32)

google了好久都没有找到合适的&#xff0c;其实我只需要一个函数&#xff0c;能计算文件的 md5 值就好&#xff0c;后来找到了 md5.h 和 md5.c 的源文件&#xff0c;仿照别人的封装了个函数(他那个有问题&#xff0c;和 md5sum 计算出来的都不一样)。废话少说&#xff0c;直接贴…

图片的旋转

主要运用了Matrix类&#xff0c;postRotate()方法和postScale()方法&#xff1b; Matrix&#xff1a;中文是矩阵的意思&#xff0c;主要用于图片的缩放&#xff0c;平移与旋转&#xff1b; postRotate()用于旋转&#xff0c;postScale()用于缩放&#xff1b; 具体MianAvtivity代…

让 AI 为你写代码 - 体验 Github Copilot

前几天在群里看到有大神分享 Copoilot AI 写代码&#xff0c;看了几个截图有点不敢相信自己的眼睛。今天赶紧自己也来体验一下 Copoilot AI 写代码到底有多神奇。申请 现在 Copoilot 还处在预览阶段&#xff0c;想要体验需要先申请。等待大概一晚会收到邮件提示申请试用成功&am…

ajax常见错误和使用总结

先给出标准的js时间ajax <script type"txt/javascript">//1、在IE中实例化Msxml2.XMLHTTP对象 Msxml2.XMLHTTP是IE浏览器的内置对象&#xff0c;该对象具有异步提交数据和获取结果的功能var xmlHttpfalse; function initAJAX() {if(window.XMLHttpRequset){x…

这个24岁北航博士刚毕业就受聘211大学副教授,他大一就保研,学术能力太牛了.........

全世界只有3.14 % 的人关注了爆炸吧知识本文综合整理自&#xff1a;量子位、微言航语近日&#xff0c;有一个人的“朋友圈”在朋友圈火了。别误会&#xff0c;超模君可没在玩套娃游戏。截图给大家搬来了&#xff0c;快看你没看错&#xff01;1996年出生&#xff0c;今年24岁&am…

正则 js截取时间

项目中要把时间截取&#xff0c;只要年月日&#xff0c;不要时分秒&#xff0c;于是 /\d{4}-\d{1,2}-\d{1,2}/g.exec("2012-6-18 00:00:00")或者另一种 var date "2015-12-26 15:22:00"; console.log(date.replace(/\s[\x00-\xff]*/g,));解析 思路:获取到…

数据中心缩小是因为外包和云计算吗

一些IT专家预测&#xff1a;在云计算和数据中心外包时代&#xff0c;将会有越来越多的企业看不到建造和管理数据中心的价值。 “建造数据中心是一笔大的支出&#xff0c;你得考虑到能量、发电、UPS、机架等等&#xff0c;这还没讲到服务器呢&#xff0c;”架构师Tim Antonowicz…

英特尔傲腾内存linux,英特尔傲腾内存怎么样?intel傲腾内存优点和缺点你知道吗?...

英特尔傲腾内存在前一段时间正是发布&#xff0c;对于英特尔内存的性能不少用户一无所知&#xff0c;那么英特尔傲腾内存怎么样&#xff1f;都有哪些优点和缺点&#xff1f;下面装机之家小编来为大家解读下。优点1&#xff1a;3D XPoint随机读取性能强傲腾使用了不同于普通固态…

零代码平台中的服务编排思路

先打个广告&#xff0c;我们的第三场零代码实践的直播在本周五&#xff08; 11 月 5 日 &#xff09;晚8点准时开始&#xff0c;扫描下面二维码&#xff0c;直接预约直播&#xff0c;到时间微信会自动提醒。随着企业数字化转型的进程加快&#xff0c;零代码平台的的应用越来越广…

webservice发布

一朋友问我webservice怎么发布在iis上。我之前也不知道&#xff0c;今天自己亲自试了一把竟然发布成功了。现在这个分享给大家。希望给大家带来一点点方便。 其实和发布普通网站一样&#xff0c;在iis上选择 默认网站--->新建虚拟目录--->取别名&#xff08;随便取&#…

自己平时长期积累的java资料可供大家学习

java 中数据转换 1、如何将字符串String转化为整数int int i Integer.parseInt(str); int i Integer.valueOf(my_str).intValue(); 注: 字串转成Double, Float, Long的方法大同小异。 2、如何将字符串String转化为Integer Integer integerInteger.valueOf(i) 3、…

日本原装进口雪平锅,1台顶4台,有它谁还点外卖?

▲ 点击查看小爆我虽然热爱烹饪&#xff0c;但不得不说「下厨房」&#xff0c;也是个坑。光是锅&#xff0c;我就要买好几个。为了蒸包子馒头买蒸锅&#xff0c;为了炒菜买炒锅&#xff0c;偶尔想精致喝热牛奶又买了小奶锅&#xff0c;为了煲汤、做点卤味解解馋&#xff0c;买炖…

NSPredicate 谓词

比较运算符/**比较运算符 * >:大于 * <:小于 * >:大于等于 * <:小于等于 * ,:等于 * !,<>:不等于 * between:左边的表达式等于右边的表达式的值或者介于它们之间。右边是一个有两个指定上限和下限的数值的数…

如何评价一个开源项目——价值流网络

本文由X-lab开放实验室博士生赵生宇原创出品该篇博客继续之前关于活跃度和协作影响力的介绍继续展开&#xff0c;希望可以在解决协作影响力无法容纳更多数据&#xff0c;从而可以更全面衡量开源生态的同时&#xff0c;也引入一种高可扩展的数学模型&#xff0c;可以在任意时间快…