前言
2009年的阿里云,2011年的盛大云,2012年的电信天翼云,2013年的腾讯云及华为云,2015年的百度云,国内的云计算市场可谓百花齐放。
>> 云端混合云、云端容器、云端监控演变、云端自动化运维、云端DevOps、云端智能化运维、云端安全、云端分布式架构八大技术架构实践。
>> 云端选型篇(第1~5章)云端选型篇介绍了在云端选择什么样的云平台做战略规划部署及业务体系建设,选择什么样的云产品来架构及规划业务,选择什么样的开发语言来应对业务开发需求,选择什么样的系统技术来搭建运维架构及实施,以及选择什么样的配置来部署业务及做容量规划等
>> 不同云厂商的业务方向、平台稳定性、平台安全性、平台服务质量、产品功能及价格等都有所不同。因此云平台的选择,决定了业务的体系建设及战略规划部署方向。
>> 第4章是本篇的重点,其核心内容包含云端网络、云端Web服务器、云端负载均衡、云端存储、云端缓存、云端数据库五个大类,基本覆盖云端千万级运维架构常见的运维技术。
>> 云端实践篇(第6~13章)云端实践篇是基于云端选型篇,对云端运维架构涉及的相关技术的重要实践,也是本书的重点篇幅,包含云主机、云端负载均衡、云端存储、云端缓存、云端数据库等云端最火热的技术的实践,并且结合上云迁移、混合云及容器、云端运维实践这三类云端最常见的热门需求,结合真实客户案例,向大家分享当前最热门、最流行的混合云技术架构、云端容器技术架构、云端监控演变及技术实践、云端自动化运维技术实践、云端DevOps技术实践等。
>> 块存储(云盘)、共享文件存储、OSS对象存储这三大云端非结构化数据存储的实践技巧及方法。从数据库的垂直拆库及水平拆表两个维度,讲述所涉及的垂直拆库、水平拆表的应用场景实践,以及所涉及的主从、集群、分布式Sharding三大数据库架构技术实践。
>> 第12章讲述物理机体系、云计算体系、容器体系这三大IT架构体系所对应的系统架构的演变过程,通过Nagios、Zabbix、云监控、Prometheus、TICK技术栈等十一大监控方案,介绍互联网监控技术的发展及演变过程,方案所涉及的技术也几乎覆盖了当今互联网最热门的监控技术。
>> 通过DevOps发展的四个阶段,即人工阶段、脚本及工具阶段、平台化阶段、智能化阶段,分析了云端容器、云端自动化运维、云端DevOps这三者之间的区别与联系。
>> 云端安全篇(第14~16章)随着云计算的发展,云端面临着挑战也面临着机遇。如何通过技术手段保障云端业务的安全性是本篇的核心内容。通过常见攻击案例,结合云端最佳安全防御方案,本篇将带你一起走进黑客攻防的世界。
>> 第17章讲述一个应用如何从架构原始阶段(即万能的单机)、架构基础阶段(即物理分离Web和数据库)、架构动静分离阶段(即静态缓存+对象存储)、架构分布式阶段(即负载均衡)、架构数据缓存阶段(即数据库缓存)、架构扩展阶段(即垂直扩展)演变发展到架构分布式+大数据阶段(即水平扩展)。
绪言 云计算带来的技术变革
1.中国互联网起点1994年4月20日中国实现了与国际互联网的全功能连接,但是直到1998年,我国的门户网站才兴起
2.IDC/数据中心的硬件时代2002~2012这10年期间,中国互联网得到了长足的发展。
运维人员在日常工作中,一半精力花在跟硬件打交道、跟IDC机房打交道。“IOE”是这个时代的经典组合:服务器提供商IBM、数据库软件提供商Oracle、存储设备提供商EMC。
3.云时代
2005年,Amozon宣布AWS(Amazon Web Service)云计算平台成立,这是全球云计算落地的起点。2009年,阿里云成立,这是中国互联网云计算的起点。
云计算低成本、高稳定性、高效率、可灵活扩展等诸多优点所带来的红利让千千万万企业受益。它在虚拟化+分布式+自动化平台的基础上解决了以下问题:❑ 稳定性:采用分布式集群部署,保障服务不宕机。❑ 弹性扩展:按需索取,一键式秒级开通资源。❑ 安全性:采用分布式多副本冗余部署,保障数据不丢失。❑ 成本:一台2核4GB服务器附赠5GB抗DDoS攻击流量,费用极低。❑ 易用性:Web管理控制台,智能化便捷操作。从技术角度来看,云平台只不过是虚拟化+分布式+自动化的一个综合类平台。
IT体系会经过3个阶段:1)物理机体系阶段。2)云计算体系阶段。在传统硬件服务器的基础上,通过虚拟化及分布式技术形成对应的云资源平台。在云资源平台上按需索取即可,而不用再和底层物理硬件打交道。3)容器体系阶段。我们既不用关注底层物理硬件,也不用关注用的云平台是AWS还是阿里云,我们的业务都能无缝过渡及运行。我们对计算资源的使用会脱离对硬件,甚至是对各个云平台的依赖。
对应的技术架构会经过以下4个阶段:1)单机架构的阶段。 2)集群架构的阶段。
集群架构的典型技术特点就是,一般采用虚拟VIP技术(如Keeplived、Hearbeat)解决单点故障问题,让架构高可用。而值得注意的是,在云端,对应的云产品底层都用集群架构来保障高可用。 3)分布式架构阶段。分布式架构最重要的特点就是,不管是业务代码还是数据库,都是通过多台服务器以分布式模式部署的。集群的虚拟VIP技术只能将一台服务器作为热备(Backup),并且只有在主服务器故障的时候,才会切换到热备上,平时其都是处于空闲状态。而分布式架构的技术特点就是,负载均衡的引入,让不同服务器同时应对业务压力,而如图2所示。4)微服务架构阶段。
第一篇 云端选型篇
1.1 全球云厂商占比
Gartner发布的2017~2018年全球IaaS报告,排名前三甲的分别为:亚马逊云、微软云、阿里云,2018年市场占比分别为30.4%、9.9%、4.9%。谷歌紧跟其后,占比2.6%。2018年国内云市场的竞争也逐步进入白热化
1.2 国内云厂商的现状Synergy Research Group的市场研究报告
国内众多云平台我也都使用过,阿里云在整体稳定性、安全性、性价比、产品功能等方面的综合性能处于国内第一地位。特别是2014年阿里巴巴收购了万网,致使阿里云拥有了一键便捷式的域名备案服务。这方面的优势是国内其他云服务提供商甚至亚马逊都无法相媲美的。腾讯云有一个特点,那就是游戏。相比其他云平台,腾讯云部署游戏类业务会更具有优势。百度近些年一直专注于人工智能,比如在江苏卫视《最强大脑》栏目中,百度机器人“小度”在人脸识别中战胜“水哥”王昱珩;而在2017百度AI开发者大会上,百度创始人、董事长兼首席执行官李彦宏通过视频直播了一段自己乘坐公司研发的无人驾驶汽车的情景,也展现了百度在人工智能领域的技术优势。所以,百度云的优势在于人工智能相关服务上,而在其他核心云资源服务领域,相比阿里云、腾讯云则有明显不足。
2.1 阿里云产品概要
使用云计算是有门槛的,而且门槛还不低。截至目前,阿里云有两百多款产品或服务。
主要为以下7大类:❑ 人工智能❑ 云计算基础❑ 物联网❑ 大数据❑ 安全❑ 企业应用❑ 开发者服务。通过这些年的云端实践,我们发现80%~90%的云端用户主要在使用以下几类云端产品,这也是我们企业级应用中必须要选择的5个云产品。1)ECS(Elastic Compute Service):云服务器2)RDS(Relational Database Service):关系型数据库3)SLB(Server Load Balancer):负载均衡4)OSS(Object Storage Service):对象存储服务5)VPC(Virtual Private Cloud):专有网络
ECS是业务代码服务的载体,作为云产品中的“基石”。而不管企业级应用还是个人应用,98%的应用基本上都是动态业务,很少见到一个只有一个静态html(当然也有这样的需求)的业务。这里必然会涉及与数据库的交互,所以涉及RDS。云的特性是分布式,传统IOE的单机应用很难展现云平台的优势,而SLB是让业务走向分布式的关键和基础,所以SLB排名第三。OSS的使用有个大门槛,就是需要通过API对文件进行增删查改,ossfs、ossutil等工具降低了OSS的使用门槛,比如,在Linux运维中可以通过“Crontab+OSS工具”实现文件的异地备份,这种运维方式在很大程度上替代了传统“备份服务器”的角色。 SNAT、VPN、专线都是基于VPC的,现在在云端企业级应用中,VPC基本上是默认的选择。但在实际应用中,一些金融客户还在使用经典网络,这样一来,安全性、架构扩展性等方面就受限了。
还有很多大家熟悉的云产品暂未放在使用率较高的系列中,比如:❑ CDN相关产品。❑ Memcache、Redis。❑ 云盾相关安全类产品。
2.2 云产品的8/2选择原则
在云端应用场景下,80%的企业(默认情况)会选择云产品,只有20%的企业会考虑自行搭建对应服务。
云产品的五个技术优势:1.省掉安装配置方面一些软件的编译安装工作量,比如PHP,经常会有依赖包、版本兼容等问题2.调优方面对于云产品,我们也不用关心一些性能参数要如何去优化,这一切云产品也会默认替你实现。3.备份方面在传统运维过程中,我们需要搭建主从、编写备份脚本以及操作Binlog来进行对应的备份及恢复,这方面对运维人员来说都是较大的挑战。4.高可用方面使用云产品,我们不用担心出现高可用方面的问题,也担心什么时候挂了没办法提供服务。在ECS、SLB、RDS、OSS等阿里云产品中,都是采用集群的方式部署对应的云产品,保证我们使用对应云产品的高可用性。比如,ECS和OSS都是三副本的数据冗余,而RDS,则是采用DNS+双Master架构来保障高可用性。除了开放给用户的一个RDS库以外,还有一个隐藏的从库未开放给客户(举例:进入RDS MySQL,通过“show slave status\G”可以看到隐藏的从库)。5.安全性方面,使用云产品,不用关心软件版本的安全性问题,也不用关心这个版本的软件有哪些补丁、漏洞要去修复,更不用关心这个软件会被攻击的问题,这都是云产品默认会做到的。
阿里云的很多云产品,如SLB、RDS、CDN等,其核心都是基于开源技术进行了封装并做了相应优化,然后形成对应的云产品。相应的封装给我们带来了相应的优势,但同时也给我们带来了相应的缺陷,比如,做了封装,必然会使很多原生态的功能和特性存在一定的使用限制。
1.七层SLB的功能限制
当前SLB产品已经支持虚拟主机,具有七层代表性的核心功能。如果想用Rewrite等更多七层功能,我们只能自行在ECS上搭建Nginx。
2.连接Redis,有密码鉴权
有些客户问这个密码鉴权能不能去掉,代码中采用了一个老的Ruby框架,不支持这个鉴权,也没办法改代码。
3.RDS MySQL对Myisam存储引擎的支持在用户的业务中,需要MySQL支持Myisam存储引擎。而RDS MySQL版默认只支持Innodb的存储引擎
4.云数据库MongoDB对跨地域多副本冗余的支持若客户对数据的安全性要求较高,并且云端和他们线下IDC做了专线打通,他们需要将云端的MongoDB数据在线下IDC中做个副本,当前云数据库MongoDB结合DTS还不支持此功能。所以我们在云端搭建了两个副本,在IDC上同步一个副本,组成MongoDB的副本集。综上可见,有些功能是云产品没办法支持的,且当前企业没办法调整自己的业务架构及代码。
第3章 软件技术选型
通过云端实践,用得比较多的还是Java、C#等具有Web框架的语言,以及PHP、Python所代表的脚本语言,主要原因是,云平台适合分布式应用,而这些热门的编程语言更加轻量化,方便分布式处理。
在云端实践中,几乎80%的Java应用都跑在Tomcat中。我们在云端很少看见Jboss、Weblogic等重量级中间件(相比于Weblogic,在云端还能偶尔看到有用户用Jboss部署相关业务),因为这些重量级中间件对服务器的性能要求较高,所以一般适用于传统IOE那套老架构。
另外,结合当前最热门的微服务架构,Spring Cloud是一套完整的微服务解决方案。在云端结合Docker的实践,也是当前在云时代最流行、最火热的做法。
在编程语言的排行榜中,一般Java、C、C++列居前三。与Java不同的是,C/C++是底层语言,与硬件结合度比较高。可以用来进行一些更贴近硬件的开发(主要是性能上),所以在ARM开发/智能家居/物联网/智能硬件等嵌入式行业应用广泛。C#在一些Windows工具中应用很广,比如黑客的SQL注入、DDoS攻击类软件方面的广泛应用。胶水语言”指的是用来连接软件组件的程序设计语言,通常指脚本语言。 而这其中,最著名的要属于Python语言了。Python开发的程序工具可以很方便地嵌套到Java、C、PHP、C#等开发语言中进行使用。
1)Ossutil是基于OSS API的一款OSS文件操作工具,源码通过Python实现,它可以实现对OSS文件的增、删、查、改等相应功能。在Linux运维中,我们可以采用“Shell+Ossutil”方式来对OS层面的文件、文件夹做异地备份。2)再如大家熟知的Ansible这款工具,源码也是基于Python的。我们可以通过Java来调用Ansible,以实现自动化的一些管理操作等。Python也是网络攻防的第一黑客语言,它正在成为编程入门教学的第一语言以及云计算系统管理的第一语言。Python程序员最爱说的一句话是:“人生苦短,我用Python。”这句话后面更多隐藏着Python设计的哲学:“优雅、明确、简单”。Python的主要优势还是在于代码量小、维护成本低、编程效率高。一般情况下,Python代码量是Java的1/5。
在云端实践中,Python一般会运用到以下3种热门场景中。1.DevOps:说到运维、自动化运维、DevOps, Python一直是热度最高的开发语言。2.网络爬虫:网络爬虫是Python擅长的强势领域。Python所具备的爬虫框架Scrapy、HTTP工具包urlib2、HTML解析工具Beautiful Soup,让其在爬虫方面非常高效、快捷。所以在数据分析、数据挖掘这方面,很多公司都会选择使用Python, Python在这方面有先天的语言优势。3.人工智能:Python已经是数据分析和人工智能的第一语言,早就成为Web开发、游戏脚本、计算机视觉、物联网管理和机器人开发的主流语言之一,随着Python用户的增长,它还有机会在更多领域登顶。
3.5 “世界上最好”的语言
在云端实践中,LAMP(Linux+Apache+MySQL+PHP)、LNMP(Linux+Nginx+MySQL+PHP)依然是成熟的热门架构。我们可以看到,PHP和Java在云端仍是出场频率最高的两种语言。在云端实践中,PHP相比于Java,在Web应用方面有以下3个优点:1.性能好
FastCGI PHP-FPM多进程模式,相比于单进程、多线程的Tomcat模式,其性能要好很多。
并且PHP-FPM中静态和动态管理进程的方式能够提升进程的稳定性及抗并发能力。而Tomcat是一个轻量级中间件,一般单台Tomcat的极限并发能力在1000左右。
2.无须相关的编译操作
PHP是脚本语言,我们不需要做相关的编译操作。而Java的运行需要先把Java源代码文件编译成class二进制文件。所以在PHP的发布部署、变更中,我们只需要替换以前的文件就能即刻验证。但在Java应用中,比如Tomcat,变更代码后需要重启。
3.集成简单PHP和MySQL、Memcache、Redis的集成很简单,甚至直接在php.ini配置文件中简单配置一下就能将Session存放在本地磁盘或者Memcache、Redis中。而Java做Session的集中化管理就没这么简单了,需要通过代码来实现。
3.6 最适合高并发的语言
截至今年(2019年), Go语言的火热程度仅次于Python。在后端应用中(包括我公司的CloudCare系列产品),更多人选择用Go语言来替换Java,以避免Java占用系统性能资源过多。Go语言特别适合编写一些有性能瓶颈的业务,内存占用也非常少。其近C语言的执行性能、近解析型语言的开发效率以及近乎完美的编译速度,使其风靡全球。特别是在云项目中,大部分都使用了Golang进行开发。比如国内第一个“勇于吃螃蟹”的,七牛云平台就在产品中大规模地应用Go,而开发效率和系统稳定性等客观数据也在持续证明这一选择的正确性。
3.7 唯一的前后端语言
JavaScript是一门前端语言。以前我做Java开发的时候,热门的前端框架是jQuery、Ext,现在比较热门的前端框架是Angular、Vue。Node.js是一个基于Chrome V8引擎的JavaScript运行环境。Node. js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。简单地说,Node.js就是运行在服务端的JavaScript,它让JavaScript既是前端语言又是后端语言。 那时“Node.js+MongoDB”敏捷开发的概念特别火。
在云端实践中,采用Node.js做网站类开发的还算比较常见。所以在ECS中安装Node.js,配置NPM(Node.js包管理工具)也是常见的运维部署事项。值得注意的是,Node前期没有专门的进程管理工具,一般采用“Shell+nohup”方式来管理Node进程,或者采用Supervisor专门的进程管理工具来对Node进程进行管理。后来Node推出了PM2——一款专门管理Node进程的工具(类似PHP的进程管理工具PHP-FPM),这让Node在云端的维护管理变得规范化。
3.8 不可替代的机器语言
>汇编语言的传统应用场景主要有两个:❑ 在单片机编程里面,使用汇编语言,直接操作硬件。❑ 在高级语言编程中,专门针对某些额外影响性能的关键函数使用汇编语言改写,进行代码优化。
第4章 系统技术选型
最终需要确认使用什么系统架构技术来进行云端运维部署。本章是选型篇的重点篇幅,其核心内容包含云端网络、云端Web服务器、云端负载均衡、云端存储、云端缓存、云端数据库6个大类,基本覆盖了云端千万级运维架构常见的运维技术
4.1 云端网络的三种选型策略
云端目前可选的网络架构包括经典网络、VPC专有网络、金融云网络等。其中,金融云网络也是基于VPC的专有网络,只不过在此基础上加入了很多安全规则及限制保障更高的安全性需求。
从技术原理上来讲,经典网络和VPC专有网络又有什么区别呢?经典网络采用三层(网络层,即IP层)隔离,所有的经典网络类型实例都建立在一个共用的基础网络上。VPC采用二层隔离(数据链路层),相对经典网络而言,VPC具有更高的安全性和灵活性。
>> 注意点1:网段方面经典网络的内网IP是以10开头的随机IP,且内网IP只能随机分配,不能自定义。而在VPC网络中,每个客户都是独立的网络环境。客户可以自定义网络的IP段、网络架构等。
>> 注意点2:网卡方面经典网络绑定公网的ECS(Linux系统),系统中网卡是两个网卡。eth0是内网网卡,eth1是公网网卡。如果没有绑定公网,则经典网络仅有一个内网eth0。
>> VPC网络的ECS仅有一个eth0网卡(绑定弹性IP的时候,公网数据是通过阿里云内部NAT的方式流转到ECS的eth0网卡上的
>> 这里有个很重要的实践:经典网络下,只能在开通ECS的时候选择绑定公网。如若开通ECS的时候没有选择绑定公网,开通后没办法再绑定公网。弹性IP针对VPC网络,灵活性非常高。想用时随时可以绑定公网弹性IP,不用了随时解绑。所以在爬虫、容易被墙需要经常更换公网IP的业务中,这是非常好的一个功能应用。
>> 注意点3:网络隔离方面经典网络客户和客户之间的数据通过安全组三层隔离。如果需要互通,安全组配置互访规则即可。 当前在阿里云不用划分多个阿里云账号了,可以通过一个阿里云账号开通RAM权限划分有效解决。VPC和VPC之间默认二层隔离(不管是同阿里云账号下的不同VPC还是不同阿里云账号下的VPC),如果需要互通则只能走高速通道(专线)。从上述对比中能看出来,经典网络在内网隔离的安全性方面不太好。
注意点4:网络功能方面上述网段划分、网段隔离功能,仅VPC网络支持。混合云的架构必须基于VPC网络环境。
>> 注意点5:网络实践方面
经典网络:方便快捷,不需要设置VPC、vSwitch、网络规划等。它是随机内网,开通即用。一般适合部署个人应用、个人站点等。
VPC网络:企业默认的网络架构选择,网段划分、网络隔离及相关网络功能都是企业级网络所必需的。
>> 4.1.2 策略二:入网请求选型的四种方法
在云端对ECS实现入网请求的功能,可以通过以下4种方法实现。❑ SLB网络:七层和四层的负载均衡,都能将公网的请求流量引入到ECS中。❑ 公网IP:经典网络的公网IP,能直接将公网的请求流量引入到ECS中的eth1网卡上。❑ 弹性EIP:VPC专有网络的弹性EIP,能直接将公网的请求流量引入到ECS中的eth0网卡上。❑ DNAT:通过端口映射能直接将公网的请求流量映射到ECS的内网端口上。值得注意的是,在云端我们可以通过Iptables或者NAT网关实现DNAT的端口映射。
>> 通过以上4种方法,我们把云端入网请求的类型划分为以下两大类。1)负载均衡类:DNAT端口映射的基本原理就是负载均衡,即DNAT和四层负载均衡的本质是一样的,在内核层修改访问者的目标IP和目标端口。2)公网IP类:经典网络的公网IP和弹性EIP的本质基本相同,都是绑定在ECS上,直接为ECS提供公网互访能力。
公网IP类,是云端实践中大家为ECS提供公网访问的最常见做法。在云端实践中,为ECS直接绑定公网主要的场景需求有以下3点。❑ ECS服务需要暴露给公网。❑ 需要公网远程登录到这台服务器进行维护。❑ ECS上部署的服务需要去公网调用及请求第三方的服务及接口。但给ECS绑定公网存在很大安全隐患,这等同于给黑客开了一道能触达ECS的门,方便通过端口扫描、漏洞嗅探实现入侵。
>> 4.1.3 策略三:出网请求选型的三种方法
在云端对ECS实现出网请求的功能,可以通过以下3种方法实现。❑ 公网IP:经典网络的公网IP,通过ECS中的eth1网卡将ECS的出公网请求流量发出。❑ 弹性EIP:VPC专有网络的弹性EIP,公网的请求流量在云平台内部通过NAT映射出公网。❑ SNAT:通过路由将公网请求的流量映射到NAT网关,或者一台具有公网访问能力的ECS上,再由这台ECS将公网请求流量转发出去。
请求的类型划分为以下两大类。❑ 公网IP类:经典网络的公网IP和弹性EIP的本质差不多,绑定在ECS上,直接为ECS提供公网互访能力。❑ SNAT类:不支持经典环境,在VPC环境中,我们可以选择一台具有公网访问能力的ECS(绑定了公网IP),通过配置Iptables来实现SNAT。云诀窍--阿里云流量带宽峰值、流量带宽费用针对的是出口流量峰值及出口流量带宽费用。比如,5Mbps的带宽峰值是指出口带宽峰值,并不是入口带宽峰值,相反,入口流量峰值是不受限制的。在这种流量攻击中,唯一可能产生费用的就是CC攻击,其类似于刷网页,这会导致出口流量增加,产生额外的流量费用。
4.2 云端Web服务器的五点选型考虑
>> 目前最主流的3个Web服务器是Apache、Nginx、IIS。
>> 首先来看看Web服务的发展所经过的3个阶段。❑ Web1.0:本质是联合,以静态、单向阅读为主,如早期的新浪、搜狐门户网站。内容一般由站长更新维护,缺乏用户分享互动。
>> ❑ Web2.0:本质就是互动,它让网民更多地参与信息产品的创造、传播和分享,如天涯论坛、微博都是Web2.0典型的应用。而这时候的Web服务一般偏向复杂的动态内容的应用(如PHP、JSP),不仅仅是单纯的静态内容了。❑ Web3.0:是在Web2.0的基础上发展起来的,能够更好地体现网民的劳动价值,并且能够实现价值均衡分配的一种互联网方式。在未来,Web3.0会基于人工智能,用浏览器即可实现复杂的系统程序才具有的功能。
在云端Web类应用中,Apache/Nginx/IIS的出场率高达95%以上。Apache是Web服务器的“领头人”,同时Nginx作为Web服务器也是非常优秀的,IIS主要作为Windows服务器下的Web类应用。
我们在云端的实践中,偏向用Nginx的现象是非常明显的
Apache与Nginx的实践对比有以下4点,这4点也是进行云端Web服务器选型时的考虑依据。4.2.1 考虑一:稳定性
Nginx+FastCGI(PHP-FPM)运行PHP应用,整体跑下来也挺稳定的。当前在云端LNMP(Linux+Nginx+MySQL+PHP)架构的应用明显比LAMP(Linux+Apache+MySQL+PHP)要多,有替代其趋势。
>> 4.2.2 考虑二:性能Nginx基于Epoll网络IO模型,Apache基于Select网络模型。Nginx相比Apache,高性能、高并发、系统资源占用少。Nginx核心特点是轻量级!Nginx官网表示,Nginx保持10000个没有活动的连接,而这些连接只占用2.5MB内存。Apache强大的处理功能导致各种模块过于臃肿,带来性能上的较大损耗。
>> 4.2.3 考虑三:对负载均衡功能的支持
4.3 云端负载均衡选型的五个方面
1.LVS 从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无须给内核打任何补丁,可以直接使用LVS提供的各种功能。它具有以下一些特性。❑ 工作在网络二层/三层/四层之上仅作分发之用,对CPU和内存消耗极低,抗负载能力极强。特别是在DR模式下,流量会走后端服务器的网卡,这个特点也决定了它在负载均衡软件里的性能是最强的,甚至能媲美硬件服务器。❑ 由于当前Linux内核直接集成了LVS,所以配置性比较低,并不需要太多接触,没有复杂的配置项,大大减少了人为出错的概率。❑ 应用范围比较广,因为LVS工作在二层/三层/四层最底层,所以它几乎可以对所有应用做负载均衡,包括HTTP、数据库、在线聊天室等,并且LVS的3种工作模式、10种调度算法使其在负载均衡端有更灵活的策略选择。
LVS也有它的缺点,下面一起来看一看。❑ 云端ECS不支持LVS的部署,所以对二层/三层/四层负载均衡需求,只能使用云产品SLB的四层负载均衡功能替代,或者自行部署Nginx/HAProxy。❑ LVS不支持七层的虚拟主机、Rewrite正则表达式处理、动静分离等功能。而现在许多Web网站在这方面已有较强的需求,这是Nginx/HAPrxoy的优势所在。❑ LVS适合应用在中大型应用中,不适合中小型应用,特别是中小型网站的应用。对于虚拟主机、动静分离、正则分发的需求,一般使用Nginx就能直接实现,而且Nginx的万级别的高并发处理能力应对中小型的应用绰绰有余。
2.Nginx Nginx(Engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
其特点是占用内存少、并发能力强,加上丰富的插件功能模块,当前是云端Web类应用中首选的一款软件。以下是它的具体特性。1)可以做七层HTTP的负载均衡,可以针对HTTP应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活。2)从1.9.0版本开始,Nginx支持对四层TCP的负载均衡功能。这让Nginx如虎添翼,成为顶级软件 3)Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的Web架构,在高流量的环境中稳定性也很好,几乎替代了LAMP的Web架构。4)Nginx现在作为Web反向加速静态缓存越来越成熟,Nginx也可作为静态网页和图片服务器。其速度比传统的Squid服务器更快,基本上CDN在底层静态缓存服务器的选择,如今Nginx是一个成熟的解决方案。
5)Nginx社区非常活跃,第三方模块也很多,比如对Memcache、Redis、LDAP、MongoDB的插件支持等,甚至可以结合Lua在七层定制化开发,实现更多满足业务需求的功能。比如开源WAF:OpenResty,是七层防御中成熟的解决方案(相关内容在第14章中会详细介绍)。
Nginx的缺点如下。1)对后端服务器的健康检查,只支持通过端口来监测,不支持通过URL来监测。这就会导致,在七层的健康监测中,很多情况下端口是正常的,但应用URL访问异常,Nginx却不能识别,反而主动剔除这个有问题的服务器,最终导致客户端继续访问有异常的服务器。2)相比于HAProxy, Nginx在七层对会话保持的功能就弱了些,Nginx默认只支持通过配置ip_hash(通过识别客户端IP,将请求转给后端同一个服务器达到会话保持的效果)。ip_hash在实践中虽然解决了会话保持的问题。其实并不能在七层中做到很好的流量均衡。Nginx可以通过第三方模块向客户端植入Cookie达到会话保持的目的,它解决了ip_hash的缺陷,但是这种方式需要重新编译Nginx增加nginx-sticky-module模块。
3.HAProxy HAProxy是一个使用C语言编写的自由及开放源代码软件,是一款主要作用在七层HTTP和四层TCP上的负载均衡软件。和LVS一样,主要是一个专业级的负载均衡。以下是HAProxy的特性说明。1)HAProxy是一款专注在七层/四层的软负载均衡软件,但相比于Nginx少了相应的Web服务器、静态缓存、丰富的第三方插件等功能。2)HAProxy的优点能够弥补Nginx的一些缺点,比如在七层中对会话保持的支持,只需要简单配置对应参数就能选择不同策略方式来满足会话保持。同时在健康检查中,支持通过获取指定的URL来检测后端服务器的状态。 4)作为一款专业级的负载均衡软件,HAProxy的策略非常多,HAProxy的负载均衡算法现在具体有8种,这方面相比Nginx来讲也是一个优势。
下面来看看HAProxy的缺点。相比Nginx, HAProxy在云端的实践运用是比较尴尬的。一方面,HAProxy在七层和四层的负载均衡的应用场景几乎被云产品SLB覆盖了。另一方面,Nginx也几乎能替代HAProxy在七层和四层负载均衡的功能应用。我们更加倾向于选择Nginx。
4.阿里云SLB
阿里云SLB(Server Load Balancer)当前提供四层(TCP协议和UDP协议)和七层(HTTP和HTTPS协议)的负载均衡服务,SLB的架构如图4-4所示。[插图]图4-4 阿里云SLB架构
>> ❑ 四层采用开源软件LVS(Linux Virtual Server)+Keepalived的方式实现负载均衡,并根据云计算需求对其进行了个性化定制。❑ 七层采用Tengine实现负载均衡。Tengine是由淘宝网发起的Web服务器项目,在Nginx的基础上,针对有大访问量的网站需求添加了很多高级功能和特性。 Tengine开源地址:http://tengine.taobao.org。
有疑问加站长微信联系(非本文作者)