LVS:Linux virtual server,为linux虚拟主机,同过不同的模式和转发算法,将tcp请求分发到不同后端服务器。后端服务器分别响应客户端请求以达到负载均衡的目的。4种工作模式和10种调度算法。
LVS是被编译进内核中,主要分为两部分ipvs和ipvsadm,ipvs是LVS软件核心,实现了传输层负载均衡。ipvsadm是用户空间的集群管理工具。
4种模式:NAT,TUN,DR,FULLNAT。至于这几种模式的区别,优缺点网上到处是资料就不详述了,自行查阅。
10种调度算法:常见的有轮询,加权轮询,ip hash等,自行查阅。
Keepalived:LVS只是负责负载均衡的转发,那如果后台的Real Server的服务挂掉以后,LVS是否能主动把这个摘除掉吗?答案是:肯定不行的,就是LVS不具备把后端挂掉的Real Server摘除掉,所以keepalived的应运而生。可以说keepalived 就是为LVS设计的,同时keepalived又可以作为一个独立的软件,根据后端服务器的健康状态切换vip。它根据tcp/ip参考模型的第三四和第五层交换机制检测每个服务节点的状态,每个服务节点异常或者工作障碍,keepalvied讲立刻检测到,并把障碍节点剔除,是毫秒级的,当后台节点恢复正常以后,keepalived有自动将服务节点重新添加在服务器集群中。主要由core、check和vrrp协议三个模块组成。
- 只用lvs(DR)实现负载均衡,没有keepalived情况下。
LVS DR原理:用户请求LVS到达director server,director server将请求的报文的目的MAC地址改为后端的real server的MAC地址,目的IP为VIP(不变),源IP为client IP地址(不变),然后director将报文发送到realserver,realserver检测到目的地址为自己本地的VIP,如果在同一网段,将请求直接返回给用户,如果用户跟realserver不在同一个网段,则需要通过网关返回给用户。
对外服务器(DS) | DIP:10.6.49.130 | VIP:10.6.48.109 |
后端服务器(RS) | RIP:10.6.48.162 | VIP:10.6.48.109 |
后端服务器(RS) | RIP:10.6.48.162 | VIP:10.6.48.109 |
两台RS配置:
#arp抑制
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
# 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
# 将ARP请求的源IP设置为eth0上的IP,也就是RIP
# 必须完成以上设置,才可继续
ifconfig lo:0 10.6.48.109 broadcast 172.30.100.1 netmask 255.255.255.255
# 添加IP地址为VIP的虚拟网卡lo:0
route add -host 10.6.48.109 dev lo:0
# 添加一条路由,目标IP为VIP的数据包使用lo接口发送,这样响应报文的源IP就会为VIP
#再启动一个socket服务,绑定端口用来做验证。
DS配置:
lsmod |grep ip_vs
# 确保内核加载了lvs模块
yum install -y ipvsadm
# 安装用户管理工具
ifconfig eth0:0 10.6.48.109 netmask 255.255.255.255
# 在DS服务器上添加一个地址为VIP的虚拟网卡eth0:0
ipvs规则配置
ipvsadm -A -t 10.6.48.109:8080 -s wrr
# 添加虚拟服务,指定IP、端口、算法
ipvsadm -a -t 10.6.48.109:8080 -r 10.6.48.162:8079 -g -w 10
# 添加第一台后端服务器,指定DR模式,指定权重为10
ipvsadm -a -t 10.6.48.109:8080 -r 10.6.48.167:8079 -g -w 10
# 添加第二台后端服务器,指定DR模式,指定权重为10
keepalived登场:
在前面方式下,达到了负载均衡的目的,但是如果DS挂了,也就没有了VIP对外服务,这时候keepalived就登场了,再加一台DS使用keepalived做热备,当一台DS挂了的时候另一台直接顶上。自动切换VIP,而keepalived的切换是毫秒级的,就实现了高可用。
对外服务器(DS) | DIP:10.6.49.131 | VIP:10.6.48.109 |
对外服务器(DS) | DIP:10.6.49.130 | VIP:10.6.48.109 |
后端服务器(RS) | RIP:10.6.48.162 | VIP:10.6.48.109 |
后端服务器(RS) | RIP:10.6.48.167 | VIP:10.6.48.109 |
后端服务器RS配置:
后端服务器配置与上边的一样,不做任何修改。
DS配置:
#yum -y install keepalived ipvsadm
#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { ##全局设置
notification_email { ##设置报警邮件地址
root@localhost
}
notification_email_from root@localhost ##设置邮件的发送地址
smtp_server localhost
smtp_connect_timeout 30
router_id LVS-1 ##表示该台服务的ID
}
vrrp_instance VI_1 {
#两台都设为 BACKUP
state BACKUP
nopreempt
#不抢占,默认为抢占
#绑定vip的网卡为eth0,根据自己的服务器来设置
interface eth0
virtual_router_id 109
priority 100
#优先级另一台上为90,(只要低于主就可以)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.6.48.109
}
}
virtual_server 192.168.243.100 80 {
#每隔10秒查询realserver状态
delay_loop 10
#lvs 算法采用 roundrobin
lb_algo rr
#DR模式
lb_kind DR
#同一IP的连接60秒内被分配到同一台realserver
persistence_timeout 60
#用TCP协议检查realserver状态
protocol TCP
#后端服务器
real_server 192.168.243.135 8070 {
weight 100
TCP_CHECK {
#10秒无响应超时
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
#后端服务器
real_server 192.168.243.136 8070 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#systemctl start keepalived
#systemctl enable keepalived
以上就做到了高可用负载均衡架构,上述情况下DS始终还是只有一台对外服务,即使后端服务器再多难免会性能不足,留给读者一个思考问题,如何横向扩展DS,让多台DS对外服务?