2013年下半年试题四:论分布式存储系统架构设计及其实现
论文库链接:系统架构设计师论文
论文题目
相对于传统的集中式计算或集中式存储,分布式架构是将数据存储能力和计算能力分布到不同的服务器上,作为一个整体对外提供服务。分布式架构能解决集中式架构单点故障导致的服务中断,提高系统的可靠性和可用性,是互联网大厂普遍采用的一种架构模式。
请围绕“论分布式架构设计及其实现”论题,依次从以下三个方面进行论述。
1.概要叙述你所参与管理或开发的软件项目,以及你在其中所承担的主要工作。
2.阐述至少4种以上常见分布式技术,并对它们的内涵和适用范围进行简述。
3.结合项目,具体阐述如何基于分布式架构进行软件设计和实现。
论文参考
论分布式架构设计及其实现
摘要
本文以我参与的某公司“酒业上云”项目为例,论述了分布式架构的设计方法和实现过程。该项目的目标是构建以某酒厂生产的白酒产品为主的电子商城,实现该酒厂的线下营销升级为在线营销的战略目标,包括线上抢购、支付、线下原厂配送、防伪溯源等一系列电子商务功能。在此项目中,我作为系统架构师及主要管理人员,参与了该项目的需求开发、系统架构设计等主导工作。我们依据现有的开发实践经验认为,分布式架构不仅能解决集中式架构的单点性能瓶颈,还能够提升系统的可靠性、可用性、并发性等多种软件质量属性,是现代电子商务系统构建的必备技术手段。我们对系统进行了分层设计,存储层采用分区设计,应用层采用微服务架构,接入层采用负载均衡技术及多机房部署方式,保证了业主方对于秒杀场景的高性能需求目标。最后项目成功上线,赢得了客户的好评。
正文
近年来,随着互联网科技的发展,中国电子商务发展迅速,变得和我们日常生活息息相关,也受到了越来越多企业的关注。2021年下半年,某著名酒业公司决定发展电子商城及线上促销业务,发起了“酒业上云”项目,实现线上抢购、支付、线下原厂配送、防伪溯源等一系列电子商务功能。该项目投资3000万元,计划6个月完成,并对项目进行了公开招标,我公司成功中标。2021年10月,我作为该项目的系统架构师,全面负责“酒业上云”项目的架构设计工作。经全员讨论,系统在分层设计的基础上,在各层分别实践了分布式架构设计,得到了项目组成员和公司高层的认可。
在项目之初,我充分分析了项目特点,认识到项目建设难度较大。由于业主方是一个广受欢迎的白酒品牌,可以预见到电子商城App一旦发布,特定的销售策略会引来海量用户的注册、登录、抢购,因此甲方公司对于整体系统性能要求极高。我们必须在架构设计时保持严谨、正确、科学的设计方法,才能对项目的功能和质量目标起保障作用。因此我决定运用分布式存储、微服务、负载均衡、DNS等多种分布式架构理论及设计方法,结合分层设计的架构思想,力争实现业主方提出的100万最大并发用户、300万最高tps、延时最高不超过500ms的秒杀场景的质量需求。下文将从系统分层的角度,详述在该项目中如何实施分布式架构方法。
一、分布式存储
由于存储层的各项性能指标将决定整个系统的性能,因此存储层的架构设计至关重要。本项目对分布式存储数据进行了分区,分区方式有水平分区和垂直分区两种。水平分区是按照一定的分布策略,将数据分布到不同的节点(库、表等)去存储,常见的策略有范围分区、列表分区(枚举分区)、hash分区。垂直分区是按业务字段进行分类并拆分表格,分布存储到不同的节点。采用分区方案后,针对本项目读多写少的特点,我们对每个存储节点设计成“主从集群”方式实现“读写分离”和数据的“多节点备份”。这样的设计方案适用于性能要求较高的大规模存储系统,既提升了系统的整体并发性、数据存储的高可用性,又保证了数据的可靠性。
在该项目中,300万tps的订单数据想要高效地、可靠地保存到数据库,只靠单点集中式数据库是无法实现的。业务方要求性能的同时,也对存储服务的可用性、数据存储的可靠性提出了需求,例如可用性要达到99.9999%,数据丢失率要小于0.0001%。因此分布式存储的架构方案是该项目的不二之选。我们采取的策略如下:
(1)确定基础技术的选型。我们选用MySQL开源数据库作为基础构件,来搭建分区的每个节点。在每个节点使用两个MySQL组成“主从复制集群”,通过MySQL的binlog复制,保证两者数据的一致性。当主库出现问题时,自动化执行“主从切换”,升级从库为主库,继续提供数据读写服务,保证可用性。
(2)确定分区策略。为了确保数据存储的均匀性,采用了hash的分布策略。对每一个订单的关键信息进行hash运算,并对节点数进行取模后,得到该订单应该归属的存储节点。
(3)确定分区数量。经过负载压力测试,我们得到每个存储节点上的MySQL主从集群在16核32G内存500G普通SSD磁盘的配置下,在可接受的延时范围内,能够达到3万tps的性能指标。因此我们决定用100个分区节点来达到300万的tps指标。
(4)确定透明性等级。为了让应用层更方便地访问数据库,我们选用了Sharding Proxy数据库代理构件,向应用层屏蔽了存储层的细节,达到了“分片透明性”等级。这样应用层访问分布式数据库时,就像访问单点数据库一样简单。
在落实这些策略后,我们满足了客户所要求的数据存取性能指标,为整个系统的质量达标奠定了基础。
二、微服务化
“微服务化”主张将传统的单体应用拆分成一组小的服务,服务之间相互协作,实现业务功能。每个服务运行在独立的进程中,采用轻量级的通信机制协作,保证了每个小服务的封装性、可重用性、易维护性、易扩展性,用以解决业务的复杂性问题。拆解出来的多个小服务有利于实现系统的高并发、高性能、高可用性。
应用层架构需要满足业主方提出的最大100万并发用户指标。因此我们采取了微服务设计方案,微服务能提供服务的弹性扩展能力,以及并发的扩展能力。业务上我们选用Java的Spring框架,来实现面向用户的业务服务,把电子商城的订单、支付、防伪、溯源,封装成Web Service。在300万tps的模拟用户压力测试下,不断调整和优化微服务的数量,让应用层的整体资源使用率保持在75%左右,由此确定了各业务微服务的集群数量。
三、负载均衡
通常接入层都会有一个Web服务器,它首先接收客户端的请求,然后将请求传递给应用层的某台服务器去处理。此时它就充当了“负载均衡”功能,决定如何选取应用服务器。常见的负载均衡策略有轮询法、随机法、源地址哈希法、键值范围法等静态策略,还有最小连接数法、最快响应速度法等动态策略。它对于整个系统的分布式架构具有“导流”的作用,也可以提供“限流”“熔断”等高级负载均衡策略。
本项目中,应用层拥有庞大的应用层服务器,需要在接入层选用高性能的Web服务器,来充当负载均衡器。经过仔细分析和调研,我们最终选择了Nginx来担当Web服务器,并选用了最小连接数法作为负载均衡策略。这可以让每个应用层服务器获取平均网络连接数,使得每个服务的响应用户数基本相等,从而尽可能地提高应用层服务器的利用效率。
在该项目中,由于有秒杀业务的场景,所以为了避免单机房的流量瓶颈,更靠近用户来提供服务。由此,我们采用了建设多机房的方案,我们在北京、上海、深圳、贵阳四地建设了4个机房,分别服务华北、华东、华南、华西的用户。每个机房都有两个接入IP,全部绑定同一个域名。DNS会将域名解析为离访问用户最近的IP地址,这样就可以把全国的用户按照地理位置分配给不同的机房,从而实现更高层面的“负载均衡”。
得益于各层面分布式架构方案的综合实施,“酒业上云”项目质量指标顺利达成。经过全体成员历时6个月的艰苦奋战,我们终于按期完成了项目目标,并于2022年4月1日试运行及验收测试,于5月1日正式全面运营。并且第一次秒杀活动系统运行平稳,顺利通过大考。但是项目建设过程中也存在一些不足,由于疫情的原因很多同事无法现场办公,影响了沟通的效率。我们采取了视频电话+邮件确认的制度,保证每个同事的信息共享,解决了信息传达的问题。所以,分布式架构方案是现代软件建设的关键技术,它关系着一个项目的成败。我会继续学习架构技术,使得架构能力更上一层楼。