V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
firefox12
V2EX  ›  程序员

利用 AWS 完成百万级用户的压力测试

  •  
  •   firefox12 · 2016-05-05 23:23:31 +08:00 · 916 次点击
    这是一个创建于 3122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何利用云计算( AWS )进行百万用户压力测试

    本文是记录利用云计算( AWS )对一个开源软件进行百万用户压力测试的过程,你可以认为是一篇云计算使用的基本入门文章。文章将一步步的展示作者一个人是如何利用云计算,构建,部署,测试,验证百万用户压测试这一过程的。希望能给云计算的使用者一点启发。文中所使用的所有代码 脚本,都可以在 https://github.com/xiaojiaqi/fakewechat 找到,本文的 wiki 地址在 https://github.com/xiaojiaqi/fakewechat/wiki/Stress-Testing-in-the-Cloud。 。因为个人能力有限,文中难免有各种错误,请谅解。如果有错误 建议 欢迎邮件 ppmsn2005#gmail.com

    背景及需求介绍

    我们为什么需要云计算?

    背景

    几个月以前 我开发了一个分布式的软件:fakewechat. 这是一个开源通信系统的原型,它实现了服务器的后端功能。比如它可以为用户提供可靠的通信,可以水平扩展。(它还是只是一个原型,和成熟的商业产品对比 没有意义)

    现在我模拟测试了 1 千,1 万用户时候的场景,我认为符合我设计的要求。现在我想验证我的设计在 100 万用户的情况下,会怎么样?没有实践是没有发言权的,所以我需要模拟一个环境测试一下。 假设我是一位网站的工程师,现在网站每天服务 10 万人。我想测试当每天有 100 万用户的情况下,网站是否还能正常服务呢?

    核心需求

    核心的需求 我需要很多的资源,服务器,网络,存储。我需要把程序放上去测试,搭建好环境,模拟出状态,并得出结果。

    可能的解决方案:

    1. 买很多电脑和网络设备,搭一套平台,搭起来,测试完再卖掉。不过简单算算买 40 台服务器的硬件价格,我就只能放弃了。
    2. 暂时租用一批电脑和网络设备,租一段时间,为租用时间花钱,就像小时候 租录像带和 VCD 盘那样,我不需要买很多片子,我只要每天花几块钱,租了看就可以。

    方案 2 就是云计算

    云计算的概念很广,这里的云计算可以特指 Iaas, 你可以简单的认为,远处有一个机房,你可以在这个机房暂时租用一些机器,几个小时或者几天以后,你就可以把这些机器还给机房,然后出一点租金。

    云计算商家选择

    国外: AWS.

    国内:腾讯云 UC ...

    我选择: AWS

    理由:

    1. 入门门槛最低
    2. 文档和资料最齐全
    3. 有中文版
    4. 可以全程网页操作
    5. 东京区可以直连了
    6. 此外在 AWS 上访问各种网络资源速度非常快,不会被墙,相对国内云是个非常大的优势

    缺点:

    1. 必须用信用卡
    2. 连接网络质量相对较差
    3. 技术支持和客服交互需要英语

    这里的例子是测试 fakewechat, 当然如果你是网站, AWS 做测试也是完全没有问题的。只是复杂度会有所提高,但是原理都一样。

    目标

    操作目标: 1 位操作人员,在 10 分钟内完成项目,启动,部署和启动测试过程(不包括数据准备的过程),实现 fakewechat 项目百万用户压力测试。

    涉及 AWS 的模块

    在这个测试中我们主要涉及弹性云和私有网络这 2 项服务

    AWS 的基本概念:

    弹性云

    简称为 EC2 , Amazon Elastic Compute Cloud (Amazon EC2) 是一种 Web 服务,可在云中提供大小可调的计算容量。该服务旨在降低开发人员进行网络规模级云计算的难度。

    安全私有云

    简称为 VPC , Amazon Virtual Private Cloud (Amazon VPC) 允许您在 Amazon Web Services (AWS) 云中预置一个逻辑隔离分区,让您在自己定义的虚拟网络中启动 AWS 资源。您可以完全掌控您的虚拟联网环境,包括选择自有的 IP 地址范围、创建子网,以及配置路由表和网关。

    你可以这样简单理解 Ec2 就是虚拟机,它是你的计算资源。你可以启动很多虚拟机,然后在上面安装各种软件,提供服务。而 VPC 就是对你网络拓扑的描述,它描述了 你的网络是怎么构成的,外部用什么 DNS , IP 来访问,有那些子网,网关,路由。这样 Ec2 的主机拥有了私有或者公有的 IP ,就可以为用户服务了。

    AWS 的概念非常复杂,要全部理解不是这样一篇小小的文章可以解决。

    系统架构

    首先我们需要考虑如何设计一个水平扩展的架构。

    下图是系统的架构图

    我们可以看到架构在设计的时候已经考虑到了水平扩展的问题。所以,我们可以将系统 Cell 化。具体设计思想可见文档,简单的说我们可以把所有需要的服务划分为一个 Cell,一个 Cell 是可以独立的为用户提供服务的。

    注意 简单的按照用户 id 号划分集群,会有非常大的局限性,实际生产环境中不能简单的使用。目前项目还没有实现实现动态的调度和配置,以后会实现这个要点。

    为了进一步节省成本 系统还可以被优化成这个样子

    一个虚拟机模拟一个集群,完成集群里所有的业务。(需要注意 这样的测试大部分流量并没有走真正的网络,和真实网络情况有差异。) 这样可以最大程度的节省成本。

    如果在真正的生产环境,我们可以把各个服务进程分配到各个独立的服务器上,提高服务的能力。当用户人数降低的时候,我们又可以简单地把服务进程收缩到少数的服务器上,节省支出。真正的做到 收发自如。(本文离真正的收发自如还有 10 万多公里,剩下的路还需读者自行钻研)

    画一下我们的测试需要用到网络拓扑图

    这个拓扑比较简单,我简单的描述一下里面各个节点和作用

    测试者: 测试者就是作者,作者利用 internet 连接进 AWS 集群,完成百万用户的测试 子网: 在这里我将测试划分为 2 个子网 10.0.1/24 和 10.0.2.0/24 .其中 10.0.1.0/24 这个子网有互联网的接入能力,也只放置了一台主机 10.0.1.11. 因为我需要在这台主机下载各种需要的软件包。 而 10.0.2.0/24 里面可以启动非常多的主机,比如从 10.0.2.11-10.0.2.200. 它们可以和主机 10.0.1.11 互通。它们可以每台服务器模拟一个集群,可以几台服务器模拟一个集群。

    注意,一般来说我们会把网段做更好的规划。比如 10.0.2.0/24 这个网段作为接入服务器的网段。放置 100 台计算服务器。 10.0.4.0/24 这个网段作为数据库的网段,放置数据库,网络之间连接使用专门的网络设备。我这个测试比较简单,所有的东西都在同一个子网内,服务器之间的流量也不是非常大。

    这一切和真正的实际环境,业务模型都有很大关系。 总之这里是个简单版本

    初探 AWS

    准备

    开始 AWS 之旅 如果网络不好的,也许需要翻墙。

    1. 首先准备账号
    2. 准备信用卡

    访问 http://aws.amazon.com/cn/

    注册帐号

    创建用户

    输入用户信息

    输入信用卡

    我的账号是几年以前注册的,我记得当时会有电话回拨,输入验证码,然后信用卡会被扣除 1 美金。测试你的信用卡是否正常。这 1 美金不会真正的扣除,大概是这样,完成整个注册过程。如有有问题 请帮我修正。

    软件部分 你需要准备以下的几样东西

    考虑到 windows 的普及性,我 windows 平台上完成测试。 Mac os,Linux 的用户使用会在使用密钥的时候稍有不同,但问题不大。

    1. windows 电脑一台
    2. linux 电脑一台(主要是转换密钥用)
    3. SSH 客户端软件 这里我使用 SecureCRT

    简单使用

    使用 AWS

    浏览一下首页,右上端显示我正在使用东京区的网页控制台。 主服务区里面罗列了, AWS 提供的所有服务。目前我们只需要使用 2 种 弹性云,安全私有云。

    点击右上端的"东京", 会罗列出所有的区域,你可以选择不同的区域跳转

    点击首页的弹性云,可以看到弹性云的主页面。

    点击启动实例就可以启动开启一个弹性云的主机。

    第一步 选择一个 AMI , AMI 就是磁盘镜像,和 Ghost 很类似。 AMI 分为我的 AMI , AMI MarketPlace, 社区 AMI, AMI 标签里有 AMI ID , 根存储设备, 虚拟类型这几个参数。 注意 某些 AMI 是要收钱的。

    第二步, 选择一个实例类型,实例的差别主要体现在 CPU,内存,网络

    第三步,主要是配置网络,如子网,是否拥有外网 IP 等等

    第四步,选择存储,也就是为主机选择一块"硬盘"

    第五步 设置标签实例

    第六步 设置安全组,也就是设置网络端口

    最后运行实例

    运行以后大概就是这样

    AWS 的基本概念

    主机部分:

    • Region: 分区,简单的说 就是这个机房在那个位置。
    • 实例类型: 就是主机的配置,它决定有多少 CPU 内存 网络设备
    • AMI : 镜像,你可以想象为一个操作系统安装盘。它有一个唯一 ID ,同时它决定了使用哪种虚拟类型。
    • 虚拟类型: hvm, pv. 两种的区别就是全虚拟和半虚拟,在性能上有差别。
    • 存储设备: 一般分 ESB 和 SSD.ESB 是弹性块存储, SSD 应该就是我们常见的 SSD.可以根据业务类型做选择。
    • 密钥: 你通过网络连接主机时候的密钥,主要保护你主机的安全。

    网络部分:

    • VPC : VPC 就是一套网络配置的总称
    • IP: 一台主机拥有的 IP ,有内部也有外部
    • 子网: 就是网络子网
    • 安全组:可以认为是网络安全配置,决定了那些数据包可以通行,可简单的认为就是防火墙。

    注意点:

    主机选择:

    主机类型的选择: AWS 将主机分为了 通用,计算,内存。

    CPU 核数从 1 到 32...

    某些主机 CPU 有积分, 如果你使用一个 CPU 很弱的主机,跑一个重 CPU 的业务,那么它将迅速的把这个主机的 CPU 主机资源消耗殆尽,然后进入非常低速的状态,这时使用 top 检测系统,表现的状态就是 st 非常高。 aws 很精明,它将计算资源,内存资源,网络资源,存储资源都做了非常精确的划分。所以你需要谨慎的选择你的主机类型,不要让小马拉大车,同时也要避免大马拉小车的浪费。

    解决办法: 在软件设计的时候,应该有各种参数控制程序对资源的使用,比如线程并发数,队列长度,是否可以暂停请求等等。你可以通过调节参数让主机的负载能力和 cpu 网络 的消耗符合要求。

    Region :

    各个分区的主机价格是不一样的!但是离你太远的话,网络又是问题。所以你需要做一个折中。

    AMI :

    有一些 AMI 是要花钱的,而且价格不菲。 比如 t2.Micro +RHEL 每小时是 0.08$ 而纯的 T2.Micro + linux 是 0.02$. 如果你在 t2.Micro 上使用 1 小时的 RHEL, 就可以使用等额 4 小时的 Centos. 作为工程师必须节约资源! (当然默认的 RHEL 的确很好用)

    9 条回复    2016-05-06 17:39:35 +08:00
    firefox12
        1
    firefox12  
    OP
       2016-05-05 23:25:21 +08:00
    很不幸 V2EX 没办法把关键的部分贴出来,重新开一贴
    qa52666
        2
    qa52666  
       2016-05-05 23:26:20 +08:00 via Android
    好厉害的样子
    cnnblike
        3
    cnnblike  
       2016-05-05 23:32:43 +08:00 via iPhone
    收藏了,明天细读
    irainsoft
        4
    irainsoft  
       2016-05-05 23:56:23 +08:00 via Android
    这后半部分写的也太详细了吧...新手教程级别的详细...
    tracymcladdy
        5
    tracymcladdy  
       2016-05-06 00:32:01 +08:00
    我觉得楼主这样压意义不大啊。
    脱离具体业务做压力测试是吃力不讨好啊。
    生产环境上压,然后基于压力测试的结果调优 linux 系统,中间件,缓存,数据库等相关的参数,优化资源配置,顺便代码级优化相应慢的 url 才是正道啊。。
    binux
        6
    binux  
       2016-05-06 00:36:59 +08:00
    你前面铺垫这么多。。结果只用了 EC2 ,根本就是当 VPS 在用,根本就没有用到「云」啊
    不说 DO , Linode ,就是国内云,它们也有内网啊,需求也能满足啊。
    firefox12
        7
    firefox12  
    OP
       2016-05-06 10:28:30 +08:00
    @tracymcladdy 我在验证产品原型,验证架构的设计有扩展能力,所有的开发 测试 设计 编码只有我一个人,目前只能做成这样
    SlipStupig
        8
    SlipStupig  
       2016-05-06 16:35:36 +08:00
    @firefox12 这种跟 AB 直接压力测试有啥区别吗?
    firefox12
        9
    firefox12  
    OP
       2016-05-06 17:39:35 +08:00
    @SlipStupig 本质上没区别,这个测试完全可以用 ab 来做,但是需要生成符合要求的 url 而且不是一种请求,是多种请求,还需要判断状态,改变流程, ab 并不合适。
    压力测试主要测试系统的负载能力, ab 可以做高并发,但我在入口做了保护,所以 不是你压力大就可以击垮我的系统的。系统的处理解决能力决定了能放多少哦请求进来 , Taobao 的双 11 交易数不过是 11 万 /s. nginx 多核很容易做到几万 qps ,难道几台服务器就能支持 Taobao 的双 11 了? 所以外部请求和核心处理是需要匹配。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3117 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:45 · PVG 18:45 · LAX 02:45 · JFK 05:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.