如何在 Ubuntu 14.04 上使用 Keepalived 和保留 IP 设置高可用 HAProxy 服务器

介绍

高可用性是系统设计的一个功能,允许应用程序在失败的情况下自动重新启动或重定向工作到另一个可行的系统。在服务器方面,需要几个不同的技术来设置一个高度可用的系统。

在本指南中,我们将展示如何使用keepalived来为您的负载平衡器设置高可用性。我们将配置一个 保留IP地址,可以在两个可行的负载平衡器之间移动。这两个负载平衡器将被配置为在两个后端 Web 服务器之间分割流量。如果主要负载平衡器下降,保留IP将自动移动到第二个负载平衡器,允许服务恢复。

High Availability diagram

<$>[注] 注: DigitalOcean Load Balancers是一个完全管理的,高度可用的负载平衡服务。

前提条件

要完成本指南,您需要在您的DigitalOcean帐户中创建四台Ubuntu 14.04服务器,所有服务器必须位于同一个数据中心内,并应启用私人网络。

在每个服务器上,您需要一个非根用户配置sudo访问,您可以遵循我们的 Ubuntu 14.04初始服务器设置指南来学习如何设置这些用户。

查找服务器网络信息

在我们开始实际配置基础设施组件之前,最好收集有关您的每个服务器的一些信息。

要完成本指南,您需要有以下有关您的服务器的信息:

  • Web服务器:私人IP地址 负载平衡器私人和 IP地址

寻找私人IP地址

查找您的Droplet的私人IP地址的最简单方法是使用curl来从DigitalOcean元数据服务中获取私人IP地址。

1curl 169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo

正确的 IP 地址应在终端窗口中打印:

1[secondary_label Output]
210.132.20.236

查找Anchor IP地址

Anchor IP是本地私有 IP 地址,保留 IP 将连接到连接到 DigitalOcean 服务器时。

获取此值的最简单、最不容易的方法是直接从DigitalOcean元数据服务中获取。

1curl 169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address && echo

IP 将打印在自己的线上:

1[secondary_label Output]
210.17.1.18

安装和配置 Web 服务器

在收集上述数据后,我们可以继续配置我们的服务。

<$>[注] [标签注] 在此设置中,为 Web 服务器层选择的软件是相当可互换的。本指南将使用 Nginx,因为它是通用的,并且很容易配置。如果您更舒适地使用 Apache 或 (生产能力) 语言特定的 Web 服务器,请自由使用它。HAProxy 将简单地将客户端请求传递给后端 Web 服务器,可以像处理直接客户端连接一样处理请求。

我们将通过设置我们的后端 Web 服务器开始。这两个服务器将提供完全相同的内容。它们只会通过他们的私人 IP 地址接受 Web 连接。

设置负载平衡器背后的网页服务器使我们能够将请求负载分配到一些相同的网页服务器之间,随着流量需求的变化,我们可以通过添加或删除网页服务器来轻松扩展以满足新需求。

安装 Nginx

我们将在我们的 Web 服务器上安装 Nginx,以提供此功能。

首先,与您的sudo用户登录到您希望作为 Web 服务器使用的两台机器,在每个 Web 服务器上更新本地包索引并通过键入安装 Nginx:

1sudo apt-get update
2sudo apt-get install nginx

配置 Nginx 只允许从负载平衡器的请求

接下来,我们将配置我们的 Nginx 实例,我们希望告诉 Nginx 只听取服务器的私有 IP 地址的请求,此外,我们只会服务来自我们两个负载平衡器的私有 IP 地址的请求。

要进行这些更改,请在您的每个 Web 服务器上打开默认的 Nginx 服务器封锁文件:

1sudo nano /etc/nginx/sites-available/default

首先,我们将修改倾听指令. 更改倾听指令,以便在端口 80 上倾听当前网络服务器的私人 IP 地址**。

1[label /etc/nginx/sites-available/default]
2server {
3    listen web_server_private_IP:80;
4
5    . . .

之后,我们将设置两个允许指令,允许来自我们两个负载平衡器的私人IP地址的流量。

1[label /etc/nginx/sites-available/default]
2server {
3    listen web_server_private_IP:80;
4
5    allow load_balancer_1_private_IP;
6    allow load_balancer_2_private_IP;
7    deny all;
8
9    . . .

保存并关闭文件,当你完成。

通过键入测试您所做的更改是否代表有效的 Nginx 语法:

1sudo nginx -t

如果没有报告任何问题,请通过键入以下方式重新启动 Nginx 示例:

1sudo service nginx restart

测试变化

要测试您的 Web 服务器是否受到正确的限制,您可以使用从不同位置的弯曲来提出请求。

在您的Web服务器上,您可以通过键入简单的本地内容请求:

1curl 127.0.0.1

由于我们在我们的 Nginx 服务器封锁文件中设置了限制,此请求实际上将被拒绝:

1[secondary_label Output]
2curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

这是预期的,反映了我们试图实施的行为。

现在,从任何一个负载平衡器中,我们可以对我们的 Web 服务器的任何一个公共 IP 地址提出请求:

1curl web_server_public_IP

网页服务器在公共界面上不听,而且,当使用公共IP地址时,我们的网页服务器在我们的负载平衡器的请求中不会看到允许的私人IP地址:

1[secondary_label Output]
2curl: (7) Failed to connect to web_server_public_IP port 80: Connection refused

但是,如果我们修改呼叫以使用 Web 服务器的 private IP 地址 进行请求,它应该正常工作:

1curl web_server_private_IP

默认的 Nginx index.html 页面应该返回:

1[secondary_label Output]
2<!DOCTYPE html>
3<html>
4<head>
5<title>Welcome to nginx!</title>
6
7. . .

测试这两个负载平衡器到两个Web服务器的每个请求私有IP地址应该成功,而每一个向公共地址的请求应该失败。

一旦上面的行为被证明,我们可以继续前进. 我们的后端 Web 服务器配置现在已经完成。

安装和配置 HAProxy

接下来,我们将设置HAProxy负载平衡器,这些均会坐在我们的Web服务器前面,并在两个后端服务器之间分开请求。

HAProxy 配置会将请求传递给两个 Web 服务器。负载平衡器会听取其锁 IP 地址的请求。如前所述,这是保留 IP 地址在附加到 Droplet 时将绑定的 IP 地址。

安装 HAProxy

我们需要在负载平衡器上采取的第一个步骤将是安装haproxy包。我们可以在默认的Ubuntu存储库中找到这个。更新负载平衡器上的本地包索引并通过键入安装HAProxy:

1sudo apt-get update
2sudo apt-get install haproxy

配置 HAProxy

我们在处理 HAProxy 时需要修改的第一个项目是 /etc/default/haproxy 文件。

1sudo nano /etc/default/haproxy

由于我们希望服务在服务器启动时自动启动,我们需要将ENABLED的值更改为1:

1[label /etc/default/haproxy]
2# Set ENABLED to 1 if you want the init script to start haproxy.
3ENABLED=1
4# Add extra flags here.
5#EXTRAOPTS="-de -m 16"

保存并关闭文件,完成上面的编辑。

接下来,我们可以打开主HAProxy配置文件:

1sudo nano /etc/haproxy/haproxy.cfg

我们需要调整的第一个项目是HAProxy将运行的模式,我们想要配置TCP或4层的负载平衡。为了做到这一点,我们需要在默认部分中更改模式行。

1[label /etc/haproxy/haproxy.cfg]
2. . .
3
4defaults
5    log global
6    mode tcp
7    option tcplog
8
9. . .

在文件的末尾,我们需要定义我们的前端配置。这将决定HAProxy如何倾听接入连接。我们将HAProxy绑定到负载平衡器的锁IP地址。这将使它能够倾听来自保留IP地址的流量。我们将呼叫我们的前端www以便简化。我们还将指定默认的后端来传输流量(我们将在一瞬间配置):

 1[label /etc/haproxy/haproxy.cfg]
 2. . .
 3
 4defaults
 5    log global
 6    mode tcp
 7    option tcplog
 8
 9. . .
10
11frontend www
12    bind load_balancer_anchor_IP:80
13    default_backend nginx_pool

接下来,我们可以配置我们的后端部分,这将指定下游位置,HAProxy将通过它接收的流量。在我们的情况下,这将是我们配置的两种 Nginx Web 服务器的私人 IP 地址。

 1[label /etc/haproxy/haproxy.cfg]
 2. . .
 3
 4defaults
 5    log global
 6    mode tcp
 7    option tcplog
 8
 9. . .
10
11frontend www
12    bind load_balancer_anchor_IP:80
13    default_backend nginx_pool
14
15backend nginx_pool
16    balance roundrobin
17    mode tcp
18    server web1 web_server_1_private_IP:80 check
19    server web2 web_server_2_private_IP:80 check

完成上述更改后,保存并关闭文件。

检查我们所做的配置更改是否代表有效的 HAProxy 语法,键入:

1sudo haproxy -f /etc/haproxy/haproxy.cfg -c

如果没有报告错误,请通过键入以下方式重新启动您的服务:

1sudo service haproxy restart

测试变化

我们可以通过再次测试弯曲来确保我们的配置有效。

从负载平衡器服务器中,尝试请求本地主机、负载平衡器自己的公共 IP 地址或服务器自己的私人 IP 地址:

1curl 127.0.0.1
2curl load_balancer_public_IP
3curl load_balancer_private_IP

这些都应该与看起来类似于此的消息失败:

1[secondary_label Output]
2curl: (7) Failed to connect to address port 80: Connection refused

但是,如果您向负载平衡器的 _anchor IP 地址提出请求,则应成功完成:

1curl load_balancer_anchor_IP

您应该看到默认的 Nginx index.html 页面,从两个后端 Web 服务器中的一个路由:

1[secondary_label Output]
2<!DOCTYPE html>
3<html>
4<head>
5<title>Welcome to nginx!</title>
6
7. . .

如果这种行为与您的系统相匹配,那么您的负载平衡器配置正确。

构建和安装 Keepalived

我们的实际服务现在正在运行,但是,我们的基础设施尚未高度可用,因为如果我们的活性负载平衡器遇到问题,我们没有办法重定向流量。 为了纠正这一问题,我们将在我们的负载平衡器服务器上安装keepalved DAEMON。 这是如果我们的活性负载平衡器变得不可用,它将提供逆转功能的组件。

在Ubuntu的默认存储库中有keepalived的版本,但它已经过时,并患有几种错误,这将阻止我们的配置工作。

在我们开始之前,我们应该抓住我们需要构建软件的依赖性。构建必需的元包将提供我们所需要的编译工具,而libssl-dev包包含keepalived需要构建的SSL开发库:

1sudo apt-get install build-essential libssl-dev

一旦依赖性已经存在,我们可以下载keepalived的 tarball。 访问 此页面以查找软件的最新版本。 右键单击最新版本并复制链接地址。 回到您的服务器上,移动到您的主目录并使用wget捕捉您复制的链接:

1cd ~
2wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

使用tar命令来扩展档案. 移动到结果的目录:

1tar xzvf keepalived*
2cd keepalived*

通过键入构建和安装 DAEMON:

1./configure
2make
3sudo make install

现在,戴蒙应该安装在负载平衡器系统中的两种系统上。

创建一个 Keepalived Upstart 脚本

keepalived安装将所有二进制和支持文件放置在我们的系统上,但是,一个未包含的部分是我们Ubuntu 14.04系统的Upstart脚本。

我们可以创建一个非常简单的Upstart脚本,可以处理我们的keepalived服务. 在/etc/init目录中打开名为keepalived.conf的文件来开始:

1sudo nano /etc/init/keepalived.conf

内部,我们可以从一个简单的描述keepalived提供的功能开始。我们将使用包含的页面的描述。接下来,我们将指定该服务应该启动和停止的运行级别。

1[label /etc/init/keepalived.conf]
2description "load-balancing and high-availability service"
3
4start on runlevel [2345]
5stop on runlevel [!2345]

由于这项服务是确保我们的网站服务仍然可用的一部分,我们希望在出现故障时重新启动此服务,然后我们可以指定实际的exec行,该行将启动该服务,我们需要添加--dont-fork选项,以便Upstart能够正确跟踪pid:

1[label /etc/init/keepalived.conf]
2description "load-balancing and high-availability service"
3
4start on runlevel [2345]
5stop on runlevel [!2345]
6
7respawn
8
9exec /usr/local/sbin/keepalived --dont-fork

保存并关闭文件,当你完成。

创建 Keepalived 配置文件

有了我们的Upstart文件,我们现在可以继续配置keepalived

该服务在/etc/keepalived目录中搜索其配置文件,现在在您的负载平衡器上创建该目录:

1sudo mkdir -p /etc/keepalived

创建主负载平衡器的配置

接下来,在您希望作为 ** 主要** 服务器使用的负载平衡器服务器上,创建主keepalived配置文件. 戴蒙在/etc/keepalived目录中寻找名为keepalived.conf的文件:

1sudo nano /etc/keepalived/keepalived.conf

内部,我们将通过打开一个vrrp_script块来为我们的HAProxy服务定义健康检查,这将允许keepalived监控我们的负载平衡器的故障,以便它可以信号表明过程正在停止并开始恢复措施。

每两秒钟,我们会检查一个叫做haproxy的过程是否仍然声称pid:

1[label Primary server's /etc/keepalived/keepalived.conf]
2vrrp_script chk_haproxy {
3    script "pidof haproxy"
4    interval 2
5}

接下来,我们将打开一个名为vrrp_instance的块,这是定义keepalived将实现高可用性的方式的主要配置部分。

我们将开始说keepalived通过eth1我们的私人接口与同行进行通信,因为我们正在配置我们的主要服务器,我们将状态配置设置为MASTER

在选举中,使用优先级选项来决定哪个会员被选中。 该决定仅取决于哪个服务器为此设置拥有最高的数目。

 1[label Primary server's /etc/keepalived/keepalived.conf]
 2vrrp_script chk_nginx {
 3    script "pidof nginx"
 4    interval 2
 5}
 6
 7vrrp_instance VI_1 {
 8    interface eth1
 9    state MASTER
10    priority 200
11
12}

接下来,我们将为这个集群组分配一个ID,将由两个节点共享。我们将为此示例使用33。我们需要将unicast_src_ip设置为我们的 主要负荷平衡器的私人IP地址。

 1[label Primary server's /etc/keepalived/keepalived.conf]
 2vrrp_script chk_haproxy {
 3    script "pidof haproxy"
 4    interval 2
 5}
 6
 7vrrp_instance VI_1 {
 8    interface eth1
 9    state MASTER
10    priority 200
11
12    virtual_router_id 33
13    unicast_src_ip primary_private_IP
14    unicast_peer {
15        secondary_private_IP
16    }
17
18}

接下来,我们可以设置一些简单的身份验证,以便我们的keepalived魔鬼彼此交流。这只是一个基本的措施,以确保被联系的同行是合法的。 创建一个身份验证子块。 内部,通过设置auth_type来指定密码身份验证。 对于auth_pass参数,设置一个共享的秘密,将被两个节点使用。 不幸的是,只有前八个字符是重要的:

 1[label Primary server's /etc/keepalived/keepalived.conf]
 2vrrp_script chk_haproxy {
 3    script "pidof haproxy"
 4    interval 2
 5}
 6
 7vrrp_instance VI_1 {
 8    interface eth1
 9    state MASTER
10    priority 200
11
12    virtual_router_id 33
13    unicast_src_ip primary_private_IP
14    unicast_peer {
15        secondary_private_IP
16    }
17
18    authentication {
19        auth_type PASS
20        auth_pass password
21    }
22
23}

接下来,我们将告诉keepalived使用我们在文件顶部创建的检查,标记为chk_haproxy,以确定本地系统的健康状况。 最后,我们将设置一个notify_master脚本,每当这个节点成为对的时,就会执行。

 1[label Primary server's /etc/keepalived/keepalived.conf]
 2vrrp_script chk_haproxy {
 3    script "pidof haproxy"
 4    interval 2
 5}
 6
 7vrrp_instance VI_1 {
 8    interface eth1
 9    state MASTER
10    priority 200
11
12    virtual_router_id 33
13    unicast_src_ip primary_private_IP
14    unicast_peer {
15        secondary_private_IP
16    }
17
18    authentication {
19        auth_type PASS
20        auth_pass password
21    }
22
23    track_script {
24        chk_haproxy
25    }
26
27    notify_master /etc/keepalived/master.sh
28}

一旦设置了上述信息,保存并关闭文件。

创建二级负载平衡器的配置

接下来,我们将在我们的次级负载平衡器上创建伴侣脚本. 在您的次级服务器上打开一个文件在 `/etc/keepalived/keepalived.conf:

1sudo nano /etc/keepalived/keepalived.conf

内部,我们将使用的脚本将大致相当于主服务器的脚本。

  • state: 此应更改为BACKUP在二级服务器上,以便节点在选举发生前初始化为备份状态。
  • priority: 此应设置为低于主服务器的值. 我们将在本指南中使用值100
  • unicast_src_ip: 此应是二级服务器的私有IP地址。

当您更改这些值时,次要服务器的脚本应该是这样的:

 1[label Secondary server's /etc/keepalived/keepalived.conf]
 2vrrp_script chk_haproxy {
 3    script "pidof haproxy"
 4    interval 2
 5}
 6
 7vrrp_instance VI_1 {
 8    interface eth1
 9    state BACKUP
10    priority 100
11
12    virtual_router_id 33
13    unicast_src_ip secondary_private_IP
14    unicast_peer {
15        primary_private_IP
16    }
17
18    authentication {
19        auth_type PASS
20        auth_pass password
21    }
22
23    track_script {
24        chk_haproxy
25    }
26
27    notify_master /etc/keepalived/master.sh
28}

一旦你输入了脚本并更改了相应的值,保存并关闭文件。

创建保留的 IP 过渡脚本

接下来,我们需要创建一对脚本,我们可以用来重新分配保留IP地址到当前的Droplet,每次本地的keepalived实例成为主服务器。

下载保留IP分配脚本

首先,我们将下载一个通用 Python 脚本(由 DigitalOcean 社区管理员编写)可以用来将保留的 IP 地址重新分配给使用 DigitalOcean API 的 Droplet。

1cd /usr/local/bin
2sudo curl -LO http://do.co/assign-ip

此脚本允许您通过运行重新分配现有保留IP:

1python /usr/local/bin/assign-ip reserved_ip droplet_ID

只有在您为您的帐户设置一个名为DO_TOKEN的环境变量为有效的DigitalOcean API代币的情况下才会起作用。

创建一个 DigitalOcean API 代币

为了使用上述脚本,我们需要在我们的帐户中创建一个DigitalOcean API代币。

在控制面板中,点击顶部的API链接;在API页面右侧,点击生成新代币:

DigitalOcean generate API token

在下一页上,选择你的代币的名称,然后点击生成代币按钮:

DigitalOcean make new token

在API页面上,你的新代币将显示:

DigitalOcean token

复制代币 现在. 为了安全目的,没有办法再显示此代币以后. 如果您丢失此代币,您将不得不摧毁它并创建另一个。

配置您的基础设施的保留IP

接下来,我们将创建并分配一个保留的IP地址,用于我们的服务器。

在DigitalOcean控制面板中,点击网络选项卡,然后选择保留IP导航项目,从初始任务菜单中选择您的主要负载平衡器:

DigitalOcean add Reserved IP

在您的帐户中将创建一个新的保留IP地址,并分配给指定的 Droplet:

DigitalOcean Reserved IP assigned

如果您在 Web 浏览器中访问了保留的 IP,您应该看到来自后端 Web 服务器之一的默认 Nginx 页面:

DigitalOcean default index.html

将保留IP地址复制下来,您将在下面的脚本中需要此值。

创建 Wrapper 脚本

现在,我们有我们需要创建包装脚本的项目,这将叫我们的/usr/local/bin/assign-ip脚本与正确的凭证。

现在在您的负载平衡器中的 两个上创建该文件,键入:

1sudo nano /etc/keepalived/master.sh

在内部,开始分配并导出一个名为DO_TOKEN的变量,其中包含您刚刚创建的API代币。

1[label /etc/keepalived/master.sh]
2export DO_TOKEN='digitalocean_api_token'
3IP='reserved_ip_addr'

接下来,我们将使用curl来询问我们目前所处的服务器的Droplet ID的元数据服务,这将被分配给一个名为ID的变量,我们还会询问这个Droplet是否目前已分配到保留IP地址,我们将将该请求的结果存储在一个名为HAS_RESERVED_IP的变量中:

1[label /etc/keepalived/master.sh]
2export DO_TOKEN='digitalocean_api_token'
3IP='reserved_ip_addr'
4ID=$(curl -s http://169.254.169.254/metadata/v1/id)
5HAS_RESERVED_IP=$(curl -s http://169.254.169.254/metadata/v1/reserved_ip/ipv4/active)

现在,我们可以使用上述变量来调用assign-ip脚本. 我们只会调用脚本,如果保留的 IP 尚未与我们的 Droplet 相关联. 这将有助于最大限度地减少 API 调用,并有助于防止对 API 的冲突请求,在主状态在您的服务器之间快速切换的情况下。

为了处理已有预留IP事件的案例,我们将重试分配IP脚本几次。下文,我们将尝试运行脚本10次,每次调用间隔为3秒。

 1[label /etc/keepalived/master.sh]
 2export DO_TOKEN='digitalocean_api_token'
 3IP='reserved_ip_addr'
 4ID=$(curl -s http://169.254.169.254/metadata/v1/id)
 5HAS_RESERVED_IP=$(curl -s http://169.254.169.254/metadata/v1/reserved_ip/ipv4/active)
 6
 7if [ $HAS_RESERVED_IP = "false" ]; then
 8    n=0
 9    while [ $n -lt 10 ]
10    do
11        python /usr/local/bin/assign-ip $IP $ID && break
12        n=$((n+1))
13        sleep 3
14    done
15fi

保存并关闭文件,当你完成。

现在,我们只需要使脚本可执行,以便keepalived可以称之为:

1sudo chmod +x /etc/keepalived/master.sh

启动 Keepalived 服务和测试失败

现在,keepalived的戴蒙和所有伴侣脚本都应该完全配置,我们可以通过键入以下方式在我们的负载平衡器上启动服务:

1sudo start keepalived

该服务应该在每个服务器上启动,并与其同行联系,通过我们配置的共享秘密进行身份验证。

您的主要负载平衡器,应该有当前分配的保留IP地址,反过来会向每个后端 Nginx 服务器发送请求. 通常应用的一些简单的会话粘性,使得您通过 Web 浏览器发送请求时更有可能获得相同的后端。

我们可以通过简单地关闭我们的主要负载平衡器上的HAProxy来测试故障转移:

1sudo service haproxy stop

如果我们在浏览器中访问我们的保留IP地址,我们可能会暂时收到一个错误,表明该页面无法找到:

1http://reserved_IP_addr

DigitalOcean page not available

如果我们更新页面几次,在一瞬间,我们的默认 Nginx 页面将返回:

DigitalOcean default index.html

我们的HAProxy服务仍在我们的主要负载平衡器上,这表明我们的次要负载平衡器已经接管。使用keepalived,次要服务器能够确定服务中断发生了。

我们现在可以在主负荷平衡器上重新启动HAProxy:

1sudo service haproxy start

主负载平衡器将在一瞬间恢复保留IP地址的控制,尽管这对用户来说应该是相当透明的。

可视化过渡

为了更好地可视化负载平衡器之间的过渡,我们可以在过渡期间监控我们的一些服务器日志。

由于有关使用哪个代理服务器的信息不会返回客户端,所以查看日志的最佳地点是来自实际的后端 Web 服务器。

在 Web 服务器上存储日志

在我们的每个后端网页服务器上,我们可以尾巴/var/log/nginx/access.log的位置,这将显示每个向服务器提出的请求。

幸运的是,客户端地址是访问日志中的第一个字段,我们可以使用简单的 awk 命令提取值。

1sudo tail -f /var/log/nginx/access.log | awk '{print $1;}'

这些可能会显示大多数单一的地址:

 1[secondary_label Output]
 2. . .
 3
 4primary_lb_private_IP
 5primary_lb_private_IP
 6secondary_lb_private_IP
 7secondary_lb_private_IP
 8primary_lb_private_IP
 9primary_lb_private_IP
10primary_lb_private_IP
11primary_lb_private_IP

如果您引用您的服务器IP地址,您会注意到这些主要来自您的主要负载平衡器。 请注意,实际分布可能会因HAProxy实现的一些简单的会话粘性而有所不同。

保持尾巴命令在您的两个Web服务器上运行。

自动向保留IP的请求

现在,在您的本地计算机上,我们将每隔2秒就要求在保留IP地址的网页内容。这将使我们能够轻松地看到负载平衡器的变化发生。在您的本地终端中,输入以下内容(我们正在抛弃实际的响应,因为这应该是相同的,无论使用哪个负载平衡器):

1while true; do curl -s -o /dev/null reserved_IP; sleep 2; done

在您的 Web 服务器上,您应该开始看到新的请求进入. 与通过 Web 浏览器进行的请求不同,简单的弯曲请求不会显示相同的会话粘度. 您应该看到更均匀的请求分割到您的后端 Web 服务器。

在主负载平衡器上中断 HAProxy 服务

现在,我们可以再次关闭我们的主要负载平衡器上的HAProxy服务:

1sudo service haproxy stop

几秒钟后,在您的 Web 服务器上,您应该看到从主要负载平衡器的私有 IP 地址过渡到次要负载平衡器的私有 IP 地址的 IP 列表:

 1[secondary_label Output]
 2. . .
 3
 4primary_lb_private_IP
 5primary_lb_private_IP
 6primary_lb_private_IP
 7primary_lb_private_IP
 8primary_lb_private_IP
 9secondary_lb_private_IP
10secondary_lb_private_IP
11secondary_lb_private_IP
12secondary_lb_private_IP

所有新请求都来自您的二级负载平衡器。

现在,在您的主要负载平衡器上重新启动 HAProxy 实例:

1sudo service haproxy start

您将在几秒钟内看到客户端请求返回主负载平衡器的私有 IP 地址:

 1[secondary_label Output]
 2. . .
 3
 4primary_lb_private_IP
 5primary_lb_private_IP
 6primary_lb_private_IP
 7primary_lb_private_IP
 8primary_lb_private_IP
 9secondary_lb_private_IP
10secondary_lb_private_IP
11secondary_lb_private_IP
12secondary_lb_private_IP
13primary_lb_private_IP
14primary_lb_private_IP
15primary_lb_private_IP

主服务器恢复了保留IP地址的控制,并恢复了其作为基础设施的主要负载平衡器的功能。

配置 Nginx 来记录实际客户端 IP 地址

正如您所看到的, Nginx 访问日志显示,所有客户端请求都来自当前负载平衡器的私人 IP 地址,而不是最初提出请求的客户端(即您的本地机器)的实际 IP 地址。

在两个Web服务器上,在编辑器中打开nginx.conf文件:

1sudo nano /etc/nginx/nginx.conf

找到日志设置部分(在http块内),并添加以下行:

1[label add to /etc/nginx/nginx.conf]
2log_format haproxy_log 'ProxyIP: $remote_addr - ClientIP: $http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';

这指定了一个名为haproxy_log的新日志格式,该日志格式将$http_x_forwarded_for值添加到默认访问日志条目中,即原始请求的客户端的IP地址。

接下来,要使用这个新的日志格式,我们需要将一行添加到我们的默认服务器块。

在两个 Web 服务器上,打开默认服务器配置:

1sudo nano /etc/nginx/sites-available/default

服务器块内(右下方的倾听指令是一个好地方),添加下面的行:

1[label add to /etc/nginx/sites-available/default]
2        access_log /var/log/nginx/access.log haproxy_log;

这告诉 Nginx 使用我们上面创建的haproxy_log日志格式来编写其访问日志。

在两个 Web 服务器上,重新启动 Nginx 以执行这些更改:

1sudo service nginx restart

现在您的 Nginx 访问日志应该包含提出请求的客户端的实际 IP 地址。 通过对应用程序服务器的日志进行尾声检查,就像我们在上一节所做的。

1[secondary_label New Nginx access logs:]
2. . .
3ProxyIP: load_balancer_private_IP - ClientIP: local_machine_IP - - [05/Nov/2015:15:05:53 -0500] "GET / HTTP/1.1" 200 43 "-" "curl/7.43.0"
4. . .

如果你的日志看起来很好,你都设定了!

结论

在本指南中,我们通过建立一个高度可用、负荷均衡的基础设施的完整过程进行研究,这种配置很好,因为活跃的HAProxy服务器可以将负荷分配到后端的Web服务器池中。

保留IP和保持配置消除了负载平衡层的单个故障点,使您的服务即使在主负载平衡器完全失败时也能继续运作。

Published At
Categories with 技术
comments powered by Disqus