如果一台服务器的能力不足以处理所有请求,并且软件厂商没有提供负载均衡怎么办? 有很多选择,从购买负载均衡器到限制请求数量。 哪一种正确,必须根据实际情况,结合现有条件来确定。 在本文中,我们将告诉您如果您的预算有限并且您有免费服务器,您可以做什么。
作为需要减轻其中一台服务器负载的系统,我们选择了InfoWatch的DLP(信息泄露防护系统)。 该实施的一个特点是将平衡器功能放置在其中一台“战斗”服务器上。
我们遇到的问题之一是无法使用源 NAT (SNAT)。 为什么需要这样做以及问题是如何解决的,我们将进一步描述。
所以,最初现有系统的逻辑图是这样的:
来自用户计算机的 ICAP 流量、SMTP 和事件均在 Traffic Monitor (TM) 服务器上进行处理。 同时,数据库服务器处理完TM上的事件后的负载可以轻松应对,但TM本身的负载却很重。 从设备监视器 (DM) 服务器上消息队列的出现以及 TM 上的 CPU 和内存负载可以明显看出这一点。
乍一看,如果我们在这个方案中添加另一个TM服务器,那么ICAP或DM都可以切换到它,但我们决定不使用这种方法,因为容错能力降低了。
解决方案描述
在寻找合适的解决方案的过程中,我们选择了免费软件
我们想要实现的目标(减少 TM 的负载并保持当前的容错水平)应该按照以下方案进行:
检查功能时发现,服务器上安装的自定义 RedHat 程序集不支持 SNAT。 在我们的例子中,我们计划使用 SNAT 来确保传入数据包和对它们的响应是从同一 IP 地址发送的,否则我们将得到以下图片:
这是无法接受的。 例如,已将数据包发送到虚拟 IP (VIP) 地址的代理服务器将期望来自 VIP 的响应,但在这种情况下,对于发送到备份的会话,它将来自 IP2。 找到了解决办法:需要在备份上再创建一个路由表,并用单独的网络连接两台TM服务器,如下图:
设置
我们将实施一个方案,其中两台服务器具有 ICAP、SMTP、TCP 9100 服务,并在其中一台上安装负载均衡器。
我们有两台 RHEL6 服务器,其中标准存储库和一些软件包已被删除。
我们需要平衡的服务:
• ICAP – TCP 1344;
• SMTP – TCP 25。
来自 DM 的流量传输服务 – TCP 9100。
首先,我们需要规划网络。
虚拟IP地址(VIP):
• IP:10.20.20.105。
服务器TM6_1:
• 外部IP:10.20.20.101;
• 内部IP:192.168.1.101。
服务器TM6_2:
• 外部IP:10.20.20.102;
• 内部IP:192.168.1.102。
然后我们在两台TM服务器上启用IP转发。 RedHat 上描述了如何执行此操作
我们决定哪一台服务器是主服务器,哪一台服务器是备份服务器。 设主控为TM6_1,备份为TM6_2。
在备份时,我们创建一个新的平衡器路由表和路由规则:
[root@tm6_2 ~]echo 101 balancer >> /etc/iproute2/rt_tables
[root@tm6_2 ~]ip rule add from 192.168.1.102 table balancer
[root@tm6_2 ~]ip route add default via 192.168.1.101 table balancer
上述命令一直有效,直到系统重新启动。 为了确保重启后保留路由,您可以将它们输入 /etc/rc.d/rc.local,但更好通过设置文件 /etc/sysconfig/network-scripts/route-eth1 (注意:这里使用不同的语法)。
在两台 TM 服务器上安装 keepalived。 我们使用 rpmfind.net 作为分发源:
[root@tm6_1 ~]#yum install https://rpmfind.net/linux/centos/6.10/os/x86_64/Packages/keepalived-1.2.13-5.el6_6.x86_64.rpm
在 keepalived 设置中,我们将其中一台服务器指定为主服务器,另一台服务器指定为备份服务器。 然后我们设置VIP和服务进行负载均衡。 设置文件通常位于此处: /etc/keepalived/keepalived.conf.
TM1 服务器的设置
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 151
advert_int 1
authentication {
auth_type PASS
auth_pass example
}
virtual_ipaddress {
10.20.20.105
}
}
virtual_server 10.20.20.105 1344 {
delay_loop 6
lb_algo wrr
lb_kind NAT
protocol TCP
real_server 192.168.1.101 1344 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 1344
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.102 1344 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 1344
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.20.20.105 25 {
delay_loop 6
lb_algo wrr
lb_kind NAT
protocol TCP
real_server 192.168.1.101 25 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 25
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.102 25 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 25
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.20.20.105 9100 {
delay_loop 6
lb_algo wrr
lb_kind NAT
protocol TCP
real_server 192.168.1.101 9100 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 9100
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.102 9100 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 9100
nb_get_retry 3
delay_before_retry 3
}
}
}
TM2 服务器的设置
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass example
}
virtual_ipaddress {
10.20.20.105
}
}
我们在master上安装LVS,这样可以均衡流量。 为第二台服务器安装平衡器是没有意义的,因为我们的配置中只有两台服务器。
[root@tm6_1 ~]##yum install https://rpmfind.net/linux/centos/6.10/os/x86_64/Packages/ipvsadm-1.26-4.el6.x86_64.rpm
平衡器将由我们已经配置的 keepalived 管理。
为了完成这个图,让我们将 keepalived 添加到两台服务器上的自动启动:
[root@tm6_1 ~]#chkconfig keepalived on
结论
检查结果
让我们在两台服务器上运行 keepalived:
service keepalived start
检查VRRP虚拟地址的可用性
让我们确保 VIP 位于 master 上:
并且备份中没有 VIP:
使用 ping 命令,我们将检查 VIP 的可用性:
现在您可以关闭 master 并再次运行命令 ping
.
结果应该保持不变,并且在备份时我们将看到 VIP:
检查服务平衡
我们以 SMTP 为例。 让我们同时启动两个到 10.20.20.105 的连接:
telnet 10.20.20.105 25
在 master 上我们应该看到两个连接都处于活动状态并且连接到不同的服务器:
[root@tm6_1 ~]#watch ipvsadm –Ln
因此,我们通过在其中一台 TM 服务器上安装平衡器来实现 TM 服务的容错配置。 对于我们的系统来说,这将TM的负载减少了一半,从而可以解决系统缺乏水平扩展的问题。
在大多数情况下,该解决方案可以快速实施且无需额外成本,但有时在配置方面存在许多限制和困难,例如在平衡 UDP 流量时。
来源: habr.com