系统架构设计师论文分享-论分布式数据库技术及应用

我的软考历程

摘要

2023年2月,我所在的公司通过了研发纱线MES系统的立项,该项目为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的数字化和智能化水平,我在该项目中担任系统架构设计师一职,负责该项目的架构设计工作。本文结合我在该项目中的实践,详细论述了分布式数据技术及其应用。在该项目中,会接入众多纱线工厂的全部设备的生产数据,数据量巨大,如果采用传统的单体关系型数据库,难以支撑起这庞大的数据。基于此,我们设计了分布式数据库的方案,并通过数据冗余的方式保存了时序性的生产数据。本文详细论述了设计的过程和方式,通过分布式数据库的加持,该项目最终在2023年12月正式上线,至今运行稳定,各项功能和性能指标均达到了客户的要求。

项目背景

随着我国从制造业大国升级为制造业强国以及工厂数字化和智能化的持续推进,我所在的某地某科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化等系统,这些系统上线后,得到了工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统总投资730万,开发周期10个月,涵盖纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的智能决策分析能力。该项目采用物联网层次架构,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以上功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的提升。

论述内容

本项目极为庞大,涉及工厂模块众多,业务逻辑复杂,每一家工厂具有几百台机器,每台机器都具有多个采集模块,然后秒级上报,等数据到了纱线MES系统就非常海量了。如果采用传统的单体架构,则系统在运行一段时间后,将会面临明显的性能下降。为了避免这种情况的发生,我们采用分布式数据库,分布式数据库具有良好的可伸缩性,底层采用冗余存储,能保证数据的高可用性,上层对外提供全局外模式,能让开发者像用单体数据库一样。基于分布式数据库的特点,我们使用开源的Mysql数据库,然后通过主从分离加上分库分表,保证了系统的高性能、高可用性。下面是具体的过程,同时在该过程中解决了分布式数据库的一系列问题。

一、以主从集群实现高可用特性。

项目中的生产数据是整个系统最重要的数据,它记载了并条、粗纱、细纱、络筒、温度、湿度等核心生产数据。因此为了生产数据存储的可靠性和可用性,我们选用1主1备的mysql主从结构,来实现生产数据的主备存储。在实际项目中,我们分析业务发现主备数据之间需要保持强一致性,从而避免备库尚未同步到最新数据前,主库发生不可恢复的异常,导致发生数据丢失的风险。在mysql支持的三个同步模式中,半同步模式是我们最佳的选择,它需要等待数据同步到一个备库后(不会等待备库提交到存储引擎),才在主库提交并返回客户端操作完成,所以这个模式保证了数据存储两份的同时,也兼顾了性能开销成本。另外,为了实现主从切换自动化,我们编写了切换脚本,并能够在检测到主库异常时自动执行,实现了主库异常时在10秒内自动切换到备库,提升了可用性,降低了人工操作的成本。主从复制的数据库架构提供了我们实现读写分离的基础,我们将主库承担数据更新的操作,而备库则承担数据只读的操作,这种读写分摊的方式提升了系统的请求处理能力,也提升了1主1备结构的硬件利用率,从而降低了总成本。

二、分库分表设计实现容量提升。

前文主从结构的设计,主要解决了存储的可靠性和可用性,而对于系统的并发存储能力和存储容量则需要采用分库分表设计。实现分库分表的重要前提是要对存储的数据进行合理的分片。垂直分片很容易根据业务数据类型来划分成不同的数据表,而水平分片则需要处理棘手的热点均衡的问题。水平分片有三种方法:范围分片、枚举分片、hash分片。能保证热点均衡的是hash分片,因此我们对访问频度最高的生产数据进行hash分片:将生成数据的关键数据进行hash运算,得出一个能保证随机的长整型数值。再将其对分片数进行取模,即得到该生产数据应该存放到哪个分片。我们针对系统的每日生产数据量和未来发展,经过严密的容量规划和计算,决定用16个存储节点来承担生产数据的分片存储,而每一个存储节点都是一个主从结构。综合使用主从复制和分库分表,既保证了系统的访问性能要求,也保证了数据存储的可用性和可靠性。

三、架构代理服务解决透明性问题。

分布式数据库的使用给系统底层存储带来了优良特性,但其也有缺点,其中之一就是应用层代码不得不面对复杂的底层分布式数据库。为了解耦两者的互相影响,就需要中间架设代理服务,向上层应用代码屏蔽底层的异构性,就像使用单台数据库一样简便,这就是分片透明性。我们经过严格考察和测试,选用了开源组件sharding-proxy作为基础,搭建代理集群,把分库分表的路由规则实现在代理层面。应用层向代理集群中任意一个节点提交sql语句,该节点经过hash取模判断数据的存储节点,并进行自动转发sql语句,收集sql执行结果给应用层。由于代理服务的存在,使得应用层业务模块的开发人员只需要关注业务逻辑,无需关心存储细节,极大解耦了应用层和存储层。

总结

通过采用搭建分布式数据库的方式,我们有效地提升了系统的性能、数据容量以及可用性,为大量工厂的接入提供了条件。最终在2023年12月,该项目正式投产并对外提供服务,至今稳定运行,各项功能和性能指标均达到了客户的要求,得到了客户工厂和公司领导的一致好评。虽然项目取得了成功,但是也遇到过一些问题,在项目初期,由于产品对纱线业务没有彻底熟悉,导致一部分功能的调整和返工,这打击了开发人员的士气,基于此,我提出两个解决方案:1、派产品进入工厂一线,与工人交流,熟悉操作流程,彻底摸清纱线业务,保证需求质量;2、开发人员也要学习纱线业务,遇到问题反馈给产品,同时在做设计时采用灵活的设计模式,为需求的变动留下可操作的空间。我们通过这两个方法解决了这个问题,保证了项目的进展。通过这次实践,我不仅学习到了分布式数据库相关技术,也锻炼了自己的架构和管理能力,我认识到只有不断地学习、不断的实践才能真正掌控知识和技术,才能在未来的工作中勇担大任,为国家的信息化建设发光发热。

你可能感兴趣的:(系统架构,分布式,数据库)