物联网模式下的多活数据中心架构认识与实践

    做互联网应用很重要的一点是要保证服务可用性,特别是某些业务更是需要7*24小时不间断的对外提供服务,任何停机、宕机都会引起大面积的用户不满。持续可用性是把业务服务化时一个需要考虑的重要指标,很多时候我们都会牺牲一些功能来换取可用性。如何保证服务的持续可用性,是每个互联网架构师一直坚持不懈追求的目标。在不同行业、不同场景下都有不同的解决方案。今天就与大家聊聊特来电在物联网模式下的多活数据中心架构上的认识和实践。

     特来电是全球首家提出了将车联网、充电网、互联网三网融合的充电桩生态公司,拥有近18万个充电桩,覆盖了全国240多个城市,服务客户不仅有ToC端、ToB端,还有很多的社会运营车辆。在如此复杂的客户群面前,充电网每时每刻都有大量的充电用户,无论在静寂无声的夜晚,还是在节假日,充电永不停歇。用户入眠的时候,是我们充电网络最繁忙的时刻,可以说特来电的充电网必须要有99.9%甚至更高的可用性,才能满足业务的需要。特来电的充电网与其他厂商的充电桩还不一样,其完全构建在物联网之上的。每个充电终端都是智能的,都在时时刻刻与云平台保持着通讯,下面是业务全景图。

     像其他互联网公司一样,我们做多活也是迫不得已的事情:

  1. 所有业务放到一个篮子里面,当出现严重故障时,整个充电云服务将完全宕机,无法满足SLA99.9%甚至更高的要求。

  2. 云平台架构完全是分布式的,部署结构复杂,各产品功能不支持灰度发布,产品新功能上限频繁,产品中隐藏很深的bug,很容易引起大面积的云服务故障。

  3. 因为架构和一些技术实现,一个数据中心服务负载总会有上限,在特定的一些条件下,增加虚拟数量也无法提升系统的服务水平(比如:TCP连接数是有上限的)

     基于以上考虑,以及填过无数坑的教训,我们决定必须要建立多活数据中心。既然要建多数据中心,那就要看看业界的一些主流做法和技术趋势。在众多的解决方案中我们找到了两篇非常富有代表性的文章:微信高并发资金交易系统设计方案——百亿红包背后的技术支撑、首席架构师揭秘蚂蚁金服互联网IT运维体系实践。

     微信红包的主要思路是:

  1. 系统垂直SET化,分而治之。各个SET之间相互独立,互相解耦。并且同一个红包ID的所有请求,包括发红包、抢红包、拆红包、查详情详情等,垂直stick到同一个SET内处理,高度内聚。通过这样的方式,系统将所有红包请求这个巨大的洪流分散为多股小流,互不影响,分而治之。

  2. 逻辑Server层将请求排队,解决DB并发问题。使拆红包的事务操作串行地进入DB,只需要将请求在Server层以FIFO(先进先出)的方式排队,就可以达到这个效果。从而问题就集中到Server的FIFO队列设计上。

  3. 双维度库表设计,保障系统性能稳定。当单表数据量达到一定程度时,DB性能会有大幅度下降,影响系统性能稳定性。采用冷热分离,将历史冷数据与当前热数据分开存储。系统在以红包ID维度分库表的基础上,增加了以循环天分表的维度,形成了双维度分库表的特色

     蚂蚁金服的主要思路是:

     蚂蚁金服提出了“LDC”架构,其核心思想是:把数据水平拆分的思路,向上提升到接入层、终端层,从接入层开始,把原来部署在一个IDC中的系统集群,进一步分成多个更细粒度的部署单元。

  1. 每个单元对外是封闭的,在一个单元内的系统调用链路和各类存储访问是局部化在本单元内的;

  2. 每个单元的实时数据是独立不共享的;会员或配置类信息等对延时性要求不高的数据全局共享;

  3. 单元间的通信统一管控,尽量以异步化消息进行通信;同步调用则通过单元间代理方案实现。

     通过两家互联网巨头公司的方案可以看出一个共同的特点,就是期望通过分流的模式,把大流量切成小流量,从接入层开始,把原来部署在一个IDC中的系统集群,进一步分成多个更细粒度的部署单元 ,应对流量压力。这种架构下,不仅仅解决了流量天花板问题,而且在系统整体可用性上有了一个质的变化。即使系统不可用,也是少部分服务单元出问题,不会影响全国业务。这不正是我们梦寐以求的东西吗?

     基于此我们规划设计了特来电云平台的多活系统架构。总体思路是分为三步走:

     第一步:中间件、技术平台要进行适应性改造,以支持多数据中心、多Set化的架构。不管后续部署结构如何变化,技术平台和组件都要可适应。下面是技术平台和中间件的架构图,图中的五个平台都需要改造。

     第二步:架设两个数据中心,每个数据中心部署一个服务单元,两个数据中心进行引流,验证总体架构和设想,实现双活架构。核心思路:

  1. 上海、北京异地两数据中心双活,部分充电桩分流到上海数据中心。

  2. 用户充电时,根据集控所在数据中心,下达充电指令。非充电业务,默认访问主数据中心

  3. 当北京数据中心或上海数据中心宕机时,通过流量管理器自动切换到另一个数据中心。提升系统可用性。

     第三步:架设多个数据中心、多个服务单元,按照地区对流量进行切割,真正实施多活架构。核心思路:

  1. 建立多活数据中心,每个数据中心多个服务单元。

  2. 充电桩在接入云服务时,根据所在地区自动引流到对应的服务单元。

  3. 用户充电时,根据登录地区,由流量管理器映射到对应的服务单元

     通过近半年的努力,我们不仅完成了第一步的工作,而且还完成了第二步规划。在2017-6-27日,上海数据中心正式激活并引流成功。至此,我们终于在多活架构上迈出了最坚实的一步。这标志着,我们不仅仅具备了完善了技术架构,而且这个架构是可以复制的、多活的,终于有可能把整个系统可用性做到100%。

      架构的变迁会随着业务的变化而变化,不同阶段有不同的需求。规划了这些、做了这些,也是只万里长征的第一步。2020年后才会真正迎来新能源汽车爆发式发展,届时会有50%以上的电动汽车在我们的平台下充电,每天都有可能数千万度电甚至数亿电在特来电的充电网上发生。架构的升级将会继续,会越来越快,也会越来越复杂,但是我们乐在其中,期望志同道合的战友一起战斗!!!

原文地址:http://www.cnblogs.com/vveiliang/p/7156847.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

subList?? subString???

今天看到了java中List中有个subList方法,感觉很熟悉有没有?没错,在Stirng类中,也有个类似的方法:subString。1String类的subStringString中的subString方法,官方解释是:返回字符串的子字符串&am…

互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

上篇博文中,我们介绍了做互联网级监控系统的必备-Influxdb的关键特性、数据读写、应用场景:互联网级监控系统必备-时序数据库之Influxdb 本文中,我们介绍Influxdb数据库集群的搭建,同时分享一下我们使用集群遇到的坑!…

考研数学二大纲22年考研

考试科目:高等数学、线性代数   考试形式和试卷结构   一、试卷满分及考试时间   试卷满分为150分,考试时间为180分钟.   二、答题方式   答题方式为闭卷、笔试.   三、试卷内容结构   高等教学 约80%   线性代数 约20%   四、试卷题…

ssl1500-最短路上的统计【Floyd】

正题 个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b),我们要把所有a与b之间所有最短路上的点的总个数输出。 输入输出(需要自取) Input 第一行n,m,表示n个点,m条边 接…

Java中的subList方法

Java中的subList方法 今天看到了java中List中有个subList的方法,感觉很熟悉有没有?没错,在Stirng类中,也有个类似的方法:subString。 Stirng中的subString方法,官方解释是:返回字符串的子字符串…

考研408大纲22年考研

I 考试性质   计算机学科专业基础综合考试是为高等院校和科研院所招收计算机科学与 技术学科的硕士研究生而设置的具有选拔性质的联考科目,其目的是科学、公平、 有效地测试考生掌握计算机科学与技术学科大学本科阶段专业知识、基本理论、 基本方法的水平和分析问…

在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

《在ASP.NET Core中使用Apworks快速开发数据服务》一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介绍,你会看到,使用Apworks框架开发数据服务是何等简单快捷&#xff0…

再有人问你Java内存模型是什么,就把这篇文章发给他

转载自 再有人问你Java内存模型是什么,就把这篇文章发给他 前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识…

SpringMVC对Ajax请求的处理

SpringMVC对Ajax请求的处理 [1] 问题: 当浏览器发起一个ajax请求给服务器,服务器调用对应的单元方法处理ajax请求。 而ajax的请求在被处理完成后,其处理结果需要直接响应。而目前我们在单元方 法中响应ajax请求,使用的是response对象&#x…

ssl2344P2835-刻录光盘【Floyd,联通块数,图论】

正题 洛谷题目 就是给出一个图,求最小联通块数。 输入输出(需要自取) Input 先是一个数N,接下来N行,分别表示各个营员愿意把自己获得的资料拷贝给其他哪些营员。即输入数据的第N1行表示第i个营员愿意把资料拷贝给那…

为了金秋那沉甸甸的麦穗,我绝不辜负春天

本文原创:焦文宇我可以一落千丈,但我就是要一鸣惊人。——题记01 没有谁的一生是一帆风顺的,也没有谁的一生是充满坎坷的。人生就像是一场游戏“玩”的好坏全都在于自己,我们没有任何理由去抱怨生活中的点滴,我们应当对…

BigDecimal丢失精度的坑

问题:new BigDecimal(double d)的数值居然还是不精确的 double d 0.09; BigDecimal bigDecimalnew BigDecimal(d); System.out.println(bigDecimal); System.out.println(d); 输出结果: 0.0899999999999999966693309261245303787291049957275390625 …

编译型语言VS解释型语言

编译型语言人类代码 ————》一次性把代码给 翻译官(编译器)————》汇编--》机器语言代表 : c,c,golang优点:执行速度快缺点:跨平台可移植性差硬件 , cpu , 有自己指令规则 0000000001 打印&#xf…

P1236-Network of Schools(学校网络)【最强联通块,Kosaraju】

正题 POJ题目链接 给出一个图&#xff0c;求联通块数量和加入多少条边后会将全图变为一个最强联通块。 机翻输入输出&#xff08;需要自取&#xff09; 输入 第一行包含整数N&#xff1a;网络中的学校数量&#xff08;2 < N < 100&#xff09;。学校由前N个正整数标识…

限时团购,6.9折:《微信开发深度解析:公众号、小程序高效开发秘籍》推荐序

全书由目 Senparc.Weixin SDK 作者苏震巍历时 2 年完成&#xff0c;涵盖了开发微信公众号及小程序需要用的的各项后端开发技能、技巧、避坑提示&#xff0c;以及 Senparc.Weixin SDK 微信公众号及小程序模块全面的使用说明及原理剖析。 Senparc.Weixin SDK 发布 4 年多来&#…

SSM框架知识点复习

第三节 SSM框架知识点复习 SpringMVC的知识 技能:使用SpringMVC来处理浏览器发起的请求。 ① SpringMVC的基本使用流程 i. 导入jar包 ii. 配置SpringMVC的配置文件 iii. 配置web.xml文件 iv. 创建控制器类并声明单元方法 ② SpringMVC的单元方法获取请求 i. 使用形参名和键名一…

某同学工作之后的感悟

本文原创&#xff1a;王梦茹以下是王梦茹同学在学习中和工作中的感悟。01学习中出来之后发现在学校的学习效率是远远比自主学习效率高的&#xff0c;学什么东西之前都会先知道他的大体概念&#xff0c;通透了解一下再学习会发现有效率的多。在有大致了解的情况下再去听老师讲课…

“半路出家”的程序猿怎么不被“熊”

文本原创&#xff1a;孙浩投稿这篇文章总有点‘好为人师’的感觉&#xff0c;但是自己作为一个“半路出家”的程序看过太多的和我同样出身的程序半途而废了。我现在在一家软件公司就职&#xff0c;担任技术主管职位。01 带过毕业生&#xff0c;也带过中途转行&#xff0c;也带过…

这可能是把Docker的概念讲的最清楚的一篇文章

转载自 这可能是把Docker的概念讲的最清楚的一篇文章 Docker 是世界领先的软件容器平台&#xff0c;本文主要来介绍下关于Docker的那些事儿&#xff0c;主要包含以下内容&#xff1a; 容器 什么是Docker&#xff1f; Docker思想、特点 Docker容器主要解决什么问题 容器 V…

【2018.3.17】模拟赛之一-ssl2574jzoj1368 无限序列【斐波那契数列】

正题 链接 需要纪中OJ账号 刚开始一个字符串”1”。然后进行无数次变化&#xff0c;1变为10,0变为1。然后求多个区间内的1的个数 输入输出&#xff08;需要自取&#xff09; Input   第一行为一个整数Q&#xff0c;后面有Q行&#xff0c;每行两个数用空格隔开的整数a, b。 …