流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]微博作为当今中文社交媒体的第一品牌,拥有超过 3.6 亿的月活用户,也是当前社会热点事件传播的最主要平台。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂] 作者|胡忠想

编辑|小智

写在前面

微博作为当今中文社交媒体的第一品牌,拥有超过 3.6 亿的月活用户,也是当前社会热点事件传播的最主要平台。热点事件的发生具有不可预测性和突发性,以 9 月 26 日上午“谢娜宣布怀孕”事件为例,从图 1 可以看出微博评论的流量在短短 10 分钟内迅速上涨,并在 20 分钟后达到了日常晚高峰的 2 倍之多。可见,为了应对突发事件带来的流量冲击,确保线上服务的稳定性,能够进行随时随地的快速弹性扩容十分重要。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 1.  9 月 26 日上午“谢娜宣布怀孕”事件微博评论流量

传统的面对而传统的人工值守,手工扩容的运维手段,显然无法满足这一需求。为此,我们的目标是做到系统的自动扩容,在流量增长达到系统的警戒水位线时自动扩容,以应对任意时刻可能爆发的流量增长,确保服务的高可用性。

微博 Web 弹性调度演进

接下来,将为大家介绍微博 Web 系统如何从人工值守的手工扩缩容一步步演进到无人值守的自动扩缩容。

第一代:人为触发扩缩容

  • 人工根据监控系统的 QPS、AvgTime、load 等判断是否扩容;

  • 根据经验值人为预估扩容机器数;

  • 支持 PC、手机等多渠道触发。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 2. 人工值守扩缩容流程

问题:需要人为介入确认扩容时机和扩容数量。

第二代:无人值守定时扩缩容

  • 每天晚上 8 点定时扩容,12 点前定时缩容;

  • Web 与依赖的 RPC 可以依赖扩容。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 3. 无人值守定时扩缩容流程

问题:只能解决晚高峰问题,无法应对突发事件。

第三代:智能触发自动扩缩容

  • 自动压测评估线上服务池最大承载量

  • 实时评估线上服务池冗余度

  • 冗余度不足则触发扩容,充足则触发缩容

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 4. 智能触发自动扩缩容流程

下图展示了在 # 薛之谦与前期复合 # 事件中,智能触发自动扩缩容的实际效果。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 5. 薛之谦与前妻复合 # 事件自动扩容效果图

下面对智能弹性调度系统进行详细介绍,图 6 展示了这一系统包括的几个主要组成部分。

  • 全数据日志分析 Profile,生成业务系统的各种指标并采集汇报给实时监控系统 Graphite。

  • 实时监控功能系统 Graphite,实时汇聚并计算多维度业务指标数据,并提供 API 给在线容量评估以及智能弹性调度系统已作决策。

  • 在线容量评估系统 Diviner,对在线服务池进行压测,以评估服务池的最大承载能力。

  • 智能弹性调度系统 DCOS,根据系统实时的水位线情况,决策是否需要进行扩容以及扩容机器数。

  • 混合云平台 DCP,向私有云和公有云申请机器,进行弹性扩容。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 6. 智能弹性调度系统架构图

Profile- 全数据日志体系

在实际的扩容决策中,需要以一些关键指标如 QPS、AvgTime 或多种指标叠加作为判断依据,所以自动扩缩容系统首先要解决的问题就是关键指标的生成和采集。

指标的生产

一般情况下,指标的生产有两种方式:一种是在业务代码里以特定格式打印各业务关心的业务指标日志,如 API 的 QPS、AvgTime 等,但这种方式对业务代码的侵入性强,不建议采纳;一种是在框架的关键路径上埋点,统一打印 metric 日志,不侵入业务代码,对业务开发更加友好。我们就采用了这种方式,如在 motan 服务化框架上埋点,来记录 RPC 调用的 QPS、AvgTime、P99 等指标。

指标的采集

指标的采集主要涉及两个问题,一个是如何规范 metric 日志,便于在不同系统间传递,一个是如何传输的问题,有多种途径如 scirbe、kafka、udp 等。为了解决第一个问题,我们制定了规范的 profile 日志格式,各种 metric 信息均以标准的格式记录,如下图 7 所示。为了简化系统和传输效率,我们通过 udp 方式将各种 metric 信息传递给监控系统。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 7. Profile 标准日志格式

实时监控系统

有了关键业务指标的 Profile 日志,就可以对它们进行实时监控,其工作原理如图 8 所示。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 8. 实时监控系统架构图

从上图可以看出,实时监控系统的核心就是 Graphite。它主要包含两方面的功能:

  1. 将实时传输的 profile 日志进行聚合计算,产生各种维度的数据存储到时序数据库中。

  2. 还需要提供 API 接口,以提供 dashboard 展示,压测系统以及智能调度系统调用以用于扩缩容决策。下面将对 Graphite 进行详细介绍,其架构如图 9 所示。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 9. Graphite 架构图

为了减少延迟,我们对 graphite 系统中的关键模块进行了优化,主要包括两个方面:

  1. 用 go 重写了 statsd-proxy 和 statsd 模块

  2. carbon 中添加缓存,7 天的数据存储在缓存中,7 天以外的数据存到 SSD。

在线容量评估系统

有了关键业务指标的实时监控,就可以对系统进行压测,以评估系统的最大支撑能力。而如何对系统进行压测,以合理评估系统的承载能力主要取决于两个方面:

  1. 合理选择业务指标来衡量系统健康度;

  2. 精确定位性能拐点以确定系统临界值。

下面分别就上面两个问题进行阐述。

合理选择业务指标来衡量系统健康度

常见的可作为衡量系统健康度的指标有 avgTime、load、5xx、连接数等,对于单一业务模型的系统来说,选取其中一个指标即可。但对于复杂的业务系统,以微博 web 系统为例,既包含了 CPU 和带宽消耗较高的 feed 接口,又包含了低延迟和高并发的计数器接口,单一接口健康并不能代表整个系统健康。除此之外,单一指标正常也不能代表系统正常,比如我们经常遇到 feed 接口 avgTime 正常,但延迟大于 1s 的比率超过了 1%,这时候会直接造成 1% 用户刷新失败,影响了用户体验。

为此,我们建立了多接口多指标的健康度评估模型。

  • 多接口,是指选取服务池中多个具有代表性的接口,并且还会考虑整体服务池中接口的情况,比如我们在微博 web 系统中不仅选取了 feed 接口,还选取了计数器接口等。

  • 多指标,是指不仅仅选取单一指标作为参照,比如我们在实际压测过程中,会考虑接口的平均耗时、5XX 以及慢速比(延迟超过 1s 的比率)。

精确定位性能拐点以确定系统临界值

常用的系统压测方案主要包括两种:

  1. 在线缩减机器数量以增加单机承载量,从而压测到单机承载能力的最大值。

  2. 模拟洪峰,对服务池进行全链路压测,以模拟出峰值流量下系统的承载能力。

目前,我们主要采用方案 1 进行压测。通过减少在线机器数,以增加单机承载量来压测,直到服务池的健康度到达临界点时暂停压测,待系统恢复后,继续缩减在线机器数,否则则停止压测并记录服务池的临界值。

智能弹性调度系统

有了系统的最大承载能力,就可以根据实时监控系统中服务池当前的流量,来决定是否需要扩缩容以及扩容机器数。智能弹性调度的智能主要体现在两个方面:

快。

智能弹性调度并不等到系统的承载量已经濒临临界值时才进行扩容,因为此时可能流量很快上涨超过水位线,在扩容完成之前就已经把系统压垮了。为此,我们给系统设置了三条线:致命线、警戒线、安全线,如图 10 所示。

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

图 10. 智能弹性调度系统水位线

  • 致命线。从字面意义上即可理解,当服务池的流量一旦触及致命线,就应当立即扩容。通常致命线的设定与业务的重要程度有关,一般核心系统的致命线设定要高一些,保证足够的冗余度,目前微博核心 web 系统的致命线设定为 1.6 倍冗余。

  • 警戒线。当服务池的流量到达警戒线时,再结合业务指标综合考量是否需要扩容。以微博核心 web 系统为例,如果流量到达警戒线,并且 1s 的慢速比超过了 1%,也需要进行扩容。

  • 安全线。主要用于决策缩容,当服务池的流量在安全线以上,则可以进行缩容。

准。

主要体现在两个方面:防抖动和合理扩容。

  • 防抖动。当系统的承载量到达临界值时,理论上要进行扩容。但还要考虑在实际线上系统运行时,经常出现系统偶发的抖动现象,避免因为偶发抖动触发临界值进行扩容带来不必要的机器成本。为此,我们在智能弹性调度系统中,设定了 1min 的采集周期,并设置了 5min 的滑动窗口。在这个滑动窗口内采集的 5 个点中,任意满足 3 个点即判断需要扩容。

  • 合理扩容。智能弹性调度系统会根据系统当前的水位线,以及系统当前机器数评估出合理的扩容机器数,按需扩容,避免浪费机器成本。

混合云平台 DCP

混合云平台 DCP 主要职能是向内部私有云和外部公有云申请机器,并部署服务扩容到线上服务池。目前微博混合云 DCP 平台,具备 15 分钟内扩容 1000+ 服务器的能力,关于这部分的介绍不是本文的重点,感兴趣的童鞋关注微博 OpenDCP 的 github 主页:

https://github.com/weibocom/opendcp

作者介绍

胡忠想,微博服务化项目架构师、技术负责人。2012 年加入微博工作至今,承担过微博计数器架构升级,春晚和奥运服务保障,以及微博 feed 业务架构升级等工作。目前,主要专注于服务化方向,工作内容包括:微服务治理,弹性调度以及自动化监控等。

今日荐文

点击下方图片即可阅读

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

禅与互联网技术:龙泉寺的程序员们


更多智能运维实践

12 月 8-11 日 ArchSummit 北京站,除了邀请胡忠想老师进一步讲解《微博应对突发热点事件的弹性调度实践》之外,同话题里还有下述智能运维实践,欢迎前来现场讨论交流。

  • 阿里故障治理领域的智能运维实践

  • 阿里弹性容量管理探索

  • 百度智能故障自愈实践

  • 滴滴出行海量数据场景下的智能监控与故障定位实践

  • 拍拍贷基础架构的 DevOps 演进之路

识别下图二维码或戳阅读原文,了解更多!

流量小生DDOS攻击下,微博如何保证系统稳定不再挂?[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13648.html

(0)

相关推荐

  • redis安装与使用_etc在哪里安装

    redis安装与使用_etc在哪里安装NoSQL 1. 定义 NoSQL(Not Only SQL)即不仅仅是 SQL,泛指非关系型的数据库 2. 为什么使用 NoSQL? 传统关系数据库在应付动态网站、特别是超大规模和高并发的纯动态网站

    2023-05-30
    163
  • 揭秘 TiDB 新优化器:Cascades Planner 原理解析[通俗易懂]

    揭秘 TiDB 新优化器:Cascades Planner 原理解析[通俗易懂]作者:MingCong Han 在《十分钟成为 Contributor 系列 | 为 Cascades Planner 添加优化规则》中,我们简单介绍了 Cascades 的相关背景知识,本文将为大…

    2022-12-23
    128
  • 快速获取Python字典value对应的key

    快速获取Python字典value对应的key
    在Python编程中,字典(Dictionary)是一种非常常用且非常有用的数据结构。它可以储存键值(key-value)对,方便我们使用键(key)来快速找到值(value)。然而,在实际开发中,我们有时需要根据字典的值来获取与之对应的键,而这又是一个比较常见的问题。本文将介绍几种快速获取Python字典value对应的key的方法,以及它们的适用场景和性能比较。

    2024-03-02
    95
  • frame告警_flask-caching

    frame告警_flask-caching#发送告警邮件 cat check_backup.sh #!/bin/bash . ~/.bash_profile BASEDIR=`dirname $0` cd $BASEDIR parse_li…

    2023-04-01
    213
  • pgpool2_javapoi详细教程

    pgpool2_javapoi详细教程欢迎阅读 pgpool-II 入门教程。从本教程中,你将学会如何安装,设置 pgpool-II 以及使用 pgpool-II 运行并行查询和复制。我们假设你已经知道PostgreSQL的基础操作,所以

    2023-04-27
    135
  • Oracle学习笔记二十二:存储过程「终于解决」

    Oracle学习笔记二十二:存储过程「终于解决」一、存储过程简介 • 存储过程(Stored Procedure)是一组为了完成特定功能的PL/SQL语句块,经编译后存储在数据库中。 • 存储过程经编译和SQL优化后存储在数据库服务器中,使用时只要

    2023-05-21
    156
  • java JDBC工具类 分包[通俗易懂]

    java JDBC工具类 分包[通俗易懂]JDBC工具类 “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。 该工具类提供方法:public sta…

    2023-03-29
    162
  • Python词频统计代码

    Python词频统计代码在大量文本数据中,关键词的频次统计往往是必不可少的。无论是从市场营销角度还是从学术角度,词频统计都占有重要的地位。而Python作为一种擅长文本处理的编程语言,提供了一种快速而准确的词频统计方法。

    2024-06-29
    44

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注