MySQL在大型网站的应用架构演变

news/2024/5/20 7:28:27/文章来源:https://blog.csdn.net/itcodexy/article/details/109573811

点击上方 蓝字字体 加关注吧

作者:大熊先生

原文:http://www.cnblogs.com/Creator/p/3776110.html

作为最流行的开源数据库,MySQL被广泛应用在Web应用程序以及其它中小型项目上。然而不可忽视的是,在许多大型IT公司中,MySQL在高度优化和定制化后,已逐渐偏离了原有的开源版本,更像是一种分支,比如Facebook前不久开源的WebScaleSQL。下面是来自博主大熊先生的一篇文章:

写在最前
本文主要描述在网站的不同的并发访问量级下,Mysql架构的演变。

可扩展性
架构的可扩展性往往和并发是息息相关,没有并发的增长,也就没有必要做高可扩展性的架构,这里对可扩展性进行简单介绍一下,常用的扩展手段有以下两种:

Scale-up:纵向扩展,通过替换为更好的机器和资源来实现伸缩,提升服务能力;
Scale-out:横向扩展,  通过加节点(机器)来实现伸缩,提升服务能力。

对于互联网的高并发应用来说,无疑Scale out才是出路,通过纵向的买更高端的机器一直是我们所避讳的问题,也不是长久之计,在scale out的理论下,可扩展性的理想状态是什么?

可扩展性的理想状态
一个服务,当面临更高的并发的时候,能够通过简单增加机器来提升服务支撑的并发度,且增加机器过程中对线上服务无影响(no down time),这就是可扩展性的理想状态!
 
架构的演变

V1.0  简单网站架构

一个简单的小型网站或者应用背后的架构可以非常简单,  数据存储只需要一个mysql instance就能满足数据读取和写入需求(这里忽略掉了数据备份的实例),处于这个时间段的网站,一般会把所有的信息存到一个database instance里面。


在这样的架构下,我们来看看数据存储的瓶颈是什么?
1. 数据量的总大小,一个机器放不下时;
2. 数据的索引(B+ Tree)一个机器的内存放不下时;
3. 访问量(读写混合)一个实例不能承受。

只有当以上3件事情任何一件或多件满足时,我们才需要考虑往下一级演变。从此我们可以看出,事实上对于很多小公司小应用,这种架构已经足够满足他们的需求了,初期数据量的准确评估是杜绝过度设计很重要的一环,毕竟没有人愿意为不可能发生的事情而浪费自己的经历。

这里简单举个我的例子,对于用户信息这类表(3个索引),16G内存能放下大概2000W行数据的索引,简单的读和写混合访问量3000/s左右没有问题,你的应用场景是否?

V2.0 垂直拆分
一般当V1.0 遇到瓶颈时,首先最简便的拆分方法就是垂直拆分,何谓垂直?就是从业务角度来看,将关联性不强的数据拆分到不同的instance上,从而达到消除瓶颈的目标。以图中的为例,将用户信息数据,和业务数据拆分到不同的三个实例上。对于重复读类型比较多的场景,我们还可以加一层cache,来减少对DB的压力。


在这样的架构下,我们来看看数据存储的瓶颈是什么?
1.单实例单业务 依然存在V1.0所述瓶颈;遇到瓶颈时可以考虑往本文更高V版本升级, 若是读请求导致达到性能瓶颈可以考虑往V3.0升级, 其他瓶颈考虑往V4.0升级。
 
V3.0  主从架构
此类架构主要解决V2.0架构下的读问题,通过给Instance挂数据实时备份的思路来迁移读取的压力,在Mysql的场景下就是通过主从结构,主库抗写压力,通过从库来分担读压力,对于写少读多的应用,V3.0主从架构完全能够胜任。

在这样的架构下,我们来看看数据存储的瓶颈是什么?
1. 写入量主库不能承受
 
V4.0  水平拆分
对于V2.0 V3.0方案遇到瓶颈时,都可以通过水平拆分来解决,水平拆分和垂直拆分有较大区别,垂直拆分拆完的结果,在一个实例上是拥有全量数据的,而水平拆分之后,任何实例都只有全量的1/n的数据,以下图Userinfo的拆分为例,将userinfo拆分为3个cluster,每个cluster持有总量的1/3数据,3个cluster数据的总和等于一份完整数据(注:这里不再叫单个实例,而是叫一个cluster 代表包含主从的一个小mysql集群)。


数据如何路由?
1. Range拆分
sharding key按连续区间段路由,一般用在有严格自增ID需求的场景上,如Userid, Userid Range的小例子:以userid 3000W 为Range进行拆分,1号cluster  userid 1-3000W,2号cluster  userid   3001W-6000W。

2. List拆分
List拆分与Range拆分思路一样,都是通过给不同的sharding key来路由到不同的cluster,但是具体方法有些不同,List主要用来做sharding key不是连续区间的序列落到一个cluster的情况,如以下场景:

假定有20个音像店,分布在4个有经销权的地区,如下表所示:

业务希望能够把一个地区的所有数据组织到一起来搜索,这种场景List拆分可以轻松搞定。

3. Hash拆分
通过对sharding key 进行哈希的方式来进行拆分,常用的哈希方法有除余,字符串哈希等等,除余如按userid%n 的值来决定数据读写哪个cluster,其他哈希类算法这里就不细展开讲了。

数据拆分后引入的问题:
数据水平拆分引入的问题主要是只能通过sharding key来读写操作,例如以userid为sharding key的切分例子,读userid的详细信息时,一定需要先知道userid,这样才能推算出再哪个cluster进而进行查询,假设我需要按username进行检索用户信息,需要引入额外的反向索引机制(类似HBASE二级索引),如在redis上存储username->userid的映射,以username查询的例子变成了先通过查询username->userid,再通过userid查询相应的信息。

实际上这个做法很简单,但是我们不要忽略了一个额外的隐患,那就是数据不一致的隐患。存储在redis里的username->userid和存储在mysql里的userid->username必须需要是一致的,这个保证起来很多时候是一件比较困难的事情,举个例子来说,对于修改用户名这个场景,你需要同时修改redis和mysql,这两个东西是很难做到事务保证的,如mysql操作成功 但是redis却操作失败了(分布式事务引入成本较高),对于互联网应用来说,可用性是最重要的,一致性是其次,所以能够容忍小量的不一致出现。毕竟从占比来说,这类的不一致的比例可以微乎其微到忽略不计(一般写更新也会采用mq来保证直到成功为止才停止重试操作)。

在这样的架构下,我们来看看数据存储的瓶颈是什么?
在这个拆分理念上搭建起来的架构,理论上不存在瓶颈(sharding key能确保各cluster流量相对均衡的前提下),不过确有一件恶心的事情,那就是cluster扩容的时候重做数据的成本,如我原来有3个cluster,但是现在我的数据增长比较快,我需要6个cluster,那么我们需要将每个cluster 一拆为二,一般的做法是:

1. 摘下一个slave,停止同步;
2. 对写记录增量log(实现上可以业务方对写操作,多一次写持久化mq或者mysql主创建trigger记录写 等等方式);
3. 开始对静态slave做数据,一拆为二;
4. 回放增量写入,直到追上的所有增量,与原cluster基本保持同步;
5. 写入切换,由原3 cluster切换为6cluster 。

有没有类似飞机空中加油的感觉,这是一个脏活、累活、容易出问题的活,为了避免这个,我们一般在最开始的时候,设计足够多的sharding cluster来防止可能的cluster扩容这件事情。

V5.0  云计算 腾飞(云数据库)  
云计算现在是各大IT公司内部作为节约成本的一个突破口,对于数据存储的mysql来说,如何让其成为一个saas(Software as a Service)是关键点。在MS的官方文档中,把构建一个足够成熟的SAAS(MS简单列出了SAAS应用的4级成熟度)所面临的3个主要挑战:可配置性,可扩展性,多用户存储结构设计称为'three headed monster'。可配置性和多用户存储结构设计在Mysql saas这个问题中并不是特别难办的一件事情,所以这里重点说一下可扩展性。

Mysql作为一个saas服务,在架构演变为V4.0之后,依赖良好的sharding key设计, 已经不再存在扩展性问题,只是他在面对扩容缩容时,有一些脏活需要干,而作为saas,并不能避免扩容缩容这个问题,所以只要能把V4.0的脏活变成 1. 扩容缩容对前端APP透明(业务代码不需要任何改动);2. 扩容缩容全自动化且对在线服务无影响,那么他就拿到了作为Saas的门票。


对于架构实现的关键点,需要满足对业务透明,扩容缩容对业务不需要任何改动,那么就必须eat our own dog food,在你mysql saas内部解决这个问题,一般的做法是我们需要引入一个Proxy,Proxy来解析sql协议,按sharding key 来寻找cluster,判断是读操作还是写操作来请求主 或 从,这一切内部的细节都由proxy来屏蔽。

这里借淘宝的图来列举一下proxy需要干哪些事情:


百度公开的技术方案中也有类似的解决方案。

对于架构实现的关键点,扩容缩容全自动化且对在线服务无影响;扩容缩容对应到的数据操作即为数据拆分和数据合并,要做到完全自动化有非常多不同的实现方式,总体思路和V4.0介绍的瓶颈部分有关,目前来看这个问题比较好的方案就是实现一个伪装slave的sync slave,解析mysql同步协议,然后实现数据拆分逻辑,把全量数据进行拆分。具体架构见下图:


其中Sync slave对于Original Master来说,和一个普通的Mysql Slave没有任何区别,也不需要任何额外的区分对待。需要扩容/缩容时,挂上一个Sync slave,开始全量同步+增量同步,等待一段时间追数据。以扩容为例,若扩容后的服务和扩容前数据已经基本同步了,这时候如何做到切换对业务无影响?其实关键点还是在引入的proxy,这个问题转换为了如何让proxy做热切换后端的问题。这已经变成一个非常好处理的问题了。

另外值得关注的是:2014年5月28日——为了满足当下对Web及云应用需求,甲骨文宣布推出MySQL Fabric,在对应的资料部分我也放了很多Fabric的资料,有兴趣的可以看看,说不定会是以后的一个解决云数据库扩容缩容的手段。

V more ?
等待革命...

淘宝用例

淘宝RDS 云数据库设计:http://blog.csdn.net/ywh147/article/details/8954625;http://www.infoq.com/cn/news/2012/10/taobao-ump        

MySQL  Fabric

  • http://mysqlmusings.blogspot.jp/2013/09/brief-introduction-to-mysql-fabric.html

  • http://vnwrites.blogspot.jp/2013/09/mysqlfabric-sharding-introduction.html

  • http://vnwrites.blogspot.in/2013/09/mysqlfabric-sharding-example.html

  • http://vnwrites.blogspot.in/2013/09/mysqlfabric-sharding-migration.html

  • http://vnwrites.blogspot.jp/2013/09/mysqlfabric-sharding-maintenance.html


有热门推荐????

1.看了3天诈骗团伙内训资料,我流下一身冷汗...

2.Java后端必备的开发规范

3.程序员接私活的10个平台和一些建议

4.Spring Boot 核心知识,深入剖析!

5.1024程序员节,哪些适合程序员的礼物?

关注 程序IT圈

觉得内容还不错的话,给我点个“在看”呗

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

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

相关文章

asp的网站能封装成app吗_网页端封装生成app移动端,是开发者的热门趋势

随着智能手机的性能不断提高,人们对app的追求也越来越多,社交、支付、购物等,app开发行业逐渐热了起来。很多企业都需要借助APP软件的热潮来经营业务,有时候为了不浪费太多时间就会考虑使用app封装平台来进行制作app,成…

云服务器 ECS 建站教程:搭建WordPress网站

搭建 WordPress 网站WordPress 是一款常用的搭建个人博客网站的软件。使用阿里云的云服务器 ECS,您可以方便地搭建 WordPress,发布个人博客。 此外,将来随着业务的扩展,您可以利用阿里云强大的产品平台,横向和纵向扩展…

在IIS上部署ASP网站

话不多说直接上图 一:右键网站项目,点击发布: 二:一号标记处的意思是你要选择一个新的地址来存放发布的文件(随便新建个文件夹放就行了) 然后点击发布,出现下面的界面: 三:进入IIS&#xff0c…

Redis实践:网站搜索的热搜词

来源:Catcher8www.cnblogs.com/catcher1994/p/5877262.html对于一个网站来说,无论是商城网站还是门户网站,搜索框都是有一个比较重要的地位,它的存在可以说是为了让用户更快、更方便的去找到自己想要的东西。对于经常逛这个网站的…

架设高可用网站用多少台服务器,Nacos服务器高可用集群搭建

Nacos服务器高可用集群搭建Nacos服务器高可用集群搭建[var1]1.环境openjdk: 1.8.0_181nacos: 1.3.1 * nacos需使用最新版本才能兼容8.*版本的mysqlmysql: 8.0.19三台机器(至少需要三个或三个以上的nacos节点才能搭建集群)ip: 192.168.8.81192.168.8.82192.168.8.832.部署集群*在…

Scrapy使用Downloader Middleware设置代理访问网站

一、首先上网找到一个好用能用的代理 二、找到以后设置代理: win10打开控制面板里的internet选项里的局域网设置, 在这里设置勾选,设置好代理后,点击确定。代理设置完毕。 三、代码实现 middlewares.py class ProxyMiddlewar…

用 Python 清理收藏夹里已失效的网站

失效的书签们我们日常浏览网站的时候,时不时会遇到些新奇的东西( 你懂的.jpg ),于是我们就默默的点了个收藏或者加书签。然而当我们面对成百上千的书签和收藏夹的时候,总会头疼不已……尤其是昨天还在更新的程序设计博…

网站资源防盗链结构设计

标题索引 追溯原因 数据测试 防盗结构 追溯原因 一步一印,有印为证,网站资源防盗链老生常谈,但是如何才能确保网站资源如图片等特殊资源不被盗链?这不仅仅是运维人员所考虑的问题,更是开发人员必须控制并解决的一个问…

Python爬虫+Flask,带你创建个网站!

文化不分边界人,为什么要读书?举个例子:当看到天边飞鸟,你会说:“落霞与孤鹜齐飞,秋水共长天一色。”而不是:“卧靠,好多鸟。”;当你失恋时你低吟浅唱道:“人生若只如初见&#xff0…

jiathis:社交化数据分析 帮助网站提高流量

随着微博的兴起,社会化营销逐渐走进我们的生活,不管是杜蕾斯微博事件还是最近在小米大战360,都是在社会化平台上面进行,而 如何方便的将网站内 容分享至社会化媒体,,大部分博主会选择工具,但选择…

珍藏已久的OS学习网站,拿出来分享给大家!

平常经常看推荐各种资源教程的,感觉有很多文章稂莠不齐,这次我来推荐点硬核的网站,包你有收获。一般很少有人推荐操作系统的网站吧。。。。。。这几个网站来源于我平常的学习总结,也有一些是来源于网上优秀的回答,希望…

哪个云服务器网站不用备案,有不需要备案的云服务器

有不需要备案的云服务器 内容精选换一换不想看文字,请直接戳视频链接。可以不做备案吗?根据《互联网信息服务管理办法》等相关规定,使用中国大陆节点服务器开办的网站,必须先办理网站备案,备案成功并获取通信管理局下发…

吴翰清澄清:从没黑过阿里网站!

前几日吴翰清辟谣网络传闻的“黑入阿里网站”、“马云下死命令留他”、“500万年薪”等信息,称这些均是假新闻。吴翰清微博全文:“这是个假新闻!请不要再消费我和阿里来赚流量了。我再澄清一次:1、我从没黑过阿里网站。2、宣传黑客…

idea 一直索引_长宁区360SEO优化服务,搜索引擎优化_上海持硕信息技术有限公司...

首页 > 新闻中心发布时间:2020-11-01 02:58:47 导读:上海持硕信息技术有限公司为您提供长宁区360SEO优化服务,搜索引擎优化的相关知识与详情: 在你的栏目页拥有较多的内容页时,就应该考虑相关推荐和指引性的链接导向&#xff0…

三年前红遍众筹网站,这款出自MIT的家庭机器人终于开卖了

本文来自AI新媒体量子位(QbitAI)图里这个产品你大概见过,但想不起来它的名字。 它是一个“家用社交机器人”,名叫Jibo,有黑白两色。现在说来,它的功能似乎和巨头标配的智能音箱有点重叠:能够作为…

建立网站需要什么条件_建立网站时需要了解的网站建设知识

网站建设的重点是最重要的。 根据不同客户的需求,此重要性具有不同的定义。 但是对于人们的直观定位而言,页面的美观度是一个不可忽视的重要因素。 网页设计彰显创造力。 许多人追求目标。 网页设计确实是网站建设中非常重要的一点,也是人们看…

python获取网站信息_关于python模拟登陆抓取网站信息

我想用requests实现在www.lu.com模拟登陆后抓取一些产品信息,通过chrome的抓包工具我抓到了登陆时的form data和header(变量header),以及访问需要抓取的页面时的header(变量listheader),但运行完程序后我输入r.url发现返回的地址是https://list.lu.com/n…

怎么避免后台被搜索_企业网站seo关键词优化怎么做?

关键词没有排名一切皆无。企业网站seo关键词优化到位一切皆有,怎么做好企业网站的关键词排名是困扰大部分seo从业者的问题。搜索引擎是一套程序,会按照程序的设定来判断一个网站的排序结果,从这个角度来讲,任何网站的优化点都是一…

python隐藏手机号码程序_Python网站手机号码解密的一种方法

黄页88网站反爬措施对手机号进行了一些加密处理。这里介绍一下怎么解密手机号码的方法。首先,我们看一下网站显示的手机号是这样的:显示的手机号使用ctrl c复制粘贴后变成了这样:复制后的手机号码而实际上,用Python爬虫获取到的内…

为什么大型网站前端使用PHP,后台逻辑却用Java?

来自:知乎链接:https://www.zhihu.com/question/20314377黄良懿,做做架构,写写代码前两周参加完 ThinkInLamp 的 PHP 架构师大会,听鸟哥一上午的分享,感慨很多,PHP 业界虽然方向不明荒废了两三年…