当前位置: 首页 > 编程日记 > 正文

看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!

作者丨魏旸:腾讯高级工程师,15年运维经验的老专家,负责QQ空间、微云、QQ空间相册的运维工作,亲历8亿军装照、QQ空间异地多活建设等重大架构升级事件。

2017年12月30日,元旦假期的第一天,你的朋友圈被18岁照片刷屏了吗?据说“晒18岁照片”的根源是2017年年未,最后一批90后将度过他们的18岁生日。这意味着,90后已全部成年,集体告别了青葱芳华。

这是一个青春的、也是怀旧的年华,QQ空间做为国内第一批社交平台产品,承载了较多的用户记忆,大量的用户涌入QQ空间翻找自己多年前的18岁照片晒上社交平台。集体引爆了空间相册山洪峰涌而至的照片流量。

下面这篇文章让我们回顾12月30日,空间相册面对突发四倍流量,七成访问落在后端冷存储的极端压力下,相册运维、开发团队如何凭借平时基础功底,从告警、容量、扩容、柔性、调度等全方面运维能力,扛过“18岁照片”的全民怀旧事件。

业务数据回顾

突然来袭的用户集中行为,给我们平台的能力带来了非常严峻的考验,先让我们先来看一组数据:

1) 图片下载量峰值达到平日晚高峰的4倍,且70%以上都聚集在平日不怎么访问的冷图片。

2) 图片上传量达到平日晚高峰的4倍。

3) 带图说说峰值达到平日晚高峰的12倍。

1.jpg

业务架构剖析

面对突然涌入的用户请求,相册开发与和运维是如何坚守阵地,度过这次难关的呢?

在介绍一系列的措施之前,首先不得不介绍下相册业务架构,下图较为抽像地介绍了相册的主要架构:

4.png

  1. 上传链路: 用户上传图片/视频,数据流主要由上图中间链路处理,经过proxy->逻辑(分片、权限、缓存等)->存储接入(分片整合、生成文件地址等)->落地存储
  2. 下载链路:
  3. 用户通过空间(说说、日志、动态等)访问相册图片,图片适配模块根据用户请求、终端、请求量等场景适配出最优图片规格,返回用户图片、视频URL。
  4. 用户通过上一步获取的URL 访问后端存储的图片、视频。

日常运维工作

同时,我们介绍一下腾讯SNG社交网络运营部平时进行的一些日常容量管理工作。

1) 链路梳理

如上节所述,我们梳理出相册核心链路,常用梳理过程有几种:

  • 通过抓包形式确定链路模块
  • 通过设备上报的主被调数据确定调用链路
  • 名字服务中获取相关的调用链数据。
  • 通过全链路数据汇总出相关的链路。

2)压测:

定期对整条链路做压测,压测手段有异地调度压测,或单机压测,通过压测找出链路内存在瓶颈的模块,及时修正链路模型。

3)高低负载处理:

依据压测容量数据,分配设备扩容。负载较低的模块设备进行缩容下线以节省成本。

3.1.PNG

容量应急措施

但是这里的问题是显而易见的:以上常规性的工作,只能发现常规场景下内部存在的瓶颈。像18岁照片这种特殊场景(用户大量读取空间相册,获取冷数据),无法通过常规压测检测出来问题, 这就需要一系列的机制来解决

1) 监控和容量弹性机制:

通过IaaS层监控对系统的基础特征进行监控,(如CPU负载,出入流量),当模块容量出现异常时,弹性扩容机制需要介入处理,进行扩容。

如何快速支持短时间扩容上千台设备呢?不得不介绍一下腾讯SNG的织云运维理念。

如上文所述,我们的设备被分配到不同的“业务模块”,而每一个模块有如下的属性:

1) 包:业务处理逻辑文件包,包含业务包与基础包。

2) 配置:包含业务包要使用到的各种配置

3) 权限:包含支撑业务包正常运行时需要的数据库、内部鉴权系统等权限

4) 测试工具:包含业务包启动后,能否接入现网的测试标准

织云提倡的自动化理念是:标准化 -> 配置化 -> 自动化,让企业的常用操作固化成流程工具。不依赖容易过期的文档,不依赖容易流失的人的经验。

6.jpg

参考持续交付的原则“为软件的发布创建一个可重复且可靠的过程”,运维团队为了解决人肉操作经验差异的难题,将运维操作通过流程DIY编排能力,实现标准操作的固化。“18岁照片”活动扩容,任何一个运维人员只需要执行QQ相册的扩容功能即可实现容量扩展,而织云流程会自动化的完成整个服务部署和上线的操作。(如下图)

3.jpg

柔性业务架构

前面我们说过,相册在当天的峰值下载量涨了4倍,且多是访问冷数据,但在短时间内无法筹集到4倍的资源,业务是如何应对的呢,在保证用户核心体验不受影响的前提下,我们采用了一些柔性手段。

回顾一下,当时我们在容量不足时碰到以下的问题,导致短时间内部分图片拉取耗时过长,影响用户体验。

1) 存储压力过大。

2) 自身模块压力过大。

针对存储压力过大的问题,我们采用了以下几个手段来降低业务负载:

1) 存储手段

a. 图片适配优化索引策略减少存储压力

减少拉取照片分批次数,降低后端存储处理压力。分批拉取照片列表数量增加3倍。交互次数直接下降近2/3。

b. 图片上传增加本地缓存空间减少存储高负载造成的用户上传失败

调整上传逻辑模块,从原来的本地内存缓存优化为内存+本地磁盘缓存,通过增加本地缓存空间减少后端存储高负载对用户侧上传图片/视频的影响。虽然底层存储高负载了,但是用户还是可以不受底层影响,将图片通过接入上传到逻辑层缓存。存储压力释放后即可将逻辑层缓存的数据上传到存储层。

c. 降低图片规则,减少图片下载流量:

一张图片分为小、中、大三种规格,为了节约存储容量中图是通过图片压缩模块实时压缩返回给用户的,小图和大图真实存储在存储模块。为了降低图片下载的流量压力,我们调整了适配策略,用户访问大图,适配直接返回小图的url,减少了图片压缩逻辑,并且降低了带宽。调整后图片下载带宽对比如下:

d. 上传不检查相册有效性,减少存储索引访问量:

正常情况,在用户上传图片时到相册时,会检查相册是否存在,如相册已被删除,则直接报错。柔性策略跳过相册有效性检查,直接上传图片到后端存储,降低索引访问量,降低索引模块负载。

同时在业务逻辑上,也做了以下的柔性措施:

a. 核心模块启用过载保护机制:

判断单机cpu使用率超过80%时,会自动丢弃多余的请求,以保证业务逻辑模块在大量用户请求场景下不雪崩。

b. 柔性关闭非核心业务功能减少业务自身负载

每张图片在高速存储会存储一份位置信息,图片裁剪时用于标示一张图片核心元素的位置。禁用此逻辑后,用户看到的图片无人脸中心点, 客户端裁剪可能不准确。

关闭用户删除标记,适配图片适配前会预先检测图片是否被删除,如已被删除则不会返回对应的图片列表。删除标记逻辑也会频繁和索引模块交互,高峰期时会占用大量计算资源。禁用此逻辑,用户访问相册时会看到已被删除的图片,但是会标记为灰色已删除。

调度:相册业务分布在三地,每地分别承载了约33%的用户,某地请求过高时,我们可以调度用户至其他容量相对较低的地域。

5.png

小结

从“18岁照片全民怀旧”热点社交事件可以看到,事发过程中留给运维的时间相当少,只有严格贯彻“养兵千日用兵一时”的标准化运维理念,建设完善的运维体系,才能在突发事件中游刃有余。

2.jpg

后记

这次18岁照片活动,相册通过多种手段顶住了业务压力。 同时通过这次活动,我们也对未来的运维工具进行了进一步规划,比如:

a) 基于容量的智能调度体系

b) 资源托管平台。

c) 自动演习系统。

织云平台的运维能力在不断迭代,期待在下一次活动来临时能够做到更加有条不紊。

相关文章:

基于svnserve的SVN服务器(windows下安装与配置)

基于svnserve的SVN服务器(windows下安装与配置)关键字: svn 安装SVNserve 从http://subversion.tigris.org/servlets/ProjectDocumentList?folderID91得到最新版本的Subversion。 如果你已经安装了Subversion,svnserve已经运行,你需要在继续之前把它停…

【c语言】C语言配置文件解析库——iniparser

转载自:http://blog.csdn.net/u011192270/article/details/49339071 C语言配置文件解析库——iniparser前言:在对项目的优化时,发现Linux下没有专门的供给C语言使用的配置文件函数,于是搜索到了iniparser库,可以像那些…

利用java虚拟机的工具jmap分析java内存情况

2019独角兽企业重金招聘Python工程师标准>>> 有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内存占用情况,然…

代码测试意味着完全消灭了Bug?

日前,一位名为 Jens Neuse 的开发者在改进其 graphql 解析库的过程中,发现词法分析器和解析器中存在很多的低效率,因此不得不重构完整的代码库(https://medium.com/jens.neuse/want-to-write-good-unit-tests-in-go-dont-panic-or…

Android系列讲座(2):为TextView组件加上边框

本文为原创,如需转载,请注明作者和出处,谢谢! 源代码Android系统本身提供的TextView组件并不支持边框,但可以对TextView进行扩展来添加边框。我们可以使用如下两种方法为TextView组件添加边框。 1. 编写一个继承TextV…

如何用Python做三阶拼图?

作者 | Ahab来源 | Ahab杂货铺(ID:AhabBin)今天是年假的最后一天,明天大家就要回到各自的工作岗位上去,公众号从今天开始恢复更新。不知道大家假期过得怎么样,帅张提到假期多关注一些家里的变化,自己也记录…

【C语言】libiniparser库使用例子,

libiniparser是C语言实现的ini文件解析库 使用实例如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>#include "iniparser.h"void create_example_ini_file(void); int parse_ini_file(char * ini_nam…

laravel5.4 关于数据填充的知识

需求&#xff1a;大量excel表格数据 集中整理到一个规定数据表中&#xff0c;并且增加新字段做标记步骤&#xff1a;把需要整理的excel表格提前存放到mysql数据库指定的表中 &#xff0c;可以用图形化工具来执行&#xff01; 核心&#xff1a;利用laravel5.4 框架自带的填充功能…

windows 域环境应用---VNC远程协助工具的使用

域环境中&#xff0c;少不了远程协助工具&#xff0c;这可以替管理员省掉许多跑腿的事。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />今天我就介绍一下远程协助工具中的一款real VNC.此工具有三个软件&#xff0c;vnc server…

从技术角度分析“抢票软件的加速”有多快?

作者 | 上海小胖来源 | Python专栏&#xff08;ID&#xff1a;xpchuiit&#xff09;大部分人在昨天前天已经回程了&#xff0c;不知道大家什么状态。我有2个状态并存&#xff1a;1.快点上班。2.继续休息。为什么会有这2种状态呢&#xff0c;还得从娃说起。昨天月嫂回家一天&am…

【物联网】NB-IoT简介

一、“我”是谁&#xff1f; NB-IoT&#xff1a;基于蜂窝的窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网络&#xff0c;只消耗大约180KHz的带宽&#xff0c;可直接部署于GSM网络、UMTS网络或…

CES上百度无人车队炫技,陆奇要用“China speed”改变世界

本文由 「AI前线」原创&#xff0c;原文链接&#xff1a;CES上百度无人车队炫技&#xff0c;陆奇要用“China speed”改变世界编辑&#xff5c;EmilyAI 前线导读&#xff1a;“美国当地时间 1 月 8 日&#xff0c;百度在拉斯维加斯举办了主题为“AI is Changing the World, Chi…

《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(10)

《Microsoft Sql server 2008 Internals》读书笔记订阅地址&#xff1a; http://www.cnblogs.com/downmoon/category/230397.html/rss 《Microsoft Sql server 2008 Internals》索引目录&#xff1a; 《Microsoft Sql server 2008 Internal》读书笔记--目录索引 上文主要介…

小心!你的脸正在成为色情片主角……

编译丨福尔摩望本文经授权转载自 猎云网&#xff08;ID&#xff1a;ilieyun&#xff09;【导语】那的确是她的脸&#xff0c;但是在她不知情的情况下被无缝地移植到了别人的身体上。网络上曾出现过这样的视频&#xff1a;一名女子穿着粉色肩膊上衣&#xff0c;坐在床上&#xf…

【modbus】libmodbus库的移植与使用

一、源码下载 1、libmodbus官网 http://libmodbus.org/download/ 2、选择长期稳定版本libmodbus-3.0.6.tar.gz 下载链接&#xff1a;http://libmodbus.org/releases/libmodbus-3.0.6.tar.gz 3、MD5值 c80f88b6ca19cabc4ceffc195ca07771 libmodbus-3.0.6.tar.gz …

IntelliJ IDEA控制台输出中文乱码问题解决

如果还不行&#xff0c;那么再极端的设置&#xff0c;在IDEA启动的时候强制设置为UTF-8&#xff1a; 打开增加-Dfile.encodingUTF-8&#xff0c;重启Intellij IDEA 再或者直接在项目运行的时候加入UTF-8的设置 如果还是不行&#xff0c;那么你可能装了一个假的IDEA。

【数据库】mysql移植

一、源码下载 1、下载mysql源码 源码下载地址&#xff1a;选择版本&#xff1a;5.1.72&#xff08;这是个老版本&#xff0c;高版本需要使用cmake&#xff09; https://cdn.mysql.com/archives/mysql-5.1/mysql-5.1.72.tar.gz 历史版本下载地址 源码官网地址&#xff0c;在Oper…

HTML添加上传图片并进行预览

使用说明&#xff1a;新建文件&#xff0c;直接复制粘贴&#xff0c;保存文件为html 格式&#xff0c;在浏览器运行即可&#xff1b; 第一种&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loos…

滴滴裁员2000多人,去年亏损超百亿

作者 | 非主流出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;据多家媒体的消息&#xff0c;在今天&#xff08;1 月 15 日&#xff09;上午的月度全员会上&#xff0c;滴滴 CEO 程维宣布公司将做好过冬准备&#xff0c;2019年会聚焦当前最重要的出行主业&#xff0c…

自己写的Treeview控件绑定数据源

首先在数据库中建表&#xff0c;表的格式如下id name parent_id代码如下&#xff1a;/// <summary>/// 添加根节点/// </summary>/// <param name"list">表的所有数据orm的List集合&#xff0c;object为表对应的实体对象</param>private…

【GDB】gdbserver的使用,远程调试开发板

0、将gdbserver拷贝到目标板子上 注:gdbserver在交叉编译工具目录/debug-root/usr/bin下 可用file命令查看 ------------------------------------------------------------ $ file gdbserver gdbserver: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linke…

关于javascript代码优化的8点建议

前面的话 本文将详细介绍JS编程风格的几个要点 松耦合 当修改一个组件而不需要更改其他组件时&#xff0c;就做到了松耦合 1、将JS从CSS中抽离&#xff1a;不要使用CSS表达式 //不好的做法 .box{width: expression(document.body.offsetWidth ’px)} 2、将CSS从JS中抽离&#…

英伟达Q4净利同比降49%,还能继续躺赚吗?

图片来自英伟达官网整理 | 非主流出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;北京时间 2 月 15 日凌晨消息&#xff0c;英伟达公布了 2019 财年第四季度及全年财报。报告显示&#xff0c;英伟达第四季度营收为 22.05 亿美元&#xff0c;与上年同期的 29.11 亿美元…

管理磁盘和文件系统

管理磁盘和文件系统 实验案例一&#xff1a;迁移/home分区并设置磁盘配额 实验环境 公司原来安装的rhel5服务器采用了自动分区的方案&#xff0c;随着使用服务器的系统用户数量不断增多&#xff0c;根分区经常面临磁盘空间耗尽的情况&#xff0c;偶尔有几次还导致系统无法启动。…

TIOBE 2月编程语言排行榜:Python逼近C,Groovy重回TOP 20

作者 | 唐小引出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;新月伊始&#xff0c;一月一更的 TIOBE 编程语言社区发布了最新的 2 月编程语言排行榜。继 Python 语言成为 "2018年度编程语言" 的称号&#xff0c;在2月的编程语言排行榜中&#xff0c;Pyt…

【视频】YUV基础

参考网站:https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx YUV定义: YUV颜色空间主要用于优化彩色视频信号的传输,并使其向后兼容老式黑白电视。 其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值; 而“U”和“V” 表示的则是色…

删除电脑里的空文件夹

发现电脑好多空文件夹&#xff0c;网上没有找到删除空文件夹的程序&#xff0c;自己动手谢了段代码 import java.io.File;/*** author zhangyanan*/ public class FileUtil { public static void main(String args[]) {String[] disk{"C:/","D:/","E:…

QT创建子对话框

1)根据UI文件动态加载对话框QUiLoader uiLoader;QFile file("://new/prefix1/testDailog.ui");QWidget *myWidget uiLoader.load(&file);myWidget->show();2) 创建非模态对话框 (需建立对话框类testDialog)testDialog *dialog new testDialog(this);dialog-…

对标Bert?刷屏的GPT 2.0意味着什么

作者 | 张俊林&#xff0c;中国中文信息学会理事&#xff0c;中科院软件所博士。目前在新浪微博 AI Lab 担任资深算法专家。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。同时他是技术书…