论分布式架构设计及其实现
- 摘要
- 正文
摘要
2023年2月,本人所在集团公司承接了长三角地区某省渔船图纸电子化审查项目开发,该项目旨在为长三角地区渔船建造设计院、渔船审图机构提供一个便捷化的服务平台。在次项目中,我作为项目成员参与了整个项目的建设工作,全权负责项目需求分析以及项目整体架构设计等工作。该项目以实现渔船图纸审查为统一目标,为渔船建造设计院、渔船审图机构、第三方技术审图单位提供一体化服务,推荐长三角地区渔船建造行业发展。我们依据以往现有的开发经验认为,分布式架构不仅能够集中式解决单一架构的性能瓶颈,还能提升系统的可用性、可靠性,并发性等多种软件质量属性,是现在大型软件系统构建的必备技术手段,本文以该项目为例,对系统进行了分层设计、存储层采用分区设计、应用层采用微服务架构,接入层采用负载均衡技术以及多机房部署方式,保证了系统的高性能需求。历时10个月,项目顺利上线,赢得了客户良好评价。
正文
近年来,随着国家对渔船建造行业的大力支持,以及渔船建造技术的快速发展,渔船建造的规模越来越大,因而导致渔船建造图纸审查数量也迅速增加,传统的纸质化审图已经越来越不能满足渔船建造设计院的需求,对于存在问题图纸的修改、审查,设计师往往奔走于设计院与审图机构之间,耗费大量的人力、物力、财力。2023年初,长三角地区某省为了推进渔船建造行业的一体化发展,实现渔船审图“”零跑腿”的业务需求,发起了渔船图纸电子化审查项目,该项目投资1000万元,计划10个月完成,并对项目进行了公开招标,我司成功中标。
接到系统开发任务后,我所在部门领导高度重视,第一时间专门开发小组,抽调骨干力量进行系统开发。本人有幸在该项目中担任系统架构师角色,全面主持了该项目的机构设计以及开发工作。经过项目组成员讨论,考虑到该项目对于性能、可靠性、可用性等软件质量属性要求较高,我们决定系统采用分层设计,并在分层设计基础上,分别实现了分布式架构设计,得到了项目组成员以及公司领导认可。
在项目之初,我充分分析项目特点,认识到项目建设难度较大,涉及到全省不同渔船设计院、不同渔船图纸审查机构,每天会有大量的渔船图纸信息审核,面图纸形式采用PDF格式,对于图纸的上传,以及加载预览,会占用大量的网络资源,对系统的性能要求较高;同时,考虑到该项目设计全省渔船设计院、以及审图单位,涉及用户较多,这也对系统的可用性是个巨大的挑战。因此,我们必须在架构的设计时保持严谨、正确、科学的方法,才能对项目的功能和质量起到保障作用。因此我们决定运用分布式存储、微服务、负载均衡、DNS等多种分布式架构理论方法,结合分层设计思想,确保系统的高性能、可用性、可靠性质量需求。下文将从系统分层角度,详述该项目中如何实施分布式架构方法。
一、分布式存储
由于存储层的各项性能指标将决定整个系统的性能,因此存储层的架构设计至关重要。本项目对分布式存储数据行了分区,分区方式有水平分区和垂直分区两种。水平分区是按照一定的分布策略,将数据分布到不同的节点(库、表等)去存储,常见的策略有范围分区、列表分区、hash分区。垂直分区是按照业务字段进行分类并拆分表格,分布存储到不同的节点。采用分区方案后,针对项读多,写少的特点,我们地每个存储节点设计成“主从集群”方式实现“读写分离”和数据的“多节点备份”。这样设计方案适用于性能一要求以较高的大规模存储系统,既提升了系统的整体并发性、数据存储的高可用性,又保证了数据的可靠性。
在该项目中,考虑到每天的图纸增量巨大,只靠单点集中式数据库是无法实现的。业务方面要求性能的同时,也对存储服务的可用性,数据存储的可靠性提出了需求,例如:可用性要达到99.99%,数据丢失率要小于0.001%。因此分布式存储的架构方案是该项目的不二之选,我们采取如下策略:
(1)确定基础技术的选型。我们选用Mysql开源数据库作为基础构件,来搭建分区的每个节点。在每个节点上使用两个“Mysql”实现“主从复制集群”,通过Mysql复制binlog,保证两者数据库的一致性。当主库出现问题时,自动化执行“主从切换”,升级从库为主库,继而提供数据库的读写服务,保证可用性。
(2)确定分区策略。为了确保谁存储的均匀性,采用了Hash的分布策略。对每条项目图纸数据记性Hash运算,并对节点数进行取模后,得到数据的应归属的存储节点。
(3)确定分区数量。经过负载压力测试,我们得到每个存储节点上Mysql从主从集群在16核32G内存500G普通SSD磁盘的配置下,在可接受的延时范围内,可以达到要求的性能目标。
(4)确定透明性等级。为了让应用层更方便的访问数据库,我们选用了Sharding Poxy数据库代理构件,向应用层屏蔽了存储层细节,达到了"分片透明性"等级。这样应用层访问分布式数据库时,可以像访问单点数据库一样。
二、微服务化 “微服务化”主张将一个大型的单体应用拆分成一组小的服务,服务之间相互协作,实现业务功能。每个服务运行独立的进程中,采用轻量级的通信机制,保证了每个小服务的封装性、可重用性,易维护性、易扩展性,用以解决复杂的业务逻辑问题,同时,拆封为多个小的服务有利于实现系统的高并发、高性能、高可用性。
应用层架构需要满足应用方提出的最大100万并发用户指标。因此我们采用了微服务设计架构,微服务提供了服务的弹性扩展能力,以及并发的扩展能力。业务层我们选用Java的Spring框架,来实现面向用户的服务,把系统图纸上传、提交、审核封装成了WebService服务。在模拟压力测试下,并发量100万时,系统资源使用基本保持在75%左右,进而确保了系统的高并发性能;
三、负载均衡 通常接入层都会有一个Web服务器,它首先接收到客户端请求,然后将请求传递给应用层某个服务器去处理。此时,它就充当了“负载均衡”功能,决定如何选取应用服务器。常见的负载均衡策略有轮询法、随机法、原地址Hash法、键值范围等静态策略,还有最小连接数法、最快响应迅速调度法等动态策略。它对于整个系统分布式架构具有“疏导”作用,也可以提供“限流”“断熔”等高级负载均衡。
在本项目中,应用层拥有庞大的应用层服务器,需要在接入层选用高性能的Web的服务器,来充当负载均衡器。经过仔细分析和调研,我们最终选择了Nginx来担当Web服务器,并选用了最小连接数法作为负载均衡侧率。这可以让每个应用层服务器获取平均网络连接数,使得每个服务的响应用户数基本相等,从而尽可能提高应用层服务器利用效率。
得益于个层面分布式架构方案的实施,渔船图纸审查项目质量指标顺利完成。经过全体成员历时10个月的艰苦奋战,我们终于按期完成了项目目标,并于2023年10月完成了项目的验收以及试运行测试,最终于12月底全面正式上线运行。在试运行过程中,项目运行稳定,并获得了某省渔船设计院、审图机构的一致好评。但在项目建设过程中也存在一些不足,例如:图纸存放与系统发布在同一台服务,导致图纸大量存在的情况下,大量空间资源被占用,导致服务器性能略有下降,因而我们采用多服务器部署策略,发布程序占用一台服务器,图纸资源存储另一台服务器,进而解决了因图纸资源占用空间问题导致服务性能下降问题。通过该项目,让我更深刻的意识到,分布式架构方案是现代软件建设的关键技术,它关系着项目的成败,我会继续学习架构技术,使得在今后的项目中更能发挥自身力量。