转: 微博的多机房部署的实践(from infoq)

转:  http://www.infoq.com/cn/articles/weibo-multi-idc-architecture

 

在国内网络环境下,单机房的可靠性无法满足大型互联网服务的要求,如机房掉电,光缆被挖的情况也发生过。微信就曾发生大面积故障,包括微信信息无法发出、无法刷新朋友圈、无法连接微信网页版,或接收到的图片无法打开等。同时,微信公众平台也出现了503报错,范围影响北京、上海、广东、浙江等近20个省市。故障的原因,微信团队指出是由于“市政道路施工导致通信光缆被挖断,影响了微信服务器的正常连接”。单机房除了单点风险之外,另外一个问题是不适应复杂的网络环境,下图是调研国外各地区用户访问微博的延迟情况,可以看到南方海外用户的访问延迟比较大。

为了解决上述问题,微博在2010年启动了多机房部署的架构升级。微博不同于静态内容,静态内容CDN基本上大的互联网公司都会做,已经非常成熟。动态内容CDN是业内的难点,国内很少有公司能够做到非常成熟的多机房动态内容发布的成熟方案。同时根据微博业务特点,又要求多机房方案能够支持海量规模、可扩展、高性能、低延迟、高可用,所以面临很多技术挑战。 微博的多机房架构V1版本,解决了海量动态数据的CDN同步问题。一般业界的数据同步架构可以归纳为三种:Master-Slave,Multi-Master,Paxos。考虑到微博的特点是海量数据,低延迟,弱一致性,所以Paxos并不适合微博,而Multi-Master在当时并没有成熟的产品,所以微博开始采用的是Master-Slave方案,如下图:

由于Memcached服务端是无状态的,分布式是在客户端实现,所以需要解决两个机房Memcached数据同步的问题。微博研发了MytriggerQ,通过解析Mysql的binlog,还原更新操作实现Memcached数据同步。

数据库方面Mysql自身的Master-Slave同步实现是比较成熟的。但是在微博的海量数据情况下,广州两从的结构就导致同步的数据量翻倍,导致带宽被大量占用。针对这个问题微博是通过Relay的方式来解决,即北京到广州仅需要同步一份数据,到广州后再由Relay服务器同步两份数据给从库。由于Relay服务器可以代理多个从库,所以在基本没有增加资源的情况下,我们把同步带宽降低了一倍。 而Redis的同步实现就不太成熟了,由于不支持断点续传,一旦网络抖动导致主从不一致后,导致大量的带宽被占用,甚至出现过专线100%被占用的情况,严重影响正常的机房间通信,同步恢复时间需要几个小时甚至几天。所以微博对Redis的同步机制进行了改造,利用AOF特性支持断点续传。改造后即使在专线中断的情况下,同步也可以在几秒钟内恢复正常。 V1版本实现了微博多机房从无到有,V2版本重点解决了多机房的可靠性和可扩展性。V2版本实现了Master-Master架构,通过消息总线同步用户操作行为,而不再依赖底层存储系统的同步,每个机房都独立完成读写操作。

面对微博海量实时数据,业界通用的消息总线产品无法满足性能要求,所以我们自己基于MemcacheQ实现了一套消息总线WMB,它与普通消息总线产品最大的差别是采用一写一读的方式实现消息同步。这种方式最大的好处是消除了并发锁消耗,单机性能可以发挥到极致,而吞吐量可以通过增加机器线性扩容。目前这套消息总线同步性能单机极限达到每秒10万消息同步性能。

可靠性方面,由于各机房仅通过消息总线进行同步,不依赖任何底层资源,所以各个机房都可以独立对外提供服务,任何一个机房出现问题都可以实现流量快速切换。可扩展性方面,增加一个机房仅需线性扩展消息总线即可完成,机房的部署结构与数据同步对业务完全透明。微博多机房已经实现从北京、广州两个机房的结构升级到广州亚太、北京电信、北京联通三个核心机房的部署结构。

Master-Master架构非常依赖消息总线的一致性,而在网络延迟比较验证的多机房环境下,MemcacheQ存在消息丢失的隐患,即而服务端完成消息读取,但在传输过程中超时,客户端无法再次获取这条消息。为了解决这个问题,我们在WMB的升级版WeiBus消息总线中实现了消息同步序号的功能,支持客户端在超时情况下,可重复获取消息。

但是随着微博业务的蓬勃发展,业务依赖关系越来越复杂,多机房部署成本压力越来越大,而且运维成本也不断攀升,下图是一个产品的服务依赖关系图。微博多机房V3版本实现了业务灵活多机房部署架构,支持业务自定义机房部署个数,及部署区域。

业务定制部署需要解决业务路由问题。在当前全国的网络环境下,南北网络专线延迟一般在30到40毫秒之间,而机房内延迟一般小于1ms。业务路由需要支持尽可能路由到调用本地机房调用,对需要跨机房调用的请求进行打包以便减少网络延迟的影响。微博根据自身业务特点,实现了业务路由服务,支持将多个业务请求进行打包,将多个请求打包成一个请求,自动识别本地业务部署,把需要跨机房调用的请求一次性请求到对应机房,并将返回的结果打包后一并返回。并且支持自动识别业务部署结构变更,并对非核心业务异常自动隔离。

随着移动互联网的迅猛发展,3个机房的部署结构不能完全解决用户访问速度问题,一种解决方案是让机房更加靠近用户。但是社交网络由于数据的网状访问,较难选择合适的切分维度,目前微博核心业务仍需要各机房同步全量数据,部署更多机房的成本压力比较大。QZone的SET化和Tumblr的Cell化在解决社交网络拆分维度方面都值得参考,微博也在进行Cell化方面的尝试,相关信息也会在 @微博平台架构 微博帐号上与社区进行交流,希望感兴趣的同学积极与我们互动。 微博只是多机房之路上迈出了一小步,仍有很多难题有待攻克。希望对多机房系统,对微博的架构感兴趣的同学加入到我们微博的团队,共同打造一流的分布式系统。

感谢刘宇对本文的审校。

转载于:https://www.cnblogs.com/jhj117/p/5610701.html

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

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

相关文章

知道这些性能优化手段,工资起码提升一倍

1.什么是性能?性能指标有哪些?计算机的性能,其实和我们干体力劳动很像,好比是我们要搬东西。对于计算机的性能,我们需要有个标准来衡量。这个标准中主要有两个指标。第一个是响应时间(Response time)或者叫…

JAX-RS和JSON-P集成

这篇简短的文章讨论了JAX-RS 2.0中对JSON-P的支持 JSON-P…? JSON处理API (JSON-P)是Java EE 7中引入的。 它提供了用于处理JSON数据的标准API,并且与XML对应的JAXP非常相似。 JSON-B (JSON绑定)API已在Ja…

亲手把360奇安信软件卸载了,爽!

由于工作原因,在上一家公司安装了360奇安信安全软件,到了下一个公司还需要安装另一个安全软件,这个必须要卸载,卸载!卸载!但是卸载需要输入密码,没有密码还输入卸载不了,我曾经联系3…

VM虚拟机中CentOS6.4操作系统安装一

在 VMware中鼠标单击“编辑虚拟机设置”,在弹出的“虚拟机设置”对话框中的“硬件”标签中选择“CD/DVD(IDE)”,然后在右侧的“CD /DVD(IDE)”连接选项中选择“使用ISO映像文件”,使用“浏览”按…

vue基础教程总结篇,用最短的时间入门vue.js(持续更新...)

目前,vue已经成为前端工程师必会的框架之一,这里简单总结一下,可以让您快速的入门vue,师傅带进门,修行靠个人,最主要的还是自己多动手,多实践,本专栏会持续更新。 1.vue安装教程及简介 2.vue计…

gcc代码反汇编查看内存分布[2]: arm-linux-gcc

arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: 代码段(RO, 保存函数代码) --> 只读数据段(RO, 保存常量) --> 数据段(RW, 已初始化并且初始值不为0的全局变量和静态变量) -->bss段(RW, 未初…

关于SP一些响应码的API返回码及解析集合

在一些金融的行业(银行、证券、保险等),如果接触了一些中间件,比如长城、恒银、广电等一些厂商的设备,不同的厂商有不同的一些规范,在应用开发的过程中难免会和中间件的错误码打交道,这里总结一…

eclipselink_Java EE 7的高峰– EclipseLink的多租户示例

eclipselink水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源。 他们从Oracle的Shaun Smith( 博客 / 推特 )获取了有关EclipseLink作为开源项目的地位和未来的演讲。 他介绍了将在EclipseLink 2.4中提供的所有新功能&…

我们的团队目标

我们的团队目标(WBS): 完成一个规范的电脑应用程序,实现各个模块功能,让用户能够随时的存放自己的代码并且方便的提取到自己想要的代码进行查阅和修改。 团队项目的主要工作项目: 利用sql数据库和eclipse实现文件的存取查询。 个人…

关于一些常见智柜问题的分析及解决办法

竟然还有小伙伴感觉自研项目不好的小伙伴?渐渐感觉不管是在小公司或者在大公司,能有一个值得奋斗的远方就可以了,比如薪资高,钱多事少离家近,自己真的对自己目前做的事情感兴趣,否则干啥都感觉没劲&#xf…

流绩效–您的想法

上周,我介绍了一些有关Java 8流性能的基准测试结果。 你们和gal足够感兴趣,可以留下一些想法,还有哪些可以介绍。 这就是我所做的,这是结果。 总览 最后一篇文章的序言也适用于此。 阅读它,以找出所有数字为何撒谎&a…

java中JVM的原理

一、java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有 三个运行中的Java虚拟机。 Java虚…

2022将至,前端程序员们应该一起放个烟花庆祝一下,走起

前言:小时候,在我印象中,每到快过年的时候就有很多卖炮仗的,一般也就是阳历的12月份到明年的正月15号卖炮仗的商家比较多,省下买辣条的钱去买炮仗,在老家也就过年和除夕两天及正月15日这几天放烟花和炮仗比…

微信红包封面开放平台序列号

微信红包封面开放平台是一款可以领取微信红包封面的平台,最近网上非常流行好玩的微信红包封面,每一种封面都极具特色,让你的微信红包与众不同,还可以定制专属的微信红包封面,不过名额有限,这边为大家带来这…

ios多线程 -- NSOperation 简介

NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: 1)先将需要执行的操作封装到一个NSOperation对象中 2)然后将NSOperation对象添加到NSOpera…

在没有复杂插件的情况下从Eclipse启动和调试Tomcat

像Eclipse这样的现代IDE提供了各种插件来简化Web开发。 但是,我相信将Tomcat作为“常规” Java应用程序启动仍然可以提供最佳的调试体验。 大多数时候,这是因为这些工具将Tomcat或任何其他servlet容器作为外部进程启动,然后在其上附加一个远程…

【javascript高级教程】JavaScript 对象

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...及自定义对象 JavaScript 提供多个内建对象,比如 String、Date、Array 等等。 对象只是带有属性和方法的特殊数据类型。 布尔型可以是一个对象。数字型可以是一个对象。字符串也可以是一个…

php 字符串函数

函数名描述实例输入输出trim()删除字符串两端的空格和其他预定义字符 $str"\r\nHello\r\n"; echo trim($str) 目标字符串 清除后的字符串 rtrim()/chop() 删除字符串右边的空格或其他预定义字符 ltrim() 删除字符串左边的空格或其他预定义字符 …

Lucene分析过程指南

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以…

【JavaScript高级教程】JavaScript prototype(原型对象)

所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法。 function Person(first, last, age, eyecolor) {this.firstName first;this.lastName last;this.age age;this.eyeColor eyecolor; }var myFather new Person("John…