LVS负载均衡的实现是基于Linux内核模块ipvs,和iptables一样是直接工作在内核中,默认的镜像源中已经集成了ipvs模块
##为了安装管理工具ipvsdam,所以应该先配置完整的yum源,镜像源挂载在真实主机上
真实主机的ip为172.25.70.250
[root@lvs ~]# vim /etc/yum.repos.d/yum.repo
[rhel6.5]
name=rhel6.5
baseurl=http://172.25.70.250/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.70.250/rhel6.5/LoadBalancer
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.70.250/rhel6.5/HighAvailability
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.70.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.70.250/rhel6.5/ScalableFileSystem
gpgcheck=0
##安装ipvsadm
[root@lvs ~]# yum install -y ipvsadm
##添加vip
[root@lvs ~]# ip addr add 172.25.70.100/24 dev eth0
[root@lvs ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:e6:18:54 brd ff:ff:ff:ff:ff:ff
inet 172.25.70.1/24 brd 172.25.70.255 scope global eth0
inet 172.25.70.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fee6:1854/64 scope link
valid_lft forever preferred_lft forever
##配置ipvsadm的策略
[root@lvs ~]# ipvsadm -A -t 172.25.70.100:80 -s rr #设置调度器的ip,以及算法,rr为轮询,-t表示指定虚拟服务为tcp服务
##添加realserver
[root@lvs ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.2:80 -g
[root@lvs ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.3:80 -g
##保存策略并开启服务,显示为ok则表示开启成功
[root@lvs ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@lvs ~]# /etc/init.d/ipvsadm start
ipvsadm: Clearing the current IPVS table: [ OK ]
ipvsadm: Applying IPVS configuration: [ OK ]
##查看策略
[root@lvs ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.100:http rr
-> 172.25.70.2:http Route 1 0 0
-> 172.25.70.3:http Route 1 0 0
在这里,需要设置realserver隐藏vip,因为如果不隐藏的话,VS和RS在局域网中会有多个相同的ip生效(VIP),会导致IP冲突,数据流传输混乱。而且如果隐藏VS调度器的VIP,客户端访问VIP时会得到来自RS其中某一台的数据,mac地址也是RS中的一台,不能实现MAC地址转换,那么负载均衡也就没有意义
隐藏RS的VIP可以通过两种方法,一种是通过修改RS的内核参数,还有一种是设置ARP策略,因为DR模式实现MAC的转换是通过ARP协议来实现的。这里两台RS通过两种不同的方法来实现,实际情况下随便用哪一种都可,但同一个RS只做一种即可
ip addr add 172.25.92.100/24 dev eth0 ##添加vip,所有的RS均需要
/etc/init.d/httpd start #开启apache服务
##RS1通过修改内核参数
vim /etc/sysctl.conf ##添加下面四行
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p #修改生效
##RS2通过修改arp策略来隐藏
/etc/init.d/httpd start #开启apche服务
yum install -y arptables_jf.x86_64 #安装arptbles的管理工具
ip addr add 172.25.70.100/24 dev eth0 #添加vip
arptables -A IN -d 172.25.70.100 -j DROP #丢弃对本机上172.25.70.100发来的所有数据包
arptables -A OUT -s 172.25.70.100 -j mangle --mangle-ip-s 172.25.70.3 #隐藏vip,只是对外公布自己的真实ip
/etc/init.d/arptables_jf save #保存arp策略
(1)在client上访问虚拟ip查看显示是否实现了负载均衡,以及ARP是否是通过VS
可以看到成功实现了负载均衡
(2)此时,关闭RS中的某一个服务,查看是否是轮询算法
ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除。
ldirectord 进程通过向RealServer的RIP发送资源访问请求并通过由RealServer返回的响应信息来确定RealServer的运行状态。在 Director上,每一个VIP需要一个单独的ldirectord进程。如果RealServer不能正常响应Director上 ldirectord的请求,ldirectord进程将通过ipvsadm命令将此RealServer从IPVS表中移除。而一旦 RealServer再次上线,ldirectord会将其重新添加至IPVS表中
在lvs主机上安装配置ldirectord,直接从官网上下载的rpm包进行安装
[root@lvs ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
[root@lvs ~]# rpm -ql ldirectord ##查看生成的文件
[root@lvs ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
##修改配置文件,修改25到38行之间的内容
[root@lvs ~]# vim /etc/ha.d/ldirectord.cf
25 virtual=172.25.70.100:80 ##LVS使用的VIP和端口
26 real=172.25.70.2:80 gate ##realserver
27 real=172.25.70.3:80 gate
28 fallback=127.0.0.1:80 gate #当所有的RS都宕掉后,使用本地地址回应
29 service=http ##服务
30 scheduler=rr ##LVS使用的调度算法
31 #persistent=600 #持续时间,针对服务,ftp应该设置持续时间
32 #netmask=255.255.255.255
33 protocol=tcp # 定义此虚拟服务用到的协议
34 checktype=negotiate # ldirectord进程用于监控RealServer的方法;{negotiate|connect|A number|off}
35 checkport=80 # 指健康检查使用的端口;
36 request="index.html" # 检查RealServer用到的页面
37 #receive="Test Page" # 检查RealServer用到的页面内容
38 #virtualhost=www.x.y.z
##不要忘记先打开上面那个实验最后关闭的RS1的apache服务
##这里需要先关闭ipvsadm本身的策略,然后打开ldirectord,配置的策略会自动加载进去
[root@lvs ~]# /etc/init.d/ipvsadm stop
[root@lvs ~]# ipvsadm -l #此时策略为空
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lvs ~]# /etc/init.d/ldirectord start
[root@lvs ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.100:http rr
-> 172.25.70.2:http Route 1 0 0
-> 172.25.70.3:http Route 1 0 0
(1)先关闭某一个RS服务,查看ipvsadm的策略内容
(2)将两个RS服务都关闭,查看策略是否是配置文件设置的本地
则此时健康检查设置成功!
如果单台LVS发生突发情况,例如宕机、发生不可恢复等,会导致用户无法访问后端所有的应用程序。为了避免这种问题导致网站长时间不可用,可以使用HA方案实现故障切换,可以基于LVS+keepalived实现负载均衡及高可用,满足网站稳定高效运行。
如果使用了keepalived的配置,就不需要执行ipvsadm添加均衡的realserver命令,所有的都在keepalived的配置文件里面设置
keepalived的功能其实和ldirectord类似,它们两会产生冲突,所以做这个实验时,需要先把ldirectord关掉
keepalived的安装等在上一篇博客中有写到,这里直接从修改配置文件开始
这里不仅做了http还做了ftp,那么真实主机也需要安装ftp并且创建文件等用来测试,这里就展示这些工作了
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict #此处应该注释掉,否则开启keepalived后会默认将vip(172.25.92.100)加入到iptables的禁止访问列表中,可以通过iptables -L看到
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 92
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.70.100
}
}
##http
virtual_server 172.25.70.100 80 {
delay_loop 1
lb_algo rr
lb_kind DR
#persistence_timeout 50 #持续连接一台RS的时间,对于ftp服务需要开启
protocol TCP
real_server 172.25.70.2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.70.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
##ftp
virtual_server 172.25.70.100 21 {
delay_loop 1
lb_algo rr
lb_kind DR
persistence_timeout 50 #ftp服务需要保持持续连接时间,防止传输的数据流中断
protocol TCP
real_server 172.25.70.2 21 {
weight 1
TCP_CHECK {
connect_port 21
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.70.3 21 {
weight 1
TCP_CHECK {
connect_port 21
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
(1)测试http是否实现了负载均衡,并且是否实现了keepalived的高可用
(2)测试ftp
可以看到,当有两台主机同时访问172.25.70.100的ftp时,其中一个是RS1提供的服务,一个是RS2提供的服务,实现了负载均衡!
如果只有一台keepalived的话,当这台keepalived出现问题的话,也会造成网站无法访问,所以也可以做keepalived的主备,而这个的实现可以参考上一篇专门写keepalived的博客,里面有实现
在lvs+keepalived+nginx架构中,如果突然发现网站的部分用户访问比较慢,甚至出现无法访问的情况,这个问题排错如下:
ping www.xxx.com
,通过ping返回域名对应的IP是否正常tracert www.xxx.com
,而linux主机通过traceroute www.xxx.com
测试客户端主机到服务器的链路延迟;ipvsadm -Ln
查看当前后端Web连接信息wget
目前连接最多的后端服务器的http页面返回会很慢,直至超时。而其他的服务器返回正常。那么为了防止这种事件,可以增加LVS对于后端Nginx URL的检测,能访问URL表示服务正常。那么通过URL检测的话,就算后端某台服务器出现502超时错误,keepalived也会自动将这台后端服务器踢出,等待它恢复后再添加到正常的服务器列表上。
keepalived基于URL检查的代码如下,用ip地址为172.25.70.1
的后端服务器为例:
##在keepalived.conf文件里配置该后端服务器处修改为:
real_server 172.25.70.1 {
weight 100
HTTP_GET {
url {
path /log/warn.jsp
status_code 200
}
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}