NGINX、HAProxy和Traefik负载均衡能力对比

2020-05-25 00:00:00 请求 测试 服务 能力 负载均衡

网上有很多讨论Nginx和HAProxy的文章,很多文章基本都是说这样子的内容:

一、Nginx优点:
1、工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行。
2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能进……

二、HAProxy优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段)
2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测……

详细我就不全部贴了,大家也可以自己在google出来,很多一边倒都说HAProxy的负载均衡能力比Nginx的要强,但是这些文章,很大一部分没有一个真实的数据反映出HAProxy和Nginx哪一个能力更强,而且就算有,都是基于比较旧的版本去测试了。

这次我就亲自测试Nginx和HAProxy的负载均衡能力上的区别,等着,标题不是还有一个Traefik吗?嗯,在我搜索过程,我发现有外国的小伙也在讨论Traefik,Traefik是一个反向代理器,是一个比较年轻的项目,对容器支持十分友好,早就2017年,我就在项目使用过,不过仅是在反向代理这一块,在负载均衡上面没有太多深入研究,中文社区中,对他的测评并不多,但很多说法都是说这货的能力比较弱,事实真的如此吗?

故事背景

公司在一个项目上需要用到负载均衡,但在我工作这么多年上,我仅在测试环境上自己部署过Nginx的负载均衡,在生产环境上面,一直都是用云平台提供的负载均衡服务,所以目前为止,对负载均衡的能力掌握比较小,所以我透过这次的测试来了解目前市面常用的负载均衡器的对比。

测试要求

  1. 负载均衡使用的是7层模型(所以这里没有提到LVS的原因)
  2. 需要解析HTTPS,在负载均衡直接解析HTTPS,到达后面服务后直接用HTTP,避免后续服务重新解析,消耗性能

前期准备

本次用到服务器5台,配置均为4 CPUs,8G内存,40G存储空间,centOS 7.4 系统。

服务器1 IP:172.18.128.254

服务器2 IP:172.18.128.255

服务器3 IP:172.18.129.0

服务器4 IP:172.18.129.1

服务器5 IP:172.18.129.2

服务器1、2、3用作部署Web服务,服务器4用作部署负载均衡服务,服务器5用作Web客户端。

开始部署

首先部署服务器1、2、3的Web服务,Web服务是一个由go编写的服务,代码如下:

package main

import (
    "log"
    "fmt"
    "net/http"
    "runtime"
    "io/ioutil"
)

//Define the port used for this web application
var SERVER_PORT = ":8000"

//Read the content of a file
func serveContent(file string) string {
    b, err := ioutil.ReadFile(file)
    if err != nil {
        log.Print(err)
        return "{error:\"Resource not found\"}"
    }
    str := string(b)
    return str
}

//REST handler
func handler(w http.ResponseWriter, r *http.Request) {
    log.Print("Processing request: ", r.URL.Path[1:])
    str := serveContent(r.URL.Path[1:])
    fmt.Fprintf(w, str)
}

//Main program
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    log.Print("Starting webserver on Port", SERVER_PORT)
    http.HandleFunc("/", handler)
    http.ListenAndServe(SERVER_PORT, nil)
}

相关文章