共计 7612 个字符,预计需要花费 20 分钟才能阅读完成。
导读 | LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。LVS 目前有三种 IP 负载均衡技术(VS/NAT、VS/TUN 和 VS/DR)、十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq),LVS 在 Unix-like 系统中是作为一个前端 (Director) 存在的,又称为调度器,它本身不提供任何的服务,只是将通过互联网进来的请求接受后再转发给后台运行的真正的服务器 (RealServer) 进行处理,然后响应给客户端。 |
LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
LVS 有两个重要的组件:一个是 IPVS,一个是 IPVSADM。ipvs 是 LVS 的核心组件,它本身只是一个框架,类似于 iptables,工作于内核空间中。ipvsadm 是用来定义 LVS 的转发规则的,工作于用户空间中。
称为网络地址转换,实现起来比较简单,所有的 RealServer 集群节点和前端调度器 Director 都要在同一个子网中,这种模型可以实现端口映射,RealServer 的操作系统可以是任意操作系统,前端的 Director 既要处理客户端发起的请求,又要处理后台 RealServer 的响应信息,将 RealServer 响应的信息再转发给客户端,前端 Director 很容易成为整个集群系统性能的瓶颈。通常情况下 RealServer 的 IP 地址 (以下简成 RIP) 为私有地址,便于 RealServer 集群节点之间进行通信通常情况下前端的 Director 有两个 IP 地址,一个为 VIP,是虚拟的 IP 地址,客户端向此 IP 地址发起请求。一个是 DIP,是真正的 Director 的 IP 地址,RIP 的网关要指向 Director 的 DIP。
DR:直接路由(direct routing)模式,此种模式通过 MAC 地址转发工作,所有的 RealServer 集群节点和前端调度器 Director 都要在同一个物理网络中,此种模式不支持端口映射,此种模式的性能要优于 LVS-NAT,RIP 可以使用公网的 IP,RIP 的网关不能指向 DIP。
优点:
相对 LVS/NAT 模式,DR 模式不需要把返回的数据通过负载均衡转发,想要他发挥优势,那么就要相应的数据包的数量和长度远远大于请求数据包,幸运的是,大部分 WEB 服务都具备这样的特点,响应和请求并不对称,因此常用的 WEB 服务,都可以使用这种模式。
这种方式,负载均衡器不再是系统的瓶颈。如果你的负载均衡器只拥有 100M 的全双工网卡和带宽的话,通过集群的横向扩展也可以让整个系统达到 1G 的流量。
来自 LVS 官方站点的测试结果也告诉我们,LVS-DR 可以容纳 100 台以上的实际应用服务器,对一般的服务而已,这样的表现足够了。
不足:
DR 模式下不能跨网段转发数据,如果必须要跨网段进行负载,那么就必须使用 LVS/TUN 模式。
称为隧道模型 RealServer 服务器与前端的 Director 可以在不同的网络中,此种模型也不支持端口映射,RealServer 只能使用哪些支持 IP 隧道的操作系统,前端的 Director 只处理客户端的请求,然后将请求转发给 RealServer,由后台的 RealServer 直接响应客户端,不再经过 Director,RIP 一定不能是私有 IP,在 DR、TUN 模式中,数据包是直接返回给用户的,所以,在 Director Server 上以及集群的每个节点上都需要设置这个地址。此 IP 在 Real Server 上一般绑定在回环地址上,例如 lo:0,同样,在 Director Server 上,虚拟 IP 绑定在真实的网络接口设备上,例如 eth0:0。
准备四台服务器或虚拟机:
Web Nginx:10.16.8.8/10.16.8.9
Keepalived:10.16.8.10/10.16.8.11
Keepalived VIP:10.16.8.100/10.16.8.101
OS:CentOS Linux release 7.4.1708 (Core)
先决条件:
安装 keepalived。
时间同步。
设置 SELinux 和防火墙。
互相之间 /etc/hosts 文件添加对方主机名(可选)。
确认网络接口支持多播(组播)新网卡默认支持。
以上部署请参阅:《keepalived 安装及配置文件讲解》。
$ vim /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {root@localhost}
notification_email_from ka@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 60
vrrp_mcast_group4 224.0.0.111
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 191
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass renwole0
}
virtual_ipaddress {10.16.8.100}
notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"
notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"
notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 192
priority 95
advert_int 1
authentication {
auth_type PASS
auth_pass renwole1
}
virtual_ipaddress {10.16.8.101}
notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"
notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"
notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"
}
$ vim /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {root@localhost}
notification_email_from ka@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 60
vrrp_mcast_group4 224.0.0.111
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 191
priority 95
advert_int 1
authentication {
auth_type PASS
auth_pass renwole0
}
virtual_ipaddress {10.16.8.100}
notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"
notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"
notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
interface eth1
virtual_router_id 192
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass renwole1
}
virtual_ipaddress {10.16.8.101}
notify_master "/usr/local/keepalived/etc/keepalived/notify.sh master"
notify_backup "/usr/local/keepalived/etc/keepalived/notify.sh backup"
notify_fault "/usr/local/keepalived/etc/keepalived/notify.sh fault"
}
分别创建此脚本:
$ vim /usr/local/keepalived/etc/keepalived/notify.sh
#!/bin/bash
#
contact='root@localhost'
notify() {local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
$ systemctl start keepalived
$ systemctl enable keepalived
我们还可以在任意一台 keepalived 节点,通过 tcpdump 命令查看组播心跳状态,例如:
$ tcpdump -nn -i eth1 host 224.0.0.111
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
00:32:31.714987 IP 10.16.8.10 > 224.0.0.111: VRRPv2, Advertisement, vrid 191, prio 100, authtype simple, intvl 1s, length 20
00:32:31.715739 IP 10.16.8.11 > 224.0.0.111: VRRPv2, Advertisement, vrid 192, prio 100, authtype simple, intvl 1s, length 20
00:32:32.716150 IP 10.16.8.10 > 224.0.0.111: VRRPv2, Advertisement, vrid 191, prio 100, authtype simple, intvl 1s, length 20
00:32:32.716292 IP 10.16.8.11 > 224.0.0.111: VRRPv2, Advertisement, vrid 192, prio 100, authtype simple, intvl 1s, length 20
00:32:33.717327 IP 10.16.8.10 > 224.0.0.111: VRRPv2, Advertisement, vrid 191, prio 100, authtype simple, intvl 1s, length 20
00:32:33.721361 IP 10.16.8.11 > 224.0.0.111: VRRPv2, Advertisement, vrid 192, prio 100, authtype simple, intvl 1s, length 20
如果提示报错:-bash: tcpdump: command not found.
安装 tcpdump 即可:
$ yum install tcpdump -y
分别安装 lvs。CentOS7 已经集成了 LVS 的核心,所以只需要安装 LVS 的管理工具就可以了:
$ yum -y install ipvsadm
分别停止 ka67/ka68 的 keepalived 服务:$ systemctl stop keepalived
分别在 ka67/ka68 配置文件最后添加 Virtual Server 配置:$ vim /usr/local/keepalived/etc/keepalived/keepalived.conf
virtual_server 10.16.8.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
# sorry_server 127.0.0.1 80
real_server 10.16.8.8 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.16.8.9 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
virtual_server 10.16.8.101 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
# sorry_server 127.0.0.1 80
real_server 10.16.8.8 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.16.8.9 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
分别在 Web 服务器安装 Apache Httpd 或 Nginx 作为 Web 服务,这里安装 Nginx。
关于 Nginx 请参阅:《Centos 7 源码编译安装 Nginx》。
或通过以下方式安装 Nginx,简单快速:
$ yum install epel-release -y
$ yum install nginx -y
测试环境为区分机器的不同,故将显示页面设置成服务器 IP 地址,但在生产环境中获取的内容是一致的。
分别在 web8/web9 执行如下命令:
$ echo "Server 10.16.8.8" > /usr/share/nginx/html/index.html
$ echo "Server 10.16.8.9" > /usr/share/nginx/html/index.html
测试是否访问正常:
$ curl http://127.0.0.1
Server 10.16.8.8
由于该脚本部分命令,在 Centos7 最小化安装中没有,所以请先安装网络工具包:
$ yum install net-tools -y
分别在 web 服务器上添加 rs.sh 脚本:$ vim /tmp/rs.sh
#!/bin/bash
vip1=10.16.8.100
vip2=10.16.8.101
dev1=lo:1
dev2=lo:2
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev1 $vip1 netmask 255.255.255.255 broadcast $vip1 up
ifconfig $dev2 $vip2 netmask 255.255.255.255 broadcast $vip2 up
echo "VS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "VS Server is Cancel!"
;;
*)
echo "Usage `basename $0` start|stop"
exit 1
;;
esac
再分别启动该脚本:
$ /tmp/rs.sh start
如果需要停止,请执行如下命令:$ /tmp/rs.sh stop
在另一台服务器测试是否能够访问
[root@localhost ~]# for i in `seq 5`; do
> curl 10.16.8.100
> curl 10.16.8.101
> done
Server 10.16.8.9
Server 10.16.8.8
Server 10.16.8.8
Server 10.16.8.9
Server 10.16.8.9
Server 10.16.8.8
Server 10.16.8.8
Server 10.16.8.9
Server 10.16.8.9
Server 10.16.8.8
根据测试结果判断,已经实现了 Keepalived+LVS-DR+Nginx 高可用故障切换模式。