如何处理负载、高并发

从低成本、高性能和高扩张性的角度来说有如下处理方案: 1、HTML 静态化 其实大家都知道,效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能 使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的 方法。 2、图片服务器分离 把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上, 如骑牛等 3、数据库集群和库表散列及缓存 数据库的并发连接为 100,一台数据库远远不够,可以从读写分离、主从复制, 数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如 memcache、 redis。 4、镜像: 尽量减少下载,可以把不同的请求分发到多个镜像端。 5、负载均衡: Apache 的最大并发连接为 1500,只能增加服务器,可以从硬件上着手,如 F5 服务 器。当然硬件的成本比较高,我们往往从软件方面着手。 负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效 透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时 能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是 Nginx、LVS、 HAProxy。我分别来说下三种的优缺点: Nginx 的优点是: 1. 工作在网络的 7 层之上,可以针对 http 应用做一些分流的策略,比如针对域名、目 录结构,它的正则规则比 HAProxy 更为强大和灵活,这也是它目前广泛流行的主要原因 之一,Nginx 单凭这点可利用的场合就远多于 LVS 了。 2. Nginx 对网络稳定性的依赖非常小,理论上能 ping 通就就能进行负载功能,这个也 是它的优势之一;相反 LVS 对网络稳定性依赖比较大,这点本人深有体会; 3. Nginx 安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。 LVS 的配置、测试就要花比较长的时间了,LVS 对网络依赖比较大。 4. 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负 载度比 LVS 相对小些。 5. Nginx 可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态 码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不 支持 url 来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中 出现故障,Nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了,如果是 上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。 6. Nginx 不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的 Web 应用服务器。LNMP 也是近几年非常流行的 web 架构,在高流量的环境中稳定性也很好。 7. Nginx 现在作为 Web 反向加速缓存越来越成熟了,速度比传统的 Squid 服务器更快, 可以考虑用其作为反向代理加速器。 8. Nginx 可作为中层反向代理使用,这一层面 Nginx 基本上无对手,唯一可以对比 Nginx 的就只有 lighttpd 了,不过 lighttpd 目前还没有做到 Nginx 完全的功能,配置也不 那么清晰易读,社区资料也远远没 Nginx 活跃。 9. Nginx 也可作为静态网页和图片服务器,这方面的性能也无对手。还有 Nginx 社区非 常活跃,第三方模块也很多。 Nginx 的缺点是: 1. Nginx 仅能支持 http、https 和 Email 协议,这样就在适用范围上面小些,这个是它 的缺点。 2. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过 url 来检测。不支 持 Session 的直接保持,但能通过 ip_hash 来解决。 LVS:使用 Linux 内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的 可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。 LVS 的优点是: 1. 抗负载能力强、是工作在网络 4 层之上仅作分发之用,没有流量的产生,这个特点 也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。 2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并 不需要太多接触,大大减少了人为出错的几率。 3. 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS+Keepalived,不过我们在项目实施中用得最多的还是 LVS/DR+Keepalived。 4. 无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能 不会受到大流量的影响。 5. 应用范围比较广,因为 LVS 工作在 4 层,所以它几乎可以对所有应用做负载均衡, 包括 http、数据库、在线聊天室等等。 LVS 的缺点是: 1. 软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有 较强的需求,这个是 Nginx/HAProxy+Keepalived 的优势所在。 2. 如果是网站应用比较庞大的话,LVS/DR+Keepalived 实施起来就比较复杂了,特别后 面有 Windows Server 的机器的话,如果实施及配置还有维护过程就比较复杂了,相对 而言,Nginx/HAProxy+Keepalived 就简单多了。 HAProxy 的特点是: 1. HAProxy 也是支持虚拟主机的。 2. HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie 的 引导;同时支持通过获取指定的 url 来检测后端服务器的状态。 3. HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。 4. HAProxy 支持 TCP 协议的负载均衡转发,可以对 MySQL 读进行负载均衡,对后端的 MySQL节点进行检测和负载均衡,大家可以用 LVS+Keepalived对 MySQL主从做负载均衡。 5. HAProxy 负载均衡策略非常多,HAProxy 的负载均衡算法现在具体有如下 8 种: ① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的; ② static-rr,表示根据权重,建议关注; ③ leastconn,表示最少连接者先处理,建议关注; ④ source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制类似,我们用其作为解 决 session 问题的一种方法,建议关注; ⑤ ri,表示根据请求的 URI; ⑥ rl_param,表示根据请求的 URl 参数’balance url_param’ requires an URL parameter name; ⑦ hdr(name),表示根据 HTTP 请求头来锁定每一次 HTTP 请求; ⑧ rdp-cookie(name),表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。 Nginx 和 LVS 对比的总结: 1. Nginx 工作在网络的 7 层,所以它可以针对 http 应用本身来做分流策略,比如针对 域名、目录结构等,相比之下 LVS 并不具备这样的功能,所以 Nginx 单凭这点可利用的 场合就远多于 LVS 了;但 Nginx 有用的这些功能使其可调整度要高于 LVS,所以经常要 去触碰触碰,触碰多了,人为出问题的几率也就会大。 2. Nginx 对网络稳定性的依赖较小,理论上只要 ping 得通,网页访问正常,Nginx 就 能连得通,这是 Nginx 的一大优势!Nginx 同时还能区分内外网,如果是同时拥有内外 网的节点,就相当于单机拥有了备份线路;LVS 就比较依赖于网络环境,目前来看服务 器在同一网段内并且 LVS 使用 direct 方式分流,效果较能得到保证。另外注意,LVS 需要向托管商至少申请多一个 ip 来做 Visual IP,貌似是不能用本身的 IP 来做 VIP 的。 要做好 LVS 管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个 HTTP 那么简单了。 3. Nginx 安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出 来。LVS 的安装和配置、测试就要花比较长的时间了;LVS 对网络依赖比较大,很多时 候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得 多。 4. Nginx 也同样能承受很高负载且稳定,但负载度和稳定度差 LVS 还有几个等级:Nginx 处理所有流量所以受限于机器 IO 和配置;本身的 bug 也还是难以避免的。 5. Nginx 可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时 等等,并且会把返回错误的请求重新提交到另一个节点。目前 LVS 中 ldirectd 也能支 持针对服务器内部的情况来监控,但 LVS 的原理使其不能重发请求。比如用户正在上传 一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx 会把上传切到另一 台服务器重新处理,而 LVS 就直接断掉了,如果是上传一个很大的文件或者很重要的文 件的话,用户可能会因此而恼火。 6. Nginx 对请求的异步处理可以帮助节点服务器减轻负载,假如使用 apache 直接对外 服务,那么出现很多的窄带链接时 apache 服务器将会占用大 量内存而不能释放,使用 多一个 Nginx 做 apache 代理的话,这些窄带链接会被 Nginx 挡住,apache 上就不会堆 积过多的请求,这样就减少了相当多的资源占用。这点使用 squid 也有相同的作用,即 使 squid 本身配置为不缓存,对 apache 还是有很大帮助的。 7. Nginx 能支持 http、https 和 email(email 的功能比较少用),LVS 所支持的应用 在这点上会比 Nginx 更多。在使用上,一般最前端所采取的策略应是 LVS,也就是 DNS 的指向应为 LVS 均衡器,LVS 的优点令它非常适合做这个任务。重要的 ip 地址,最好交 由 LVS 托管,比如数据库的 ip、webservice 服务器的 ip 等等,这些 ip 地址随着时间 推移,使用面会越来越大,如果更换 ip 则故障会接踵而至。所以将这些重要 ip 交给 LVS 托管是最为稳妥的,这样做的唯一缺点是需要的 VIP 数量会比较多。Nginx 可作为 LVS 节点机器使用,一是可以利用 Nginx 的功能,二是可以利用 Nginx 的性能。当然这一层 面也可以直接使用 squid,squid 的功能方面就比 Nginx 弱不少了,性能上也有所逊色 于 Nginx。Nginx 也可作为中层代理使用,这一层面 Nginx 基本上无对手,唯一可以撼 动 Nginx 的就只有 lighttpd 了,不过 lighttpd 目前还没有能做到 Nginx 完全的功能, 配置也不那么清晰易读。另外,中层代理的 IP 也是重要的,所以中层代理也拥有一个 VIP 和 LVS 是最完美的方案了。具体的应用还得具体分析,如果是比较小的网站(日 PV 小于 1000 万),用 Nginx 就完全可以了,如果机器也不少,可以用 DNS 轮询,LVS 所耗 费的机器还是比较多的;大型网站或者重要的服务,机器不发愁的时候,要多多考虑利 用 LVS。 数据库优化

猜你喜欢

转载自www.cnblogs.com/cjymuyang/p/9468802.html