HTTP 负载均衡

LinuxBeginner
立即练习

简介

在本实验中,你将使用 HAProxy 学习 负载均衡 的基础知识。

想象一家只有一个柜台的银行。排队的人越来越多,顾客开始不满。为了解决这个问题,银行增设了多个柜台。不过现在,门口还需要一名经理,把每位顾客引导到下一个可用的柜台。

在这个场景中:

  • 银行经理就是负载均衡器(HAProxy)。
  • 柜员就是后端服务器(模拟的 Web 服务器)。
  • 顾客就是Web 流量。

你将在 Linux 上搭建这个环境。首先创建两个模拟的 Web 服务器,然后配置 HAProxy,使用 轮询(round robin) 算法在它们之间分发流量。轮询是最简单的负载均衡算法之一。

轮询适合作为理解负载均衡的起点,因为它展示了负载均衡器的基本作用:将连续到来的请求分发给多个健康的后端,而不是把所有请求都发送到同一台机器。

完成本实验后,你将能够:

  1. 运行简单的 Python Web 服务器。
  2. 配置 HAProxy 接收流量(前端)并将流量发送到服务器(后端)。
  3. 观察负载均衡实际生效。

准备终端

要测试负载均衡器,首先需要准备可供分发的流量!我们需要同时运行两个独立的 Web 服务器。由于服务器运行时会占用当前终端,并且会一直运行到你停止它,因此不能在同一个窗口中继续输入其他命令。

所以,我们需要打开额外的终端标签页。你可以把它理解为在 Web 浏览器中打开多个标签页,这样就能同时查看不同的网站。

从操作上看,这一步用于分离系统中的不同角色。Python 服务器模拟应用层,而主终端继续作为配置负载均衡器的控制平面。

当前已经打开一个终端(Terminal)。请再打开两个终端:

  1. 在终端界面中找到 **+**(加号)图标。
  2. 单击两次,打开 Terminal 1 和 Terminal 2。

后续按以下方式使用它们:

  • Terminal:控制中心(用于配置 HAProxy)。
  • Terminal 1:运行 Server 1。
  • Terminal 2:运行 Server 2。

启动 Server 1

现在启动第一个「柜员」(Server 1)。我们不安装复杂的 Web 服务器软件,而是使用 Python 内置的便捷工具,把任意目录变成一个网站。

请切换到 Terminal 1。

首先,进入为 Server 1 准备的目录。

cd ~/project/server1

现在启动服务器,并让它监听 端口 8001。你可以把端口理解为公寓房间号:计算机是一栋大楼,而端口 8001 就是 Server 1 所在的具体房门。

python3 -m http.server 8001

你将看到类似 Serving HTTP on 0.0.0.0 port 8001 的消息。这表示服务器已经运行,并正在等待访问请求。此终端现在处于「忙碌」状态,因此不要在这里输入其他内容。

启动 Server 2

接下来启动第二个「柜员」(Server 2),这样就有多个服务器可以共同处理工作。

请切换到 Terminal 2。

进入 Server 2 所在的目录。

cd ~/project/server2

在另一个端口 8002 上启动该服务器。不能继续使用 8001,因为 Server 1 已经占用了这个端口(两户人家不能住在同一个 8001 号公寓中)。

python3 -m http.server 8002

现在,两个独立的 Web 服务器都在运行。其中一个返回「Response from Server 1」(端口 8001),另一个返回「Response from Server 2」(端口 8002)。

配置前端

服务器准备就绪后,现在配置「银行经理」(HAProxy),让它把流量转发给这两个服务器。

从这里开始,我们将前端和后端分开配置。前端描述客户端如何连接到 HAProxy,后端描述实际处理请求的服务器池。

切换回 Terminal。

先备份旧配置,然后创建新的配置文件。

sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
sudo nano /etc/haproxy/haproxy.cfg

将以下内容复制并粘贴到编辑器中。这段配置定义了 Frontend。Frontend 是负载均衡器面向外部的一面,也就是顾客(用户)进入的位置。

global
    log /dev/log    local0
    log /dev/log    local1 notice
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend http_front
    bind *:80
    default_backend http_back

需要理解的关键部分:

  • bind *:80:告诉 HAProxy 监听 端口 80。端口 80 是 Web 流量(HTTP)的标准端口。当你输入不带端口号的网站地址时,浏览器会访问端口 80。
  • default_backend http_back:告诉 HAProxy:「用户连接到这里后,将请求发送到名为 http_back 的服务器组。」

名称很重要,因为 HAProxy 配置本质上是一张流量映射表。前端接收连接,后端表示这些连接可能被发送到的目标。

保存文件(Ctrl+O,然后按 Enter)。你可以继续打开文件,也可以保存后退出(Ctrl+X),以便逐步验证操作结果。

配置后端

现在定义这组工作服务器,也就是 Backend。

如果你已经关闭了配置文件,请重新打开:

sudo nano /etc/haproxy/haproxy.cfg

将以下内容追加到文件末尾:

backend http_back
    server server1 127.0.0.1:8001 check
    server server2 127.0.0.1:8002 check

刚才完成了什么?

  • backend http_back:创建名为 http_back 的服务器组。
  • server server1 ...:将第一个工作服务器(Server 1)注册到地址 127.0.0.1:8001,也就是本地主机的 8001 端口。
  • server server2 ...:将第二个工作服务器(Server 2)注册到 127.0.0.1:8002。
  • check:这一项非常重要。它告诉 HAProxy 定期检查服务器是否实际可用(健康)。如果某个服务器崩溃,HAProxy 就会停止向它发送请求。

保存文件(Ctrl+O,然后按 Enter),再退出(Ctrl+X)。

验证负载均衡

经理应该如何决定下一位顾客由谁接待?最常见的方法是 Round Robin,也就是简单地「轮流处理」。

  • 顾客 1 -> Server 1
  • 顾客 2 -> Server 2
  • 顾客 3 -> Server 1
  • ……依此类推。

现在在配置中明确指定这一点。最后一次打开配置文件:

sudo nano /etc/haproxy/haproxy.cfg

找到刚才添加的 backend http_back 部分,并插入 balance 指令,使其内容如下:

backend http_back
    balance roundrobin
    server server1 127.0.0.1:8001 check
    server server2 127.0.0.1:8002 check

注意:为了便于阅读,行首的缩进空格很重要,尽管 HAProxy 对缩进要求并不严格。请尽量保持格式整齐。

保存文件(Ctrl+O,然后按 Enter),再退出(Ctrl+X)。

重启 HAProxy 并测试

配置已经准备好,但 HAProxy 还不知道这些更改。现在重启服务,使配置生效。

sudo service haproxy restart

接下来验证实际效果。我们将使用名为 curl 的命令。你可以把 curl 理解为没有图形界面的 Web 浏览器:它会获取网页,并将文本内容显示在屏幕上。

我们将连接到 localhost(本机)的默认端口 80,也就是 HAProxy 正在监听的端口。

多次运行以下命令:

curl localhost

你应该会看到 Response from Server 1。再次运行该命令:

curl localhost

这次应该会看到 Response from Server 2。

如果想快速观察这个过程,可以运行下面的循环命令,让它连续访问服务器 4 次:

for i in {1..4}; do
  curl localhost
  echo
done

你应该会看到输出严格交替显示:1、2、1、2。

这证明负载均衡器已经正常工作!它在端口 80 上接收请求,并在端口 8001 和端口 8002 之间公平地分配工作。

总结

在本实验中,你成功搭建了一个负载均衡 Web 集群!

你完成了以下任务:

  1. 模拟后端:使用 Python 在不同端口(8001、8002)上创建了两个正常运行的 Web 服务器。
  2. 配置前端:让 HAProxy 监听标准 Web 端口(80)。
  3. 配置后端:将两个服务器注册为工作服务器。
  4. 轮询:设置公平的「轮流处理」策略来分发流量。

这与大型网站用于处理数百万用户的架构完全相同,只是规模更小。