如何利用云计算( 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 万用户的情况下,网站是否还能正常服务呢?
核心需求
核心的需求 我需要很多的资源,服务器,网络,存储。我需要把程序放上去测试,搭建好环境,模拟出状态,并得出结果。
可能的解决方案:
- 买很多电脑和网络设备,搭一套平台,搭起来,测试完再卖掉。不过简单算算买 40 台服务器的硬件价格,我就只能放弃了。
- 暂时租用一批电脑和网络设备,租一段时间,为租用时间花钱,就像小时候 租录像带和 VCD 盘那样,我不需要买很多片子,我只要每天花几块钱,租了看就可以。
方案 2 就是云计算
云计算的概念很广,这里的云计算可以特指 Iaas, 你可以简单的认为,远处有一个机房,你可以在这个机房暂时租用一些机器,几个小时或者几天以后,你就可以把这些机器还给机房,然后出一点租金。
云计算商家选择
国外: AWS.
国内:腾讯云 UC ...
我选择: AWS
理由:
- 入门门槛最低
- 文档和资料最齐全
- 有中文版
- 可以全程网页操作
- 东京区可以直连了
- 此外在 AWS 上访问各种网络资源速度非常快,不会被墙,相对国内云是个非常大的优势
缺点:
- 必须用信用卡
- 连接网络质量相对较差
- 技术支持和客服交互需要英语
这里的例子是测试 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 美金。测试你的信用卡是否正常。这 1 美金不会真正的扣除,大概是这样,完成整个注册过程。如有有问题 请帮我修正。
软件部分 你需要准备以下的几样东西
考虑到 windows 的普及性,我 windows 平台上完成测试。 Mac os,Linux 的用户使用会在使用密钥的时候稍有不同,但问题不大。
- windows 电脑一台
- linux 电脑一台(主要是转换密钥用)
- 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 的确很好用)