拓扑图
环境概述
机器作用 IP地址
lvs1+keepalived Master 192.168.42.150
lvs2+keepalived Backup 192.168.42.149
web1 192.168.42.148
web2 192.168.42.147
VIP 192.168.42.180
注意事项:
第一:确保client能够直接访问web服务器。因为在LVS-DR模式下web服务器回复client的时候,是直接回复给client的,不需要经过LVS,所以web服务器必须能够和client的网络互通。
第二,lvs服务器和web-server他们必须在同一个网段内,因为LVS转发包的时候,是直接修改了包目标的MAC地址,直接扔给了rs,基于MAC地址的修改是活动在OSI二层数据链路层的,工作在数据链路层的网络设备就是交换机了,所以必须在一个交换机下面,也就是一个局域网内。
第三,为啥抑制real-server的ARP,是这样的,我们在DR模式要更改web-server的ARP的模式,arp_ignore为1是说只回答目标IP地址是来访网络接口本地地址的ARP查询请求,我们都在回环接口上配置了一个VIP,当arp模式更改以后,那么如果有谁在请求VIP的mac地址时,那么那些web-server就会回答arp广播报文了,只有lvs才会,如果没有更改arp模式,那么大家都喊我是VIP,这就乱套了。
安装部署
LVS配置
#打开路由转发功能
[root@node1 ~]# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
#使上述的配置文件生效
[root@node1 ~]# sysctl -p
net.ipv4.ip_forward = 1
#查看selinux是否关闭,未关闭则关闭
[root@node1 ~]# getenforce
Disabled
#关闭防火墙
[root@node1 ~]# systemctl stop firewalld
#安装ipvsadm以及keepalived
yum install -y ipvsadm keepalived
#配置keepalived.conf文件
[root@node1 keepalived]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { # 全局设置
notification_email { # 设置报警邮件地址
test@sina.cn
}
notification_email_from Alexandre.Cassen@firewall.loc # 设置邮件的发送地址
router_id MASTER # 表示该台服务的ID,备用节点修改为BACKUP
}
vrrp_instance VI_1 { # vrrp 实例
state MASTER # 当前节点的角色,备用节点为BACKUP
interface ens33
virtual_router_id 51 # master和backup的id一致
priority 100 #备用节点修改为90
advert_int 1 # master和backup之间的检测时间
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.42.180/32 dev ens33 # 设置虚拟IP
}
}
virtual_server 192.168.42.180 80 { # 设置虚拟服务器,ip端口以及花边号用逗号隔开
delay_loop 5 # 设置运行情况检查时间,单位是秒
lb_algo rr # 负载算法,这里是rr表示轮询
lb_kind DR # LVS工作机制,这里是DR模式
# persistence_timeout 50 # 会话保持时间,单位是秒,这个选项对动态网页非常有帮助,为集群系统中的session共享提供了一个很好的解决方案,有了这个会话>保持功能,用户的请求会被一直分发到某个服务节点,知道超过这个会话的保持时间,需要注意的是,这个会话保持时间是最大无响应的超时时间,in other words,用户>在动态页面50秒以内没有执行任何操作,那么接下来的操作会重新调度到另一个节点上。如果一直在操作则不会影响
protocol TCP # 有TCP,UDP,好像还有哦http。
real_server 192.168.42.148 80 { #设定真实服务器地址以及端口,
weight 1 # 设置权重,数字越低,调度的比例越小。
HTTP_GET { #以http模式检查该服务器监控状态
url {
path / # 检测的网页路径
digest 699d00db64614eb287931b977d5c047f # 采用genhash命令获取
}
connect_timeout 1 # 连接超时时间,
connect_port 80 #连接的端口,
nb_get_retry 3 # 表示重试次数,
delay_before_retry 1 # 表示重试间隔。
}
}
real_server 192.168.42.147 80 {
weight 1
HTTP_GET {
url {
path /
digest 66ee606d5019d75f83836eeb295c6b6f
}
connect_timeout 2
connect_port 80
nb_get_retry 3
delay_before_retry 1
}
}
}
#使用genhash获取web服务的url的校验码
[root@node1 keepalived]# genhash -s 192.168.42.147 -p 80 -u /
MD5SUM = 66ee606d5019d75f83836eeb295c6b6f
[root@node1 keepalived]# genhash -s 192.168.42.148 -p 80 -u /
MD5SUM = 699d00db64614eb287931b977d5c047f
RealServer节点配置
#设置相关的抑制广播通告的配置信息
[root@localhost ~]# cat /etc/sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
#使得上面的配置生效
[root@localhost ~]# sysctl -p
#添加虚拟IP和路由
[root@localhost ~]# ifconfig lo:0 192.168.42.180 netmask 255.255.255.255 broadcast 192.168.42.180 up
[root@localhost ~]# route add -host 192.168.42.180 dev lo:0 #先不添加这路由,如果出现无法访问的时候再添加也不迟
#安装nginx,并启动
yum install nginx -y
systemctl start nginx
启动keepalived服务
#启动keepalived
systemctl start keepalived
#查看相关的日志信息,可以看到Master机器的日志信息如下:
Nov 2 01:07:42 localhost systemd: Starting LVS and VRRP High Availability Monitor...
Nov 2 01:07:42 localhost Keepalived[2400]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Nov 2 01:07:42 localhost Keepalived[2400]: Opening file '/etc/keepalived/keepalived.conf'.
Nov 2 01:07:42 localhost systemd: PID file /var/run/keepalived.pid not readable (yet?) after start.
Nov 2 01:07:42 localhost systemd: Started LVS and VRRP High Availability Monitor.
Nov 2 01:07:42 localhost Keepalived[2401]: Starting Healthcheck child process, pid=2402
Nov 2 01:07:42 localhost Keepalived[2401]: Starting VRRP child process, pid=2403
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: Registering Kernel netlink reflector
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: Registering Kernel netlink command channel
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: Registering gratuitous ARP shared channel
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: Opening file '/etc/keepalived/keepalived.conf'.
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: VRRP_Instance(VI_1) removing protocol VIPs.
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: Using LinkWatch kernel netlink reflector...
Nov 2 01:07:42 localhost Keepalived_vrrp[2403]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Nov 2 01:07:42 localhost kernel: IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP)
Nov 2 01:07:42 localhost kernel: IPVS: Connection hash table configured (size=4096, memory=64Kbytes)
Nov 2 01:07:42 localhost kernel: IPVS: Creating netns size=2040 id=0
Nov 2 01:07:42 localhost kernel: IPVS: Creating netns size=2040 id=1
Nov 2 01:07:42 localhost kernel: IPVS: ipvs loaded.
Nov 2 01:07:42 localhost Keepalived_healthcheckers[2402]: Opening file '/etc/keepalived/keepalived.conf'.
Nov 2 01:07:42 localhost kernel: IPVS: [rr] scheduler registered.
Nov 2 01:07:42 localhost Keepalived_healthcheckers[2402]: Activating healthchecker for service [192.168.42.180]:80 # 后端real-server校验成功,可以提供服务
Nov 2 01:07:42 localhost Keepalived_healthcheckers[2402]: Activating healthchecker for service [192.168.42.180]:80 # 后端real-server校验成功,可以提供服务
Nov 2 01:07:43 localhost Keepalived_vrrp[2403]: VRRP_Instance(VI_1) Transition to MASTER STATE # 设置本机为master角色
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: VRRP_Instance(VI_1) setting protocol VIPs. #设置VIP到本机上
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.42.180
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:44 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:49 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:49 localhost Keepalived_vrrp[2403]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.42.180
Nov 2 01:07:49 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:49 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:49 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 2 01:07:49 localhost Keepalived_vrrp[2403]: Sending gratuitous ARP on ens33 for 192.168.42.180
#查看IP信息
[root@node1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
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 qlen 1000
link/ether 00:0c:29:79:3e:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.150/24 brd 192.168.42.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.42.180/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe79:3e93/64 scope link
valid_lft forever preferred_lft forever
相关测试访问
#在备用节点测试如下
[root@localhost ~]# curl http://192.168.42.180
web1
[root@localhost ~]# curl http://192.168.42.180
web2
[root@localhost ~]# curl http://192.168.42.180
web1
[root@localhost ~]# curl http://192.168.42.180
web2
#将主节点停掉,查看服务是否正常
[root@localhost ~]# systemctl stop keepalived
#查看备用节点的日志信息
Nov 7 01:02:03 localhost Keepalived_vrrp[1275]: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: VRRP_Instance(VI_1) setting protocol VIPs.
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.42.180
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:04 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:09 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:09 localhost Keepalived_vrrp[1275]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.42.180
Nov 7 01:02:09 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:09 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:09 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
Nov 7 01:02:09 localhost Keepalived_vrrp[1275]: Sending gratuitous ARP on ens33 for 192.168.42.180
由以上的信息可得,备用节点已经对外提供服务
#查看备用节点的网卡信息,看虚拟IP是否已经转换
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
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 qlen 1000
link/ether 00:0c:29:a1:31:82 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.149/24 brd 192.168.42.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.42.180/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea1:3182/64 scope link
valid_lft forever preferred_lft forever
#测试路由切换以后的访问是否正常,在主节点测试
[root@localhost ~]# curl http://192.168.42.180
web2
[root@localhost ~]# curl http://192.168.42.180
web1
[root@localhost ~]# curl http://192.168.42.180
web2
[root@localhost ~]# curl http://192.168.42.180
web1
#将主节点的keepalived开启之后,主节点又重新提供服务,备用节点重新回到备用状态
#停掉某一个web1服务器,查看请求的内容
[root@localhost ~]# curl http://192.168.42.180
web2
[root@localhost ~]# curl http://192.168.42.180
web2
[root@localhost ~]# curl http://192.168.42.180
web2
可以看到,当停止web1服务器的时候,所有的请求都将调度至web2