简介
在本实验中,你将使用 HAProxy 学习 负载均衡 的基础知识。
想象一家只有一个柜台的银行。排队的人越来越多,顾客开始不满。为了解决这个问题,银行增设了多个柜台。不过现在,门口还需要一名经理,把每位顾客引导到下一个可用的柜台。
在这个场景中:
- 银行经理就是负载均衡器(HAProxy)。
- 柜员就是后端服务器(模拟的 Web 服务器)。
- 顾客就是Web 流量。
你将在 Linux 上搭建这个环境。首先创建两个模拟的 Web 服务器,然后配置 HAProxy,使用 轮询(round robin) 算法在它们之间分发流量。轮询是最简单的负载均衡算法之一。
轮询适合作为理解负载均衡的起点,因为它展示了负载均衡器的基本作用:将连续到来的请求分发给多个健康的后端,而不是把所有请求都发送到同一台机器。
完成本实验后,你将能够:
- 运行简单的 Python Web 服务器。
- 配置 HAProxy 接收流量(前端)并将流量发送到服务器(后端)。
- 观察负载均衡实际生效。
准备终端
要测试负载均衡器,首先需要准备可供分发的流量!我们需要同时运行两个独立的 Web 服务器。由于服务器运行时会占用当前终端,并且会一直运行到你停止它,因此不能在同一个窗口中继续输入其他命令。
所以,我们需要打开额外的终端标签页。你可以把它理解为在 Web 浏览器中打开多个标签页,这样就能同时查看不同的网站。
从操作上看,这一步用于分离系统中的不同角色。Python 服务器模拟应用层,而主终端继续作为配置负载均衡器的控制平面。
当前已经打开一个终端(Terminal)。请再打开两个终端:
- 在终端界面中找到 **+**(加号)图标。
- 单击两次,打开 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 集群!
你完成了以下任务:
- 模拟后端:使用 Python 在不同端口(8001、8002)上创建了两个正常运行的 Web 服务器。
- 配置前端:让 HAProxy 监听标准 Web 端口(80)。
- 配置后端:将两个服务器注册为工作服务器。
- 轮询:设置公平的「轮流处理」策略来分发流量。
这与大型网站用于处理数百万用户的架构完全相同,只是规模更小。



