实现原理
| 模块 | 作用说明 |
|---|---|
| core | 为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析 |
| vrrp | 是来实现VRRP协议 |
| check | 负责健康检查,常见的方式有端口检查及URL检查或脚本检查 |
负载调度器主DR模式服务器:192.168.36.10
负载调度器备DR模式服务器:192.168.36.20
Web1节点服务器:192.168.36.30
Web2节点服务器:192.168.36.40
客户端 win10:192.168.36.12
VIP地址: 192.168.36.200
#关闭防火墙、核心防护(四台全关)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@dr1 ~]# yum install -y ipvsadm.x86_64 keepalived.x86_64
[root@dr1 ~]# cd /etc/keepalived/
[root@dr1 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@dr1 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
#10行,邮件服务指向本地
smtp_connect_timeout 30
router_id LVS_01
#12行,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
vrrp_skip_check_adv_addr
vrrp_strict
#本行注释掉
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
#20行,指定热备状态,主为MASTER,备为BACKUP
interface ens33
#21行,指定承载vip地址的物理接口
virtual_router_id 10
#22行,指定虚拟路由器的ID号,每个热备组保持一致
priority 100
#23行,指定优先级,数值越大优先级越高,主为100,备为90
advert_int 1
authentication {
auth_type PASS
auth_pass 666666
#27行,主备服务器密码一致
}
virtual_ipaddress {
192.168.36.200
#指定群集VIP地址
}
}
virtual_server 192.168.36.200 80 {
#34行,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
delay_loop 6
lb_algo rr
lb_kind DR
#37行,指定群集工作模式,直接路由(DR)
persistence_timeout 50
protocol TCP
real_server 192.168.36.30 80 {
#41行,指定第一个Web节点的地址、端口
weight 1
#43行以下删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.36.40 80 {
#指定第一个Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@dr1 keepalived]# systemctl start keepalived
[root@dr1 keepalived]# ip addr show dev ens33

[root@dr1 keepalived]# vim /etc/sysctl.conf
#行尾添加
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@dr1 keepalived]# sysctl -p
#查看
[root@dr1 keepalived]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@dr1 keepalived]# systemctl start ipvsadm.service
[root@dr1 keepalived]# ipvsadm -C
[root@dr1 keepalived]# ipvsadm -A -t 192.168.36.200:80 -s rr
[root@dr1 keepalived]# ipvsadm -a -t 192.168.36.200:80 -r 192.168.36.30:80 -g
[root@dr1 keepalived]# ipvsadm -a -t 192.168.36.200:80 -r 192.168.36.40:80 -g
[root@dr1 keepalived]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP dr1:http rr
-> 192.168.36.30:http Route 1 0 0
-> 192.168.36.40:http Route 1 0 0
[root@dr1 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.36.200:80 rr
-> 192.168.36.30:80 Route 1 0 0
-> 192.168.36.40:80 Route 1 0 0
[root@dr1 keepalived]# ipvsadm-save >/etc/sysconfig/ipvsadm
keepalived默认会把日志打在/var/log/messages。如果不进行配置的话,日志混在一起很难进行调试问题
[root@dr1 keepalived]# vim /etc/sysconfig/keepalived
把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -d -S 0"
[root@dr1 keepalived]# vim /etc/rsyslog.conf
#添加内容
local0.* /var/log/keepalived.log
#重启日志记录服务
[root@dr1 keepalived]# systemctl restart rsyslog
#重启keepalived服务
[root@dr1 keepalived]# systemctl restart keepalived
#可以查看下日志是否生成
[root@dr1 keepalived]# cat /var/log/keepalived.log
[root@dr2 ~]# yum install -y ipvsadm.x86_64 keepalived.x86_64
[root@dr2 ~]# cd /etc/keepalived/
[root@dr2 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@dr2 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
#10行,邮件服务指向本地
smtp_connect_timeout 30
router_id LVS_02
#12行,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
vrrp_skip_check_adv_addr
vrrp_strict
#本行注释掉
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
#20行,指定热备状态,主为MASTER,备为BACKUP
interface ens33
#21行,指定承载vip地址的物理接口
virtual_router_id 10
#22行,指定虚拟路由器的ID号,每个热备组保持一致
priority 90
#23行,指定优先级,数值越大优先级越高,主为100,备为90
advert_int 1
authentication {
auth_type PASS
auth_pass 666666
#27行,主备服务器密码一致
}
virtual_ipaddress {
192.168.36.200
#指定群集VIP地址
}
}
virtual_server 192.168.36.200 80 {
#34行,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
delay_loop 6
lb_algo rr
lb_kind DR
#37行,指定群集工作模式,直接路由(DR)
persistence_timeout 50
protocol TCP
real_server 192.168.36.30 80 {
#41行,指定第一个Web节点的地址、端口
weight 1
#43行以下删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.36.40 80 {
#指定第一个Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@dr2 keepalived]# systemctl start keepalived
[root@dr2 keepalived]# ip addr show dev ens33
[root@dr2 keepalived]# vim /etc/sysctl.conf
#添加内容
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
#查看
[root@dr2 keepalived]# sysctl -p
[root@dr2 keepalived]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@dr2 keepalived]# systemctl start ipvsadm.service
[root@dr2 keepalived]# ipvsadm -A -t 192.168.36.200:80 -s rr
[root@dr2 keepalived]# ipvsadm -a -t 192.168.36.200:80 -r 192.168.36.30:80 -g
[root@dr2 keepalived]# ipvsadm -a -t 192.168.36.200:80 -r 192.168.36.40:80 -g
[root@dr2 keepalived]# ipvsadm
[root@dr2 keepalived]# ipvsadm -ln
[root@dr2 keepalived]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# vim /var/www/html/index.html
八百标兵奔北坡
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.36.200
NETMASK=255.255.255.255
[root@web1 network-scripts]# systemctl restart network
[root@web1 network-scripts]# ifup lo:0
[root@web1 network-scripts]# ifconfig lo:0
lo:0: flags=73 mtu 65536
inet 192.168.36.200 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@web1 network-scripts]# route add -host 192.168.36.200 dev lo:0
[root@web1 network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.36.2 0.0.0.0 UG 100 0 0 ens33
192.168.36.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.36.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
添加系统只响应目的IP为本地IP的ARP请求
系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@web1 network-scripts]# vim /etc/sysctl.conf
#添加以下内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#刷新查看
[root@web1 network-scripts]# sysctl -p
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# vim /var/www/html/index.html
炮兵并排北边跑
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.36.200
NETMASK=255.255.255.255
[root@web2 network-scripts]# systemctl restart network
[root@web2 network-scripts]# ifup lo:0
[root@web2 network-scripts]# ifconfig lo:0
lo:0: flags=73 mtu 65536
inet 192.168.36.200 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@web2 network-scripts]# route add -host 192.168.36.200 dev lo:0
[root@web2 network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.36.2 0.0.0.0 UG 100 0 0 ens33
192.168.36.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.36.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@web2 network-scripts]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@localhost network-scripts]# sysctl -p
当前使用的为主DR服务器

备调度器上没有VIP

断开主调度器
[root@dr1 keepalived]# systemctl stop keepalived.service
可以看到主调度器的VIP已经没有了

已经漂移到备调度器上了

win10上测试

