基于MongoDB的高并发高可用政府云平台架构实践

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 3月12日下午在阿里巴巴西溪园区,举行了MongoDB杭州用户交流会。微软MSDN特邀讲师徐雷分享《基于MongoDB的政府云平台高并发高可用HA架构实践 》,从自身实践出发,讲述了政府云平台分层、技术栈选型、物理架构、API架构及DB数据库架构的设计思路和方法。

3月12日下午在阿里巴巴西溪园区,举行了MongoDB杭州用户交流会。微软MSDN特邀讲师徐雷分享《基于MongoDB的政府云平台高并发高可用HA架构实践 》,从自身实践出发,讲述了政府云平台分层、技术栈选型、物理架构、API架构及DB数据库架构的设计思路和方法。

 

以下内容根据现场分享和演讲PPT整理而成。

 

学习MongoDB的重要性


目前,几乎所有国内外的互联网大公司都在用MongoDB,学习企业需要的技术很重要。

 

MongoDB优点

0b19849b0030114736bab3622bd4bad984185bd9

 

相比较关系型数据库而言,MongDB有两个明显的优点:灵活的数据模型和便于横向扩展。


灵活的数据模型:作为一位网站开发者,最痛苦的就是需求变更,MongDB可以接受字段的不断修改,非常灵活。


便于横向扩展: 如果有海量数据存储,这时可以做Sharding,非常容易,这个是MongDB本身已经支持的。传统的关系型数据库在这一块比较难实现,因为它会由很多固有的设计缺陷导致。但传统关系型数据库的分片思想和MongDB分片思想其实很像,从算法的角度来说,没有太大区别,比如基于范围进行分片,这两个是通用的。


高并发与高可用架构关键点


程序员一般追求高并发,对于高并发这个关键词容易产生兴奋点。作为架构师设计一个架构,如果要支持某个级别的并发,一定要注意:不是用Redis就是高并发,不是用MongDB就是高并发。高并发高可用架构关键点包含:多线程、分布式通信RPC、集群、负载均衡、网络与硬件、监控与诊断等。比如Java有多线程、高并发的问题,如果涉及到分布式通信RPC 、分布式架构的话,一定会有一些RPC的技术,会有线程通信、进程间的通信出现,这些在不同框架中都有对应的实现。架构师在设计架构时,需要深入研究。

 

集群:是不是一定要用集群?不一定。一般小规模公司才用3-5台服务器,大规模公司用128G、256G、甚至2T的服务器内存,连数据和索引都进服务器。MongDB在数据量非常大的时候,比如你有16G内存,发现它很慢,有一个很重要的问题,稍微研究下底层的算法,会发现MongDB在使用索引结构进行数据查询的时候,它需要对索引进行遍历,如果能整体进内存最好,如果不能整体进内存,它就部分加载,这样的话就更慢,因为涉及到一个磁盘内存问题。

 

负载均衡:假设用了集群,比如有10台web服务器,需要做负载均衡,可以用业内比较成熟的实现方案,比如阿里云、微软云、亚马逊云,直接配置就可以用。如果要构建私有云,或者数据中心的话,需要想一些负载均衡的方案。比如业内比较流行的,软负载均衡,反向代理负载均衡。

 

网络和硬件:这也是高并发的前提。比如10w并发,平均一个消息多大,估算一下网络流量,不要说不管带宽是5M,还是10M,就要10w并发,这需要看硬件的服务器配置,所有的高并发一定是个完整的体系,不是说在某个点上,写段代码就高并发了。所以现在看到的高并发系统,一定是经过无数次的迭代。

 

监控与维护:这是运维最头疼的。因为运维每天晚上需要远程登录看机器正常不正常,影响正常休息,所以现在也提出了自动化运维概念。

 

政府云平台背景


 f4b85191dca286d6b1513a0cdd10523c8041cc28


政府也需要进行转变,他们希望把整个政府平台信息化,构建统一高效的政府云平台。比如税务的信息化、公务人员考核的效率化等。

 

基于前面说到的,设计的架构一定要微观上+宏观上高并发,不能说了搭了几层就是高并发架构,首先要看写的代码,如果在后台就产生了大量问题,大量bug,怎么能够高并发,从前端到后台是一条链,任何一个节点出问题,都会影响整个系统架构。

 

政府云平台分层架构图


e7d9d7d433726f7f69f7c3e948b56aff6835cee8

 

从上图显示,这个架构系统不是只有关系型数据库,或者NoSQL数据库。因为这个场景是比较特殊的。对于政府官员考核的指标比较多,每个指标量化单位不一样,考核数据模型是会变化的,会导致数据的不确定性。这个时候比较适合用NoSQL,如果用传统关系型数据库的话,开发就需要天天改数据层的表。

 

参考上图,我们做的技术并不仅仅是一种技术,需要考虑传统PC端,也要考虑移动端的问题。这里作为服务治理层,或者服务层,这里服务治理层不仅是服务层,因为希望对服务做一个统一的规划和安排。另外希望后期加一些自动化运维和监控的知识,包括现在比较新的微服务的概念,这是设计的思路。

 

协议的话,也没有固定只用http这一个,也没有只用soap协议。可能大家会说因为你对 SOA 架构比较熟,但其实今天所有的系统架构,这个叫SOA的概念已经存在。不是说用哪个框架,就一定能解决问题,不推荐这种方式。如果涉及到移动端,可能会用到MQTT协议,如果是页面应用的话,可能会用到最新的web socket。

 

业务逻辑层上,分层不是越多越好,而是根据需要分层,分完层之后是否方便后期扩展。比如业务逻辑层,Java和.NET里面都有分层的思想,这个部分把业务逻辑独立出来,不影响其它层。需要注意一下,这里用到Redis,前面讲过高并发的系统应用,Redis我们推荐。如果公司有能力开发一套缓存系统可以开发,比如阿里巴巴的RocketMQ消息队列,如果开发不了,就用开源成熟的产品。Redis目前是最流行的开源的免费缓存,它属于NoSQL的范畴,这两个结合和MongDB不冲突。MongDB能够解决10000个并发,一般公司够用。如果遇到峰值的时候,可以用兔子消息队列,让其帮助从中加一层,来缓解数据库压力。缓存技术除了加速以外,还可以充当请求缓存池,用于处理一些不太着急的请求。

 

再说一个问题,这里不论是Java和.NET,连接数据库的技术都是差不多的,都有连接池,都有多线程,而且垃圾回收的机制也差不多。同样如果想对传统型关系数据库或者NoSQL数据库做研究的话,可以看下NoSQL并发有很重要的问题,传统关系型数据库是不强调事务的,但是传统的NoSQL数据库,从诞生之初开始,高并发是它很重要的一个特点。目前NoSQL也开始支持事务,但是部分事务,不完整。关于MongDB有很多坑,因为它有几个存储引擎,这个有点像MySQL,MySQL也有几个开源的存储引擎,每个存储引擎都不一样,要用这个数据库的话,需要注意使用版本、存储引擎,需要在官方文档上确认一下。

 

政府云平台技术栈选型

 

a409009b4675eb843331954b5c2afed6ce6379fb


Java底层和.NET底层原理是相通的,数据结构的算法基本上一样。但为什么有些是Java做的,有些是.NET做的,这里面我们会用到。反向代理考虑到尽量是免费的,节省成本。涉及到一些日志框架,建议用最成熟的框架,这里没有平台或者语言系统的偏见。用Docker方便运维。

 

政府云平台SOA架构设计

 

e3f61924d584e8f5410adf03843d39cbb7ac62ee


现在有手机定位,自动驾驶,政府也在考虑这些问题。比如政府希望看到各省县长的履历,进行优先提拔;比如要防控房地产的问题,房价波动厉害,需要了解房地产的交易资金,房地产大数据等,任何一个指标政府都希望能看到。SOA叫做面向服务的架构,是基于服务来集成现成的系统,这个架构没有过时。

 

政府云平台新SOA架构:ESB+微服务


00dfc1a205a6048a71725584aa2553fadcec83b4

 

这些架构如果开始做的话,两个系统直接服务集成,后面更复杂的问题来了,像阿里巴巴自己做了一个服务框架叫Dubbo,它里面有服务治理的事项,也有微服务的特点。作为一名技术人员,一定要注意它的试用场景,如果没有这些框架,能不能做个类似的功能?

 

这里面涉及到一个问题,如果后期系统特别多,最好有一个中间件平台的概念出来。这样在服务治理的过程中,可以更好的规划系统架构,而不是所有系统之间随便连接。随便连接的后果是,后期所有系统接口都是乱的,系统越多,乱的越厉害。比如早期是webservice,有可能后期改成TTP,或者改成HTTP等等一些新型的协议。

 

另外,这还涉及到高并发高可用的问题。网站选一个高并发的框架,在网站上要求1w个并发,一台服务器支持1w/秒的并发,接下来你想要10w的,一定要想办法进行横向扩展,当然如果企业特别有钱,可以把服务器换成1T的内存。还有一个高可用指标,比如每秒是1w个并发,更新一下直接挂掉,这是不行的。

 

省级单位政府云平台物理架构


d66b6415b5e924b151b5fb771d5211a8631bc39c

 

物理架构和逻辑架构不同,逻辑架构可以分10层、100层都可以,但不是分层越多越好。分层越多,解耦越厉害,越影响性能。很多人不管设计什么架构,先分个三层,不管需不需要,直接把接口用webservice包容。这里一定要根据需要做判断。

 

MongDB做集群,做高可用。首先,保证物理安全,服务器不要坏掉;然后,MongDB可以支持数据直接加密,金融数据不安全的话,数据永久加密。MongDB3.4版本之后加了金融的数据类型。

 

MongDB可以做可复制性集群,这里可以一对多,但是有个问题,它可以实现自动化过程转移,如果说数据访问层开发的比较好的话,使用了较新的驱动,无论是Java还是C sharp ,它可以自动化来切换。在这个集群中,它自动会找一台新的节点出现,来替代主节点。这是相对于传统数据库MongDB做的好的地方。作为运维只要把web关系层配好,就不用担心哪台服务器在服务,直接可以自动化切换,图片服务器和缓存服务器,也不是所有的数据都进缓存,有部分数据为了缓解压力,把用户资料的数据可以放到缓存里,这样可以从缓存里拉所有数据。

 

负载均衡的话,用硬件软件都可以,负载均衡如果只用一台服务器,风险较高。CDN从单数据中心扩展到多数据中心也可以,一般公司还用不到多个数据中心。

 

政府云平台服务治理API架构设计

 

所有系统上线之后,不是简单的开发和发布,后期系统需要跟其它平台进行对接,会有一个服务组件的中间件平台,可以用开源的,也可以用商用的,比如Oracle、SAP、微软、阿里巴巴的中间件平台。中间集成可能会有不同的协议,这里面会涉及到很多问题,Redis后面可能会换成消息队列,比如一个5年考核指标,一个月内的数据量比较大,这个时候数据库肯定要持久化,有些内容放到MongDB,有些会放到传统的关系型数据库里面,需要提前做一些预测。再注意一个问题:这里的数据web层和访问层,全部都是集群。Redis也是支持集群。

 

系统上线之后,要看哪些系统出现异常了,什么样的异常是需要马上解决的,这里面涉及到服务监控的问题,需要配合专门的运维工程师制定一些规则。

 

另外,缓存在UI层就有了,API这层也可以有缓存,不是所有的东西放到Redis里面才叫缓存,Redis属于分布式缓存,有些数据可以放到数据持久层,比如关系型数据库,MongDB也有,服务器只要配置够高,数据直接进数据持久层缓存或者数据访问层缓存也可以。如果单独加一层缓存也可以。像中间件平台也有独立的缓存,API层也有。从架构角度来说,要想下缓存放在哪层比较合适,相应的硬件配置要跟的上。当然,越接近客户端的缓存,效率越高,因为它的物理位置更接近客户端请求。如果放在最下面,说白了中间要经过很多层才能到数据这一块。

 

省级单位政府云平台DB数据库架构

 

政府系统,首先物理上保持隔离,再保证安全。要注意的是,峰值出现的时候,需要加一层缓存或者消息队列。

 

政府系统的数据量规模是有限的。小规模系统可以用可复制集群,保证数据库节点的自动化灾备转化就可以了,这样的好处是:首先,读写分离把压力分担了;另外,如果出问题,可以自动化灾备、自动化切换,避免手动修复,或者宕机带来的一些问题。

 

缓存数据服务器最好用两台。比如支付宝,新浪微博做的比较成功,大量数据放在缓存里。缓存也有读写分离。一些互联网公司的测试数据显示,Redis的并发能达到每秒11w,所以它很适合做数据持久层的这一套缓存机制,无论是传统关系型数据库,还是MongDB,用普通的SSHD,每秒只有1w写入量的话,可以把数据先写入Redis,这个并发高,基本上10w的并发,能够满足绝大多数互联网公司的需求,如果还不行,可以写入的数据量少一点,再做读写分离。

 

政府云平台架构设计考量

 

05f8a9ac3a0b4d74583fa1b51c24e0785d39f5f2


推荐阅读

《MongoDB实战》

《jQuery 实战》


cd502058f8ddd1f6eb058dab7bed7184870afbf5

 

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
22天前
|
负载均衡 测试技术 持续交付
高效后端开发实践:构建可扩展的微服务架构
在当今快速发展的互联网时代,后端开发扮演着至关重要的角色。本文将重点探讨如何构建可扩展的微服务架构,以及在后端开发中提高效率的一些实践方法。通过合理的架构设计和技术选型,我们可以更好地应对日益复杂的业务需求,实现高效可靠的后端系统。
|
26天前
|
设计模式 API 数据库
构建高效微服务架构:从理论到实践
【2月更文挑战第29天】 在现代软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将大型应用程序拆分成一系列小型、独立的服务来提高系统的可维护性、扩展性和敏捷性。本文将深入探讨微服务的核心概念、设计原则以及如何在实际项目中实现和优化微服务架构。我们将从微服务的定义出发,讨论其与传统单体架构的区别,并分析微服务的优势与挑战。接着,文章将提供一套实践指南,包括服务划分、通信机制、数据一致性问题以及安全性考虑等方面,以指导开发者构建和维护一个高效的微服务系统。
|
1月前
|
消息中间件 Kubernetes Java
构建高性能微服务架构:从理论到实践
【2月更文挑战第24天】 在当今快速发展的数字化时代,微服务架构已成为软件开发领域的关键趋势。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、技术选型和性能优化策略。我们将通过实际案例分析,揭示微服务架构在提高可伸缩性、容错性和维护性方面的优势,并讨论在实施过程中可能遇到的挑战及其解决方案。
|
6天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
22天前
|
消息中间件 敏捷开发 运维
构建高效可靠的微服务架构:策略与实践
随着现代软件开发的复杂性增加,微服务架构逐渐成为企业解决大型应用系统分解、敏捷开发和持续部署问题的有效手段。本文深入探讨了构建一个高效且可靠的微服务架构的关键策略,包括服务的合理划分、通信机制的选择、数据一致性保障以及容错处理。通过分析这些策略在具体案例中的应用,我们旨在为开发者提供一套可行的微服务设计及实施指南。
128 6
|
25天前
|
Cloud Native 安全 持续交付
构建未来:云原生架构的演进与实践
【2月更文挑战第30天】 随着数字化转型的深入,企业对于信息技术的需求日益复杂化和动态化。传统的IT架构已难以满足快速迭代、灵活扩展及成本效率的双重要求。云原生技术作为解决这一矛盾的关键途径,通过容器化、微服务、持续集成/持续部署(CI/CD)等手段,实现了应用的快速开发、部署及运维。本文将探讨云原生架构的最新发展,分析其如何助力企业构建更加灵活、高效的业务系统,并结合实际案例,展示云原生转型过程中的最佳实践和面临的挑战。
|
29天前
|
安全 数据管理 API
构建高效微服务架构:从理论到实践
【2月更文挑战第27天】 在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、灵活与可扩展性的关键解决方案。本文将深入探讨微服务的设计原则、开发流程以及如何在实际项目中实现一个高性能的微服务系统。我们将通过分析微服务的核心优势,揭示其背后的技术挑战,并提供一系列切实可行的策略来优化微服务的性能和稳定性。文中不仅包含了丰富的理论依据,还结合了实际案例分析,为开发者和企业决策者提供了一套全面的微服务实施指南。
|
1月前
|
监控 持续交付 开发者
构建高效微服务架构:从理论到实践
【2月更文挑战第25天】本文旨在深入剖析微服务架构的核心概念、设计原则以及实践中的关键技术挑战。通过探讨微服务的独立性、分布式特性和弹性机制,文章为读者提供了一套系统化的方法论,以指导如何构建和维护一个高效、可扩展且容错性强的微服务系统。文中将结合案例分析,展示微服务架构在真实业务场景中的应用,并提供性能优化和故障恢复的策略建议。
61 3
|
2天前
|
Linux 数据安全/隐私保护
Linux基础与服务器架构综合小实践
【4月更文挑战第9天】Linux基础与服务器架构综合小实践
205 6
|
14天前
|
消息中间件 安全 API
构建高效微服务架构:策略与实践
【4月更文挑战第1天】在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、可扩展和灵活部署的重要技术手段。本文将深入探讨如何通过合理的设计原则和先进的技术栈,构建一个高效的微服务系统。我们将剖析微服务设计的核心要点,包括服务的划分、通信机制、数据一致性以及安全性问题,并结合案例分析,展示如何在现实世界中应用这些策略以提升系统的可靠性和性能。