运维实战 负载均衡LVS
前期概述
LVS
LVS,全称Linux Virtual Server,翻译为Linux虚拟服务器,即一个虚拟的服务器集群系统.
简单来说,LVS是一个基于四层且具有强大性能的反向代理服务器.
LVS通过工作于内核的ipvs模块来实现功能,主要工作于netfilter 的INPUT链.
而用户需要对ipvs进行操作配置则需要使用ipvsadm这个工具.
ipvsadm主要用于设置lvs模型/调度方式以及指定后端主机.
简单来说,分为两个部分
- ipvs (真正生效实现调度的代码所在的位置)
- ipvsadm (编写规则事先定义的位置)
LVS中的角色
LVS的模型中有两个角色:
调度器: Director,又称为Dispatcher,Balancer.
调度器主要用于接受用户请求.
真实主机: Real Server,简称为RS.
用于真正处理用户的请求.
为了更好地理解,可以将所在角色的IP地址分为以下三种:
Director Virtual IP: 调度器用于与客户端通信的IP地址,简称为VIP
Director IP: 调度器用于与RealServer通信的IP地址,简称为DIP
Real Server : 后端主机的用于与调度器通信的IP地址,简称为RIP
三种调度模式
NAT模式: 基于ip伪装MASQUERADES
,原理是多目标DNAT;所有请求和响应都经由Director调度器.
TUN模式: 基于隧道封装技术。在IP报文的外面再包一层IP报文,调度器和RS不需要在同一网段,RS直接对客户端响应.
DR模式: 所有RS都需要有VIP,将目标地址的MAC地址改为RealServer的MAC地址RS直接对客户端响应;但调度器和RS需要在同一网段.
本次项目使用DR模式进行试验.
项目内容
前期准备
- 四台虚拟机(Server1-4),其中
1
和4
为调度机,2
和3
为RealServer. - 调度端安装
ipvsadm
,RS
安装测试所需的httpd
和处理arp
协议所需的防火墙arptables_jf
- 所有虚拟机设置VIP为
172.25.5.100/32
- 宿主机充当测试用客户端
可能遇到的问题
- 所有虚拟机都添加了同一个VIP,也就是说客户端获取到的VIP可能对应任意一台服务器,当对应的是RS而不是调度机时,即使所有设置都正确也无法进行论调(毕竟根本没有经过调度端),为避免这种情况,需要对RS进行arp防火墙设置.
LVS
本身并不具有健康检查功能,也就是说如果2
或3
上的httpd
出现问题无法正常工作时,他也会一如既往的调度到出现问题的RS,出现报错.keepalived
可以解决这个问题.- 如果只有一台调度机而调度机损坏,则无论RS是否完好整个系统都会崩溃.当需要多台调度机做高可用时也可以使用
keepalived
来进行设置.
具体操作
设置VIP
##四台服务器都需要设置
ip addr add 172.25.5.100/32 dev eth0
在调度机上安装ipvsadm
##安装
yum install -y ipvsadm
##查看策略,此时为空
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
##当没有安装keepalived时,手动增加哦调度策略
##表示添加调度策略,对所有请求VIP的请求使用轮询策略调度RS
ipvsadm -A -t 172.25.5.100:80 -s rr
##添加RS,-g表示直连模式 即DR模式
ipvsadm -a -t 172.25.5.100:80 -r 172.25.5.2:80 -g
ipvsadm -a -t 172.25.5.100:80 -r 172.25.5.3:80 -g
##策略默认保存在/etc/sysconfig/ipvsadm中
配置后端服务器
##安装Apache服务器
yum install -y httpd
##安装arptables
yum install -y arptables_jf
##设置arptables策略,举例设置原因参考arp协议的原理
##当有数据流访问RS的VIP时,直接拒绝,DROP表示丢弃.
arptables -A IN -d 172.25.5.100 -j DROP
##当本机的数据流出去时,将VIP改为真实IP.
arptables -A OUT -s 172.25.5.100 -j mangle --mangle-ip-s 172.25.5.2
#查看策略
arptables -L
#清空内存中的策略
arptables -F
这样就实现了RS对arp广播查询不响应了,对系统外的访问而言这台机子的VIP等同于不存在.
实现健康管理和高可用
因为都使用keepalived
来实现,将配置放在一起进行说明.
- 在软件源中增加高可用仓库.
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.66.254/rhel6.5/addons/HighAvailability
gpgcheck=0
enabled=1
- 安装
keepalived
yum install -y keepalived
- 修改配置文件(此处为实现了健康管理和高可用之后的配置文件)
##Server1,作为主调度机
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_LVS {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.100
}
}
virtual_server 192.168.5.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 192.168.5.2 80 {
weight 1
TCP_CHECK{
connect_port 80 #检查的端口
connect_timeout 3 #检查的超时时间
nb_get_retry 3 #重试的次数
delay_before_retry 3
}
}
real_server 192.168.5.3 80 {
weight 1
TCP_CHECK{
connect_port 80 #检查的端口
connect_timeout 3 #检查的超时时间
nb_get_retry 3 #重试的次数
delay_before_retry 3
}
}
}
##Server2,作为热备机
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_LVS {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.100
}
}
virtual_server 192.168.5.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 192.168.5.2 80 {
weight 1
TCP_CHECK{
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.5.3 80 {
weight 1
TCP_CHECK{
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置文件讲解
keepalived
的配置文件整体可以分为global_defs
vrrp_instance VI_LVS
virtual_server
三部分,也就是全局设置/vrrp路由协议设置/虚拟服务(也就是调度服务)设置部分.
##参数解释
notification_email 通知邮箱
notification_email_from 设置邮件发送者
smtp_server smtp邮箱服务地址
smtp_connect_timeout smtp邮箱服务超时时间
# vrrp_instance VI_LVS部分
state MASTER/BACKUP 状态:主调度机/热备机
interface eth0 指定网卡设备
virtual_router_id 虚拟服务的组ID,注意不同服务的ID不能相同,同网段中出现内容不同的同ID服务日志中会出现错误
priority 权重,用于判断主机和备用机,备用机的权重需要低于主机
virtual_ipaddress 需要包含VIP
# virtual_server部分
delay_loop 心跳间隔
lb_algo rr 采用rr算法
lb_kind DR 采用DR模式
persistence_timeout 50 持久连接时长为50s
protocol 采用TCP协议
real_server 开始定义RS部分
weight 1 设置这台RS的权重为1
TCP_CHECK 健康检测方式为TCP连接检测
connect_port 80 检测端口80
connect_timeout 3 连接等待时长3s
nb_get_retry 3 尝试次数3次
delay_before_retry 3 重连间隔时间3s
正确的实验结果
##当使用curl连接VIP时,正确实现轮转
##即使RS中的某台出现问题/调度器中出现问题也不会影响业务访问
[root@foundation5 ~]# curl 172.25.5.100
Server2
[root@foundation5 ~]# curl 172.25.5.100
Server3
[root@foundation5 ~]# curl 172.25.5.100
Server2
[root@foundation5 ~]# curl 172.25.5.100
Server3