微信后台架构及基础设施设计与实践Word文档格式.docx
《微信后台架构及基础设施设计与实践Word文档格式.docx》由会员分享,可在线阅读,更多相关《微信后台架构及基础设施设计与实践Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
12.基于PaxosStore的在线基础组件 15
13.微信chubby 16
14.微信分布式文件系统 17
15.分布式表格:
架构图 17
16.微服务框架 18
17.业务逻辑Worker模型选择 20
18.Libco背景 21
19.异步服务与协程服务的对比 21
20.协程定义 22
21.函数调用的基本原理 23
22.Libco协程切换核心代码 23
23.Libco框架 24
24.线程内协程切换图 25
25.Libco下编程需要注意的点 26
3
1.回顾微信发展历程
2011年,我们发布了第一版微信,2012年,推出视频聊天功能。
如今,微信的活跃用
户数已经达到10亿。
后台涉及到的技术很多,我这边主要聚焦于数据存储、微服务等。
4
2.微信后台系统架构这是最新的微信后台系统架构图,逻辑上最前面会有一个终端,后面会有一个长链接接
入层,在线有几亿的管理连接部分。
底层上,因为数据比较敏感而且数据量比较大,所
以我们的存储并没有基于开源来搭建,而是自己开发了一整套存储,这也是迭代比较多的部分。
最开始,也就是2011年,我们用的是第一代存储。
早期的微信与QQ不同,它更像是一个邮箱。
这几年,我们逐渐完善,包括内部安全、管理等。
目前,我们最关心的有两个方面,一是高可用。
微信作为一个国民应用,对高可用有着
极高的要求,是不可以停顿的。
早期的微信迭代速度很快,几乎每两周一个版本,还包
括大量的修改。
二是敏捷开发的一些问题。
例如内存泄露、Coredump等。
6
3.数据业务背景与挑战
接下来,我重点讲一下数据存储和微服务框架这两块。
今天的微信,用户数达10亿,
每天的微信消息达1000+亿,朋友圈每日发表和点赞数达10+亿,每日浏览数达100+
亿,开放平台,微信支付等业务活跃度持续增长。
总结成如下四大挑战:
1.海量存储
我们需要一个能容错、容灾的高可用存储与计算的框架;
2.数据强一致性
7
保障10亿用户数据不会出现问题;
3.突发洪峰流量
圣诞节、元旦、除夕以及突发热点事件;
4.后台数据服务节点每分钟超过百亿次数据存取服务;
4.目标
关于可用性,大家可能已经很熟悉了,这里我再细化一下。
最下面的2个9,是指一年故障时间不超过3.65天;
最上面5个9,是指金融应用,
一年故障时间不超过5分钟。
8
那么微信是一个什么样的应用呢?
微信包含了金融应用,也就是大家常用的微信支付。
那么我们希望达到怎样的目标呢?
有两大点:
1、 机器故障是常态,微信希望提供连续无间断的服务能力
业界数据可用性通常通过RAFT,Paxos租约等来实现数据复制
机器故障时,系统会进入等待租约过期并重新选主的状态,即会产生30秒级别的服务中断,我们希望能够规避。
2、 相对于传统的基于故障转移的系统设计,我们需要构建一个多主同时服务的系统
系统始终在多个数据中心中运行
数据中心之间自适应地移动负载
透明地处理不同规模的中断(主机,机房,城市园区等)
5.关键设计
微信关键技术演变。
最初,微信是异步复制,比较传统的一个场景。
中间这部分是选主同步复制。
业界有两种比较经典的系统:
一种是基于故障切换的系统,包括两个主要的协议,Raft
协议和基于租约PaxosLog。
来保证数据的一致性,但对服务的可用性有一定影响。
另一种是基于多主的系统,是在可用性方面做的最彻底的系统。
它是基于非租约PaxosLog,
GoogleMegaStore以及微信PaxosStore。
多主系统有很多的难点。
第一,海量PaxosLog管理,对存储引擎的要求很高;
第二,代码假设在一个cas环境中运行。
要做到服务随时可用,对cache和热点处理的要求很高。
同时它对于追流水/恢复流程有时效性的要求。
10
6.多主系统的收益
多主系统收益很大,可以分为几个点。
一是7×
24小时的可用性,它可以应对有计划和无计划的停机维护。
不再有封尘已久的
切换流程,由于多主可用,类似快照与数据对齐等行为,已经在在线核心逻辑中充分体
现。
其次是变更发布,因为这些系统写出来并非一直不变,最大的可用性需求是来自于我们的程序版本发布。
第二点是资源调度,当系统变多主之后,相当于有了多台随时都可以用的机器,它们的
模式都是一样的,为了回避弱的节点去使用更多计算资源,只要切流量就可以了。
所以切存储跟切逻辑是一样的,统称为切流量。
最后一点是成本,多主系统的预留冗余成本是相对低的,因为所有的机器都可以服务用
户,所以在多主系统方面我们只需预留1/3的成本即可。
7.设计与实践
微信的设计主要分为三大块:
第一,实现同步复制,在数据分区内部实现完整ACID语义,维护细粒度的海量数据分区,且每一次数据读写都基于非租约的Paxos交互实现,每分钟超过百亿次。
第二,存储引擎方面,针对微信丰富的业务场景,设计多种高性能的存储模型,其次,我们还支持单表过亿行的二维表格/FIFO队列/key-value等数据结构。
第三,负载均衡方面,我们希望存储系统可以动态切换计算资源,数据节点动态计算负载能力尽力服务,超过服务能力部分自动转移到其他复制节点。
8.实际成果
12
目前微信的实际成果,核心数据存储服务可用性达6个9。
整个系统有一个创新的技术
点,具体细节我们发表在:
http:
//www.vldb.org/pvldb/vol10/p1730-lin.pdf
论文相关示例代码开源:
。
早期大家对Paxos算法都是认为很难实现的,近两年逐渐有一些公司开始对这方面有一
些分享。
上面提到的这个论文是微信PaxosStore的一点创新,贡献出了一些简洁的算法实现流程,大家可以很轻松的去理解和实现。
9.PaxosStore广泛支持微信在线应用
这些数据的应用基本都是PaxosStore在支持。
10.PaxosStore整体架构
下面,简单介绍下PaxosStore的整体架构。
分成几个园区,园区必须有独立的网络和电力。
举个例子,假设有些机房实际上共享了一套电力甚至交换机的话,只要单点故障一样会挂掉。
所以,园区只是一个概念,至少要满足网络和电力独立,然后在考虑跨层或跨省的问题,PaxosStore实际上也有跨华东,华南,华北三个遥远距离的服务。
13
中间我们会把PaxosStore共识层和计算层、存储层分离起来,PaxosStore其实是一整套框架,它可以容纳不同的共识算法和存储。
下面是一个存储引擎。
微信的存储引擎包括很多种,最早是Bitcask模型,现在广泛使用的是LSM,它可以支持比较多的业务。
最下面是迁移系统、备份系统、路由中心。
PaxosStore支持类SQL的filter,format,limit,groupby等能力,单表可以支持亿
行记录。
下一步,我们可能会根据业务的需求去开展。
11.PaxosStore:
数据分布与复制16
这一套分布式,其实是延伸了之前老系统的分布方式,数据会分成两层,它会按一致性
hash划分到不同的节点。
每个节点都有六个节点,它们交叉实现了复制的逻辑,可以达到一个比较好的负载均衡。
12.基于PaxosStore的在线基础组件
2017年之后,将整个微信90%的存储切完后,继续往下发展。
随着业务的发展,我们
把很多的立体图连起来。
有了PaxosStore框架之后,很多系统都相对容易实现,像比较典型的zookeeper、hdfs、hbase等。
除了基本的数据系统之外,我们还有很多特殊的场景,例如远距离跨省常量存储。
如,微信支付订单等场景,都有强烈的数据库需求,而且需要跨省容灾。
什么是远距离?
考虑到故障的实际影响范围以及专线的物理情况,在地点的选择上,是
有一定要求的,因此,在选点的选择上,一般选在整个中国跨越比较远的一些地方,如,
上海、深圳、天津,构成了一个三角,相互间距大概2000公里左右。
但有个实际问题,
如果跨省,必须给它大概三四十毫秒左右的延迟。
另外,像深圳跟汕头,上海跟天津,
这些都不算远距离跨省。
如果上海挂了,杭州的线也一定会出现问题,因为它俩距离比较近。
17
常量存储有什么特点?
它的写需要有跨越三四十毫秒的跨城通信过程,但读是本地的。
另外,我们还针对微信支付复杂业务定制了事务容器以及针对搜索推荐业务的高性能特
征存储。
13.微信chubby
Chubby是Google一个论文提到的系统,我们也延伸了这样一个逻辑,基本上跟它的接口是一样的。
当时,我们有一个很奇怪的发现,不管是GoogleChubby论文提到的代码量还是zookeeper的实际代码量都很大,但有了PaxosStore之后,根本不需要那么多的代码,所以接下来我们的处理也可能会考虑开源。
18然后,我们基于PaxosStore也实现了分布式文件存储。
14.微信分布式文件系统
微信分布式文件系统Namenode基于PaxosStore,DataNode基于Raft协议。
Raft
是基于租约机制的完美实现。
基于Raft我们可以做到DataNode的强一致写。
另外,它支持文件AppendWrite和随机读以及文件回收等功能。
15.分布式表格:
架构图
19这个其实对应的是hbase。
我们也基于PaxosStore去做了它的核心部分,然后把整套实现起来。
16.微服务框架
20
我们数据存储跟微服务架构是两大块。
微服务包含了服务定义、服务发现、错误重试、
监控容灾、灰度发布等一系列面向服务的高级特性的统一框架。
中间有一个配置管理和
下发的过程,这一块也是PaxosStore实现的,它可以完全控制代码的安全性。
下面是一个发布的过程,因为微信有很多台服务器,之前我们也有一个资源化系统,有
可能一个服务会横跨几千台机器,这时候,发布一个二进制,只能在几百兆时间内,所以,内部也是一套BT协议。
然后,我们有一些监控处理,最后我们会有过载保护保护,在系统里面过载保护是很关
键的一块。
因为在后台,当一个请求过来的时候,某些节点产生了一个慢延迟和性能差,就会影响整条链路,所以我们会有一个整套的过载保护的实现。
17.业务逻辑Worker模型选择
一般开源的东西就是在对标谁的性能高,但是在实际的后台服务当中,你的可用性要求都会很高。
所以我们会分成两种不同的服务,PaxosStore是比较重要的核心服务,使用多线程。
但是