大型分布式 Web 系统的架构演进
架构之美
共 6952字,需浏览 14分钟
· 2021-07-08
用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理
阶段二、应用服务器与数据库分离
阶段三、应用服务器集群
1、负载均衡的问题
HTTP重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群
优点:简单易用; 缺点:性能较差。
DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP。
优点:交给DNS,不用我们去维护负载均衡服务器; 缺点:当一个应用服务器挂了,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务商那里,网站无法做更多的改善和更强大的管理。
在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的Apache,Nginx都可以充当反向代理服务器。
优点:部署简单; 缺点:代理服务器可能成为性能的瓶颈,特别是一次上传大文件。
在请求到达负载均衡器后,负载均衡器通过修改请求的目的IP地址,从而实现请求的转发,做到负载均衡。
优点:性能更好; 缺点:负载均衡器的宽带成为瓶颈。
在请求到达负载均衡器后,负载均衡器通过修改请求的MAC地址,从而做到负载均衡,与IP负载均衡不一样的是,当请求访问完服务器之后,直接返回客户。而无需再经过负载均衡器。
2、集群调度转发算法
顾名思义,轮询分发请求。
优点:实现简单 缺点:不考虑每台服务器的处理能力
我们给每个服务器设置权值Weight,负载均衡调度器根据权值调度服务器,服务器被调用的次数跟权值成正比。
优点:考虑了服务器处理能力的不同
提取用户IP,根据散列函数得出一个key,再根据静态映射表,查处对应的value,即目标服务器IP。过目标机器超负荷,则返回空。
优点:实现同一个用户访问同一个服务器。
原理同上,只是现在提取的是目标地址的IP来做哈希。
优点:实现同一个用户访问同一个服务器。
优先把请求转发给连接数少的服务器。
优点:使得集群中各个服务器的负载更加均匀。
在lc的基础上,为每台服务器加上权值。算法为:(活动连接数 * 256 + 非活动连接数) ÷ 权重,计算出来的值小的服务器优先被选择。
优点:可以根据服务器的能力分配请求。
其实sed跟wlc类似,区别是不考虑非活动连接数。算法为:(活动连接数 +1 ) * 256 ÷ 权重,同样计算出来的值小的服务器优先被选择。
改进的sed算法。我们想一下什么情况下才能“永不排队”,那就是服务器的连接数为0的时候,那么假如有服务器连接数为0,均衡器直接把请求转发给它,无需经过sed的计算。
负载均衡器根据请求的目的IP地址,找出该IP地址最近被使用的服务器,把请求转发之。若该服务器超载,最采用最少连接数算法。
负载均衡器根据请求的目的IP地址,找出该IP地址最近使用的“服务器组”,注意,并不是具体某个服务器,然后采用最少连接数从该组中挑出具体的某台服务器出来,把请求转发之。若该服务器超载,那么根据最少连接数算法,在集群的非本服务器组的服务器中,找出一台服务器出来,加入本服务器组,然后把请求转发。
3、集群请求返回模式问题
负载均衡器接收用户的请求,转发给具体服务器,服务器处理完请求返回给均衡器,均衡器再重新返回给用户。
负载均衡器接收用户的请求,转发给具体服务器,服务器出来玩请求后直接返回给用户。需要系统支持IP Tunneling协议,难以跨平台。
同上,但无需IP Tunneling协议,跨平台性好,大部分系统都可以支持。
4、集群Session一致性问题
Session sticky就是把同一个用户在某一个会话中的请求,都分配到固定的某一台服务器中,这样我们就不需要解决跨服务器的session问题了,常见的算法有ip_hash算法,即上面提到的两种散列算法。
优点:实现简单; 缺点:应用服务器重启则session消失。
Session replication就是在集群中复制session,使得每个服务器都保存有全部用户的session数据。
优点:减轻负载均衡服务器的压力,不需要要实现ip_hasp算法来转发请求; 缺点:复制时网络带宽开销大,访问量大的话Session占用内存大且浪费。
Session数据集中存储就是利用数据库来存储session数据,实现了session和应用服务器的解耦。
优点:相比Session replication的方案,集群间对于宽带和内存的压力大幅减少; 缺点:需要维护存储Session的数据库。
Cookie base就是把Session存在Cookie中,由浏览器来告诉应用服务器我的session是什么,同样实现了session和应用服务器的解耦。
优点:实现简单,基本免维护。 缺点:cookie长度限制,安全性低,带宽消耗。
Nginx目前支持的负载均衡算法有wrr、sh(支持一致性哈希)、fair(lc)。但Nginx作为均衡器的话,还可以一同作为静态资源服务器。 Keepalived + ipvsadm比较强大,目前支持的算法有:rr、wrr、lc、wlc、lblc、sh、dh Keepalived支持集群模式有:NAT、DR、TUN Nginx本身并没有提供session同步的解决方案,而Apache则提供了session共享的支持。
阶段四、数据库读写分离化
主从数据库之间数据同步问题。 应用对于数据源的选择问题。
使用MySQL自带的Master + Slave的方式实现主从复制。 采用第三方数据库中间件,例如MyCat。MyCat是从Cobar发展而来的,而Cobar是阿里开源的数据库中间件,后来停止开发。MyCat是国内比较好的MySql开源数据库分库分表中间件。
阶段五、用搜索引擎缓解读库的压力
搜索引擎具有的优点:它能够大大提高查询速度和搜索准确性。
引入搜索引擎的开销
带来大量的维护工作,我们需要自己实现索引的构建过程,设计全量/增加的构建方式来应对非实时与实时的查询需求。 需要维护搜索引擎集群
搜索引擎并不能替代数据库,它解决了某些场景下的精准、快速、高效的“读”操作,是否引入搜索引擎,需要综合考虑整个系统的需求。
阶段六、用缓存缓解读库的压力
- 应用层和数据库层的缓存 -
另外,在某些场景下,关系型数据库并不是很适合,例如我想做一个“每日输入密码错误次数限制”的功能,思路大概是在用户登录时,如果登录错误,则记录下该用户的IP和错误次数,那么这个数据要放在哪里呢?假如放在内存中,那么显然会占用太大的内容;假如放在关系型数据库中,那么既要建立数据库表,还要简历对应的Java bean,还要写SQL等等。而分析一下我们要存储的数据,无非就是类似{ip:errorNumber}这样的key:value数据。对于这种数据,我们可以用NOSQL数据库来代替传统的关系型数据库。
页面缓存
优点:减轻数据库的压力, 大幅度提高访问速度; 缺点:需要维护缓存服务器,提高了编码的复杂性。
缓存集群的调度算法不同与上面提到的应用服务器和数据库。最好采用一致性哈希算,这样才能提高命中率。
阶段七、数据库水平拆分与垂直拆分
- 数据垂直拆分 -
解决了原来把所有业务放在一个数据库中的压力问题; 可以根据业务的特点进行更多的优化。
需要维护多个数据库的状态一致性和数据同步。
需要考虑原来跨业务的事务; 跨数据库的Join。
应该在应用层尽量避免跨数据库的分布式事务,如果非要跨数据库,尽量在代码中控制。 通过第三方中间件来解决,如上面提到的MyCat,MyCat提供了丰富的跨库Join方案,详情可参考MyCat官方文档。
- 数据水平拆分 -
如果能克服以上问题,那么我们将能够很好地对数据量及写入量增长的情况。
访问用户信息的应用系统需要解决SQL路由的问题,因为现在用户信息分在了两个数据库中,需要在进行数据操作时了解需要操作的数据在哪里。 主键 的处理也变得不同,例如原来自增字段,现在不能简单地继续使用。 如果需要分页查询,那就更加麻烦。
我们还是可以通过可以解决第三方中间件,如MyCat。MyCat可以通过SQL解析模块对我们的SQL进行解析,再根据我们的配置,把请求转发到具体的某个数据库。我们可以通过UUID保证唯一或自定义ID方案来解决。 MyCat也提供了丰富的分页查询方案,比如先从每个数据库做分页查询,再合并数据做一次分页查询等等。
阶段八、应用的拆分
按微服务拆分应用
这样拆分后,可能会有一些相同的代码,如用户相关的代码,商品和交易都需要用户信息,所以在两个系统中都保留差不多的操作用户信息的代码。如何保证这些代码可以复用是一个需要解决的问题。
通过走服务化SOA的路线来解决频繁公共的服务。
走SOA服务化治理道路
相同的代码不会散落在不同的应用中了,这些实现放在了各个服务中心,使代码得到更好的维护。 我们把对数据库的交互业务放在了各个服务中心,让前端的Web应用更注重与浏览器交互的工作。
如何进行远程的服务调用?
可以通过下面的引入消息中间件来解决。
阶段九、引入消息中间件
作者:xiaojiaqi
来源:github.com/xiaojiaqi/10billionhongbao
评论
真高!比亚迪员工爆料比亚迪在越南的薪资水平:基本工资480万,全勤奖35万,交通补助20万,餐补110万,每周6天,每天10小时
上一篇:某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...对此,你怎么看?--完--PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。全文完,感谢你的耐心阅读。如果你还想看到我的文章,请一定给本
开发者全社区
0
某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...
上一篇:字节的跳动职级与薪资(2024年)我们与公司间的合作,宛如两艘船只在茫茫大海上相互依靠,共同抵御风浪,携手驶向成功的彼岸。然而,当航向开始产生分歧,或是波涛汹涌的风浪改变了我们的初衷,我们或许应当冷静地选择和平分手,而非在风雨中硬撑。最近,一位网友的遭遇引起了广大职场人的关注和热议。这位网友
开发者全社区
0
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
字节的跳动职级与薪资(2024年)
上一篇:阿里公布年终奖,P7, 3.5+,22W年终奖,还有35W长期现金激励,真香字节跳动自2012年3月成立以来,已经迅速成长为一个全球性的科技公司。其产品和服务已经遍布全球150多个国家与地区,并且支持超过75种不同的语言。在字节跳动的官方网站上,列出了一系列引人注目的产品和服务,包括但不限于
开发者全社区
0
盘点Lombok的几个骚操作,你绝对没用过!
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
0