从0到10亿,微信后台架构及基础设施设计与实践!

  • 时间:
  • 浏览:37
  • 来源:威子博客 - 专注共享幽雪博客活动

摘要: 微信后台业务类型众多,包括即时通信,社交网络,金融支付等等。本次分享着重讨论如何在海量用户场景下,后台分类整理中的共性次要如高可用、强一致、快速迭代等等,微信是如何在不断变化的背景下设计统一的架构与基础设施来解决核心问提。

许家滔,微信技术架构部后台总监,专家工程师,多年来伴随QQ邮箱和微信后台成长,历经系统从0到10亿级用户的过程。目前负责微信后台工作,包括消息,资料与关系链,后台基础设施等内容。

本文根据许家滔老师在2018年10月17日【第十届中国系统架构师大会(SACC2018)】现场演讲内容分类整理而成。

回顾微信发展历程

2011年,亲戚亲戚我们都都歌词 歌词 发布了第一版微信,2012年,推出视频聊天功能。如今,微信的活跃用户数不可能 达到10亿。后台涉及到的技术什么都,我这边主要聚焦于数据存储、微服务等。

微信后台系统架构

这是最新的微信后台系统架构图,逻辑上最前面会有5个 终端,上边会有5个 长链接接入层,在线有几亿的管理连接次要。底层上,不可能 数据比较敏感因此数据量比较大,什么都亲戚亲戚我们都都歌词 歌词 的存储并真难 基于开源来搭建,什么都他们开发了一整套存储,这也是迭代比较多的次要。

最结速英文,也什么都2011年,亲戚亲戚我们都都歌词 歌词 用的是第一代存储。早期的微信与QQ不同,它更像是5个 邮箱。

这几年,亲戚亲戚我们都都歌词 歌词 逐渐完善,包括实物安全、管理等。

目前,亲戚亲戚我们都都歌词 歌词 最关心的有5个 方面,一是高可用。微信作为5个 国民应用,对高可用有着极高的要求,是不不不 停顿的。早期的微信迭代速率 放慢,几乎每两周5个 版本,还包括几瓶的修改。二是敏捷开发的许多问提。类事 内存泄露、Coredump等。

数据业务背景与挑战

接下来,我重点讲一下数据存储和微服务框架这两块。今天的微信,用户数达10亿,每天的微信消息达2000+亿,亲戚亲戚我们都都歌词 歌词 圈每日发表和点赞数达10+亿,每日浏览数达200+亿,开放平台,微信支付等业务活跃度持续增长。

总结成如下四大挑战:

1.海量存储

亲戚亲戚我们都都歌词 歌词 时要5个 能容错、容灾的高可用存储与计算的框架;

2.数据强一致性

保障10亿用户数据不不总出 问提;

3.突发洪峰流量

圣诞节、元旦、除夕以及突发热点事件;

4.后台数据服务节点每分钟超过百亿次数据存取服务;

目标

关于可用性,亲戚亲戚我们都都歌词 歌词 不可能 不可能 不太熟悉了,这里我再细化一下。

最下面的5个 9,是指一年故障时间不超过3.6多日 ;最上边5个9 ,是指金融应用,一年故障时间不超过5分钟。

真难 微信是5个 有哪些样的应用呢?微信饱含了金融应用,也什么都亲戚亲戚我们都都歌词 歌词 常用的微信支付。

真难 亲戚亲戚我们都都歌词 歌词 希望达到如何的目标呢?有两大点:

1、机器故障是常态,微信希望提供连续无间断的服务能力

  • 业界数据可用性通常通过RAFT,Paxos租约等来实现数据一键复制
  • 机器故障时,系统会进入等待租约过期并重新选主的清况 ,即会产生200秒级别的服务中断,亲戚亲戚我们都都歌词 歌词 希望不不 规避。

2、相对于传统的基于故障转移的系统设计,亲戚亲戚我们都都歌词 歌词 时要构建有5个 主共同服务的系统

  • 系统始终在多个数据中心中运行
  • 数据中心之间自适应地移动负载
  • 透明趋于稳定理不同规模的中断(主机,机房,城市园区等)

关键设计

微信关键技术演变。最初,微信是异步一键复制,比较传统的5个 场景。上边这次就是选主同步一键复制。

业界有这一比较经典的系统:这一是基于故障切换的系统,包括5个 主要的协议,Raft协议和基于租约Paxos Log。来保证数据的一致性,但对服务的可用性有一定影响。另这一是基于多主的系统,是在可用性方面做的最彻底的系统。它是基于非租约Paxos Log,Google MegaStore以及微信PaxosStore。

多主系统有什么都的难点。第一, 海量Paxos Log管理,对存储引擎的要求很高;第二,代码假设在5个 cas环境中运行。

要做到服务随时可用,对cache和热点解决的要求很高。共同它对于追流水/恢复流程有时效性的要求。

多主系统的收益

多主系统收益很大,不不 分为哪好多个点。

一是7×24小时的可用性,它不不 应对有计划和无计划的停机维护。不再有封尘已久的切换流程,不可能 多主可用,类事 快照与数据对齐等行为,不可能 在在线核心逻辑中充分体现。其次是变更发布,不可能 有有哪些系统写出来就有就是老会 不变,最大的可用性需求是来自于亲戚亲戚我们都都歌词 歌词 的线程版本发布。

第二点是资源调度,当系统变多主然后,共要有了多台随时都不不 用的机器,它们的模式就有一样的,为了回避弱的节点去使用更多计算资源,就是切流量就不不 了。什么都切存储跟切逻辑是一样的,统称为切流量。

最后许多是成本,多主系统的预留冗余成本是相对低的,不可能 所有的机器都不不 服务用户,什么都在多主系统方面亲戚亲戚我们都都歌词 歌词 只需预留1/3的成本即可。

设计与实践

微信的设计主要分为三大块:

第一,实现同步一键复制,在数据分区实物实现完整性ACID语义,维护细粒度的海量数据分区,且每一次数据读写都基于非租约的Paxos交互实现,每分钟超过百亿次。

第二,存储引擎方面,针对微信丰沛 的业务场景,设计多种高性能的存储模型,其次,亲戚亲戚我们都都歌词 歌词 还支持单表过亿行的二维表格/FIFO队列/key-value等数据社会形态。

第三,负载均衡方面,亲戚亲戚我们都都歌词 歌词 希望存储系统不不 动态切换计算资源,数据节点动态计算负载能力尽力服务,超过服务能力次要自动转移到许多一键复制节点。

实际成果

目前微信的实际成果,核心数据存储服务可用性达6个9。整个系统有5个 创新的技术点,具体细节亲戚亲戚我们都都歌词 歌词 发表在:

http://www.vldb.org/pvldb/vol10/p17200-lin.pdf

论文相关示例代码开源:github.com/tencent/paxosstore。

早期亲戚亲戚我们都都歌词 歌词 对Paxos算法就有认为真难实现的,近两年逐渐有许多公司结速英文对这方面有许多分享。上边提到的你这一 论文是微信PaxosStore的许多创新,贡献出了许多简洁的算法实现流程,亲戚亲戚我们都都歌词 歌词 不不 很轻松的去理解和实现。

PaxosStore广泛支持微信在线应用

有有哪些数据的应用基本就有PaxosStore在支持。

PaxosStore整体架构

下面,简单介绍下PaxosStore的整体架构。

分成哪好多个园区,园区时要有独立的网络和电力。 举个例子,假设许多机房实际上共享了一套电力甚至交换机语句,就是单点故障一样会挂掉。

什么都,园区什么都5个 概念,共要要满足网络和电力独立,因此在考虑跨层或跨省的问提,PaxosStore实际上就有跨华东,华南,华北5个 遥远距离的服务。

上边亲戚亲戚我们都都歌词 歌词 会把PaxosStore共识层和计算层、存储层分离起来,PaxosStore人太好是一整套框架,它不不 容纳不同的共识算法和存储。

下面是5个 存储引擎。微信的存储引擎包括什么都种,最早是Bitcask模型,现在广泛使用的是LSM,它不不 支持比较多的业务。

最下面是迁移系统、备份系统、路由中心。

PaxosStore支持类SQL的filter,format,limit,groupby等能力,单表不不 支持亿行记录。下一步,亲戚亲戚我们都都歌词 歌词 不可能 会根据业务的需求去开展。

PaxosStore:数据分布与一键复制

你这一 套分布式,人太好是延伸了然后老系统的分布辦法 ,数据会分成两层,它会按一致性hash划分到不同的节点。每个节点就有5个节点,它们交叉实现了一键复制的逻辑,不不 达到5个 比较好的负载均衡。

基于PaxosStore的在线基础组件

2017年然后,将整个微信90%的存储切然后,继续往分类整理展。随着业务的发展,亲戚亲戚我们都都歌词 歌词 把什么都的立体图连起来。有了PaxosStore框架然后,什么都系统都相对容易实现,像比较典型的zookeeper、hdfs、hbase等。

除了基本的数据系统之外,亲戚亲戚我们都都歌词 歌词 还有什么都特殊的场景,类事 远距离跨省常量存储。如,微信支付订单等场景,就有强烈的数据库需求,因此时要跨省容灾。

有哪些是远距离?考虑到故障的实际影响范围以及专线的物理清况 ,在地点的选折 上,是有一定要求的,因此,在选点的选折 上,一般选在整个中国跨越比较远的许多地方,如,上海、深圳、天津,构成了5个 三角,相互间距共要2000公里左右。但有个实际问提,不可能 跨省,时要给它共要三四十毫秒左右的延迟。另外,像深圳跟汕头,上海跟天津,有有哪些就有算远距离跨省。不可能 上海挂了,杭州的线也就有总出 问提,不可能 它俩距离比较近。

常量存储有有哪些特点?它的写时要有跨越三四十毫秒的跨城通信过程,但读是本地的。

另外,亲戚亲戚我们都都歌词 歌词 还针对微信支付错综复杂业务定制了事务容器以及针对搜索推荐业务的高性能社会形态存储。

微信chubby

Chubby是Google5个 论文提到的系统,亲戚亲戚我们都都歌词 歌词 也延伸了曾经5个 逻辑,基本上跟它的接口是一样的。

当时,亲戚亲戚我们都都歌词 歌词 有5个 很奇怪的发现,不管是Google Chubby论文提到的代码量还是zookeeper的实际代码量都很大,但有了PaxosStore然后,根本不时要真难 多的代码,什么都接下来亲戚亲戚我们都都歌词 歌词 的解决什么都可能 会考虑开源。

因此,亲戚亲戚我们都都歌词 歌词 基于PaxosStore也实现了分布式文件存储。

微信分布式文件系统

微信分布式文件系统Namenode 基于PaxosStore,DataNode基于Raft协议。Raft是基于租约机制的完美实现。基于Raft亲戚亲戚我们都都歌词 歌词 不不 做到DataNode的强一致写。另外,它支持文件AppendWrite和随机读以及文件回收等功能。

分布式表格:架构图

你这一 人太好对应的是hbase。亲戚亲戚我们都都歌词 歌词 也基于PaxosStore去做了它的核心次要,因此把整套实现起来。

微服务框架

亲戚亲戚我们都都歌词 歌词 数据存储跟微服务架构是两大块。微服务饱含了服务定义、服务发现、错误重试、监控容灾、灰度发布等一系列面向服务的高级社会形态的统一框架。上边有5个 配置管理和分类整理的过程,你这一 块也是PaxosStore实现的,它不不 完整性控制代码的安全性。

下面是5个 发布的过程,不可能 微信有什么都台服务器,然后亲戚亲戚我们都都歌词 歌词 就有5个 资源化系统,有不可能 5个 服务会横跨几千台机器,这然后,发布5个 二进制,不不 在几百兆时间内,什么都,实物也是一套BT协议。

因此,亲戚亲戚我们都都歌词 歌词 有许多监控解决,最后亲戚亲戚我们都都歌词 歌词 会有过载保护保护,在系统上边过载保护是很关键的一块。不可能 在后台,当5个 请求过来的然后,许多节点产生了5个 慢延迟和性能差,就会影响整条链路,什么都亲戚亲戚我们都都歌词 歌词 会有5个 整套的过载保护的实现。

业务逻辑Worker模型选折

一般开源的东西什么都在对标谁的性能高,因此在实际的后台服务当中,你的可用性要求就有很高。

什么都亲戚亲戚我们都都歌词 歌词 会分成这一不同的服务,PaxosStore是比较重要的核心服务,使用线程。因此在几瓶的应用开发中,亲戚亲戚我们都都歌词 歌词 始终是线程的服务,因此线程框架是不不 定时重启的。

线程的5个 重点就在于内存泄漏与coredump容忍度很高,在快速开发社会形态然后尤其重要。

最后,不管是线程还是线程,都类事 5个 协程的解决,不不 把亲戚亲戚我们都都歌词 歌词 的并发能力提得很高。

Libco背景

协程是在2013、2014年结速英文构建的。2013年,结速英文运行在微信的后台。基于2013年的那一次故障, 亲戚亲戚我们都都歌词 歌词 结速英文整体优化微信后台的过载保护能力,也有助亲戚亲戚我们都都歌词 歌词 去提升整个微信后台的高并发能力。

思考了哪好多个月后,总结5个 辦法 ,5个 是把整个代码逐步重构成5个 异步模型,但你这一 工程量巨大。第5个是,去探索协程解决方案,几瓶修改代码达到同步编码,异步执行效果。但当时采取你这一 方案的案例不没办法 来越多,什么都,亲戚亲戚我们都都歌词 歌词 也很担心。

举个例子,不可能 把Leveldb的本地文件切换为远程文件系统,真难 异步代码如何实现?协程如何实现?

异步服务与协程服务的对比

传统基于事件驱动的异步网络服务优势高、性能高、CPU利用率高,但编写困难,时要业务层维护清况 机,业务逻辑被异步编码拆分得支离破碎。Future/promise等技术,趋近于同步编程,但仍然繁琐,因此并发任务难以编写与维护。

协程服务,同步编程、异步执行,不可能 不时要他们设计各种清况 保存数据社会形态,临时清况 /变量在一片连续的栈中分配,性能比手写异步通常要高,重要的许多是编写并发任务很方便。

协程定义

协程到底是有哪些?不不 说它是微线程,就是能说它是用户态线程。协程切换流程人太好不错综复杂,它主要任务是把上下文保存起来。上下文不不 5个 次要,第一次就是内存和寄存器,第二次就是栈的清况 。

函数调用的基本原理

亲戚亲戚我们都都歌词 歌词 看一下函数调用的基本原理,32位线程为例语句,人太好函数调用的过程很简单,什么都把函数压栈,用Call指令跳到某个地方。不可能 eip不不 直接修改,什么都不不 间接操作。Ret指令跟你这一 比较类事 。

Libco协程切换核心代码

这是主要的代码。协程这一就有就是错综复杂,5个 是不可能 基于上述的原理就是许多汇编代码不不 了,它主要保存了许多寄存器,并把许多清况 存起来,因此只解决许多寄存器的清况 就不不 。但不不 你这一 次就是不足英文的,不可能 不可能 亲戚亲戚我们都都歌词 歌词 提供了5个 协程,用户还是要做什么都代码。

Libco框架

5个 纯粹的协程时要跟网络框架结合在共同不不 实现它的价值。

亲戚亲戚我们都都歌词 歌词 对协程做了最基本的源语,不可能 亲戚亲戚我们都都歌词 歌词 就有就是想创造创造发明更多的概念出来。协程的源语包括co_create/co_resume/co_yield,协程间同步cond/signal。

共同亲戚亲戚我们都都歌词 歌词 还提供了5个 轻量级网络事件库。基于同样的考虑,你这一 库是基于epoll的事件回调以及基于时间轮盘的定时器设计。

另外Socket族函数hook,亲戚亲戚我们都都歌词 歌词 实现网络读写api hook,支持mysqlclient/gethostbyname,支持aio读磁盘,支持cgi(getenv/setenv)。

经过这套设计然后,亲戚亲戚我们都都歌词 歌词 就结速英文对微信的后台进行改造,目前基本上改造完成。

线程内协程切换图

这是许多具体的清况 。亲戚亲戚我们都都歌词 歌词 不不 看得人,亲戚亲戚我们都都歌词 歌词 时要实现5个 主的EventLoop去解决后发出的所有事件,在事件被触发的然后,不不 保证为通。

用5个 标准的线程,基于网络事件切换协程。不可能 异步解决不不 把逻辑分成什么都分片,因此在事件触发过程中用回调来完成你的逻辑,因此反过来在协程上边就简单什么都。

Libco下编程时要注意的点

现在Libco栈大小默认设置为128K,它不不 支持5个 共享执行,支持单机千万协程,那时要注意有哪些呢?有两点:

首先时要用poll代替sleep,其次对于计算较重的服务,时要分离计算线程与网络线程,解决互相影响。

在实践的过程中,遇到的问提还有什么都,就是把所有的清况 都考虑进去,就不可能 有很好的提升。有有哪些年,有了这两大基础组件的支撑,微信现在进入比较稳定的时期。

今天分享共要什么都曾经,谢谢亲戚亲戚我们都都歌词 歌词 。

本文由

老鱼

发布在

ITPUB

,转载此文请保持文章完整性性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2019/04/03/1236/