文章目录
- 一、LVS简介
- 二、DR模式
- 1.概念
- 2.原理
- 三、使用DR模式实现负载均衡
- 四、可能会出现的问题解决
一、LVS简介
lvs(linux virtual server),linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统,那么负载均衡实现了很好可伸缩性,节点数目可以增长到几千,甚至几万。后期也由很多用户参与开发LVS辅助工具和辅助组件,最出名的就是alexandre为LVS编写的keepalived,它最初专门用于监控LVS,之后又加入VRRP实现高可用功能。
负载调度器,真实服务器群节点一起被称为LVS,LVS负载调度器(有时也称为负载均衡器),接收服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求。
1)、负载调度器(director):作为整个集群的前端,主要将用户请求分发至真实服务器中进行处理。
2)、真实服务器池:由多个功能相同的真是服务器组成,为用户提供真正的网络服务,如web服务,邮件服务等。且虚拟服务器集群作为一个可伸缩的集群,可自由添加深处真是服务器而并步影响整个集群的正常工作。
3)、共享存储:作用就是让每个用户访问的资源都是一样的,服务器支持写操作,才建议使用
LVS集群的高可用,虽然LVS负载均衡性能很好,但是如果其中节点故障,LVS是无法感知的,因此产生了LVS周边的一个辅助工具KeepAlived,用于监控检查兼容性非常好,如果RS一个节点挂掉,keepalived会将此节点从管理列表中剔出,当节点恢复再拉回管理列表,但是此时的调度器存在单点故障的可能性,所以还必须使用其他软件来实现调度器的高可用,比如hearbeat。
根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
二、DR模式
1.概念
通过直接路由实现虚拟服务器。DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR模式可以极大的提高集群系统的伸缩性,而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器与真实服务器都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
2.原理
LVS通过控制IP来实现负载均衡。ipvsadm是其具体的实现模块。(ipvsadm安装在调度器上,当用户访问VIP时,先到达调度器,由调度器按照其规则选择真实主机,处理完成返回客户端)
三、使用DR模式实现负载均衡
四台主机,一台为调度器,两台为真实主机,另外一台为测试机
首先在调度器中添加虚拟IP:VIP
[root@server1 conf]# ip addr add 192.168.110.100/24 dev ens33
[root@server1 conf]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7a:04:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.110.28/24 brd 192.168.110.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.110.100/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7a:49e/64 scope link
valid_lft forever preferred_lft forever
给调度器添加策略,使用ipvsadm查看,结果如下,已经成功添加
[root@server1 conf]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1:http rr
-> server3:http Route 1 0 0
-> server4:http Route 1 0 0
分别在两个真实主机安装httpd服务,并且开启;但是当用户向VIP发起请求时,调度器和真实主机都必须有VIP,所以我们要给两个真实主机也添加VIP
[root@server4 ~]# ip addr add 192.168.110.100/32 dev ens33
[root@server4 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:da:bb:6f brd ff:ff:ff:ff:ff:ff
inet 192.168.110.31/24 brd 192.168.110.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.110.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feda:bb6f/64 scope link
valid_lft forever preferred_lft forever
以下就是实现了负载均衡之后的测试机访问VIP界面,可以看到,调度器将需求平均分摊在了两个真是主机上边,实现了轮叫
[root@server5 ~]# for i in {1..10}; do curl 192.168.110.100;done
server1.3
server1.1
server1.3
server1.1
server1.3
server1.1
server1.3
server1.1
server1.3
server1.1
[root@server5 ~]# curl 192.168.110.100
server1.3
[root@server5 ~]# curl 192.168.110.100
server1.1
[root@server5 ~]# curl 192.168.110.100
server1.3
[root@server5 ~]# curl 192.168.110.100
server1.1
调度器也会显示当前不活跃的连接数都是7,实现了负载均衡
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1.2:http rr
-> 192.168.110.3:http Route 1 0 7
-> 192.168.110.10:http Route 1 0 7
四、可能会出现的问题解决
如果真实主机中有一台停止工作,那么该如何解决客户端访问报错问题
在出现这种问题的时候,客户端已经报错,但是调度器上却仍然正常显示,因此我们要使调度策略实时更新来解决这一问题
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1.2:http rr
-> 192.168.110.3:http Route 1 0 5
-> 192.168.110.10:http Route 1 0 5
首先在调度器上安装keepalived(健康监测)
[root@server1 ~]# yum install -y keepalived -y
[root@server1 keepalived]# yum install -y postfix mailx
在keepalived。conf配置文件中修改配置,包括修改通知邮件,添加自己设置的VIP;添加自己的真实主机,具体如下:
root@localhost
}
#notification_email_from Alexandre.Cassen@firewall.loc
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.110.100
}
}
virtual_server 192.168.110.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50 (这是在多长的时间内持续的将所有请求交给一个真是主机执行)
protocol TCP
real_server 192.168.110.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.110.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
先删除我们之前添加的策略以及VIP;启动keepalived服务,再次查看策略,发现已经自动添加,VIP也已经添加成功
[root@server1 keepalived]# systemctl reload keepalived.service
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.110.100:80 rr persistent 50
-> 192.168.110.10:80 Route 1 0 10
[root@server1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5e:69:1e brd ff:ff:ff:ff:ff:ff
inet 192.168.110.2/24 brd 192.168.110.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.110.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5e:691e/64 scope link
valid_lft forever preferred_lft forever
现在再次在测试机进行测试,发现不会出现报错,所有的请求都被调度到没有问题的真实主机上
[root@server5 ~]# for i in {1..10}; do curl 192.168.110.100;done
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
当我们的真实主机恢复正常时,我们再次进行测试,会发现出现了轮叫,实现了负载均衡