keepalived概述

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived工作原理

1、keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

2、虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

3、keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

实验环境

调度服务器DR1(主): 192.168.100.66 centos7-1
调度服务器DR2(备): 192.168.100.77 centos7-2

节点服务器web1: 192.168.100.88 centos7-3
节点服务器web2: 192.168.100.99 centos7-4

漂移地址vip: 192.168.100.100

客户端client: 192.168.100.200 windows7

配置centos7-1

yum install ipvsadm keepalived -y

修改网卡模式为仅主机并固定IP:192.168.100.66

[root@dr1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO=static

IPADDR=192.168.100.66
NETMASK=255.255.255.0
GATEWAY=192.168.100.1

[root@dr1 ~]# service network restart
Restarting network (via systemctl): [ 确定 ]

[root@dr1 ~]# vim /etc/sysctl.conf
#添加路由转发功能
net.ipv4.ip_forward=1
#proc响应关闭重定向功能
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0

#生效路由转发功能
[root@dr1 ~]# sysctl -p

构建虚拟网卡

[root@dr1 ~]# cd /etc/sysconfig/network-scripts/

[root@dr1 network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0

[root@dr1 network-scripts]# vim ifcfg-ens33:0
#删除原有内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.100
NETWASK=255.255.255.0

#启用虚拟网卡
[root@dr1 network-scripts]# ifup ens33:0

添加服务启动脚本

[root@dr1 ~]# cd /etc/init.d/

[root@dr1 init.d]# vim dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.100
RIP1=192.168.100.88
RIP2=192.168.100.99
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting------------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsamd stoped--------------------[ok]"
;;
status)
if [ ! -e ar/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped--------------------"
exit 1
else
echo "ipvsamd Runing-------------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0

#授予脚本执行权限
[root@dr1 init.d]# chmod +x dr.sh

#启动脚本
[root@dr1 init.d]# service dr.sh start

#查看ipvsadm 状态
[root@dr1 init.d]# systemctl status ipvsadm #查看服务开启状态

#关闭防火墙与安全功能
[root@dr1 init.d]# systemctl stop firewalld.service
[root@dr1 init.d]# setenforce 0

配置centos7-2

安装ipvsdam、keepalived软件包

[root@dr2 ~]# yum install ipvsdam keepalived -y

修改网卡模式为仅主机并固定IP:192.168.100.77

[root@dr2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO=static

IPADDR=192.168.100.77
NETMASK=255.255.255.0
GATEWAY=192.168.100.1

[root@dr2 ~]# service network restart
Restarting network (via systemctl): [ 确定 ]

[root@dr2 ~]# vim /etc/sysctl.conf
#添加路由转发功能
net.ipv4.ip_forward=1
#proc响应关闭重定向功能
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0

#生效路由转发功能
[root@dr1 ~]# sysctl -p

构建虚拟网卡

[root@dr1 ~]# cd /etc/sysconfig/network-scripts/

[root@dr1 network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0

[root@dr1 network-scripts]# vim ifcfg-ens33:0
#删除原有内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.100
NETWASK=255.255.255.0

#启用虚拟网卡
[root@dr2 ~]# ifup ens33:0

添加服务启动脚本

[root@dr2 ~]# cd /etc/init.d/

[root@dr2 ~]# vim dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.100
RIP1=192.168.100.88
RIP2=192.168.100.99
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting------------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsamd stoped--------------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsamd stoped--------------------[ok]"
;;
status)
if [ ! -e ar/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped--------------------"
exit 1
else
echo "ipvsamd Runing-------------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0

[root@dr2 ~]# chmod +x dr.sh

[root@dr2 ~]# service dr.sh start

[root@dr2 ~]# systemctl status ipvsadm #查看服务开启状态

[root@dr2 ~]# systemctl stop firewalld.service
[root@dr2 ~]# setenforce 0

配置centos7-3

安装httpd软件包

[root@web-1 ~]# yum install httpd -y

修改网卡模式:仅主机并固定IP:192.168.100.88

[root@web-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO=static

IPADDR=192.168.100.88
NETMASK=255.255.255.0
GATEWAY=192.168.100.1

[root@web-1 ~]# service network restart #重启网卡
[root@web-1 ~]# systemctl stop firewalld.service #关闭防火墙
[root@web-1 ~]# setenforce 0

[root@web-1 ~]# systemctl start httpd.service #启动网站服务

创建网站首页

[root@web-1 ~]# cd /var/www/html/
[root@web-1 ~]# echo "this is accp web" > index.html**

创建虚拟网卡

[root@web-1 ~]# cd /etc/sysconfig/network-scripts/
[root@web-1 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web-1 ~]# vim ifcfg-lo:0

#删除原来所有信息,添加以下内容:
DEVICE=Lo:0
IPADDR=192.168.100.100
NETMASK=255.255.255.0
ONBOOT=yes

编写服务启动脚本

[root@web-1 ~]# cd /etc/init.d/
[root@web-1 ~]# vim web.sh #控制服务启动脚本

#!/bin/bash
VIP=192.168.100.100
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
sysctl -p > /dev/null 2>&1
echo "RealServer Start OK "
;;
stop)
ifconfig lo:0 down
route del $VIP /dev/null 2>&1
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0

[root@web-1 ~]# chmod +x web.sh

[root@web-1 ~]# service web.sh start

[root@web-1 ~]# ifup lo:0

在web2节点服务器上查看IP,可以看到虚拟IP就说明没问题:ifconfig

firefox "http://127.0.0.1/" & #直接访问网站

[root@web-1 ~]# service web.sh stop

[root@web-1 ~]# service web.sh start #建议重启服务

配置centos7-4

安装httpd软件包

[root@web-2 ~]# yum install httpd -y

调整网卡模式为仅主机并固定IP:192.168.100.99

[root@web-2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO=static

IPADDR=192.168.100.99
NETMASK=255.255.255.0
GATEWAY=192.168.100.1

[root@web-2 ~]# service network restart #重启网卡
[root@web-2 ~]# systemctl stop firewalld.service #关闭防火墙
[root@web-2 ~]# setenforce 0

[root@web-2 ~]# systemctl start httpd.service
[root@web-2 ~]# systemctl status httpd.service

[root@web-2 ~]# cd /var/www/html/
[root@web-2 ~]# echo "this is benet web" > index.html

[root@web-2 ~]# cd /etc/sysconfig/network-scripts/
[root@web-2 ~]# cp ifcfg-lo ifcfg-lo:0

[root@web-2 ~]# vim ifcfg-lo:0

DEVICE=Lo:0
IPADDR=192.168.100.100
NETMASK=255.255.255.0
ONBOOT=yes

[root@web-2 ~]# cd /etc/init.d/
[root@web-2 ~]# vim web.sh #控制服务启动脚本

#!/bin/bash
VIP=192.168.100.100
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
sysctl -p > /dev/null 2>&1
echo "RealServer Start OK "
;;
stop)
ifconfig lo:0 down
route del $VIP /dev/null 2>&1
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0

[root@web-2 ~]# chmod +x web.sh

[root@web-2 ~]# service web.sh start

#开启虚拟网卡
[root@web-2 ~]# ifup lo:0

firefox "http://127.0.0.1/" & #直接访问网站

#关闭并重启服务
[root@web-2 ~]# service web.sh stop
[root@web-2 ~]# service web.sh start

使用Win7客户端测试

C:\Users\czt>ping 192.168.100.100

正在 Ping 192.168.100.100具有 32 字节的数据:
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64

192.168.100.100 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

LVS-DR与 Keepalived群集_第1张图片

keepalived部署

[root@dr1 ~]# cd /etc/keepalived/

[root@dr1 ~]# vim keepalived.conf

global_defs {
notification_email {br/>[email protected]
[email protected]/>[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1 #指向本地
smtp_connect_timeout 30
router_id LVS_01 #指定名称,备份服务器不同名称,另一台为02
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_instance VI_1 {
state MASTER #备份服务器将MASTER换为BACKUP
interface eth0
virtual_router_id 10 #组号相同
priority 100 #优先级,备小于主
advert_int 1
authentication {
auth_type PASS
auth_pass abc123 #验证密码
}
virtual_ipaddress {
192.168.100.100 #虚拟IP
}
}

virtual_server 192.168.100.100 80 { #虚拟IP及端口号
delay_loop 6
lb_algo rr
lb_kind DR #改为DR
persistence_timeout 50
protocol TCP

real_server 192.168.100.88 80 {              #节点服务器1
    weight 1
    TCP_CHECK {
        connect_port 80
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}

real_server 192.168.100.99 80 {              #节点服务器2
    weight 1
    TCP_CHECK {                     #修改为TCP_CHECK
        connect_port 80              #添加端口
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}

}

#启动keepalived服务
[root@dr1 ~]# systemctl start keepalived.service

使用客户端测试
模拟down掉一台调度服务器,在win7上尝试互联服务器,如果在win7上还能ping通,就说明另一台调度服务器已经接替并开始工作

C:\Users\czt>ping 192.168.100.100

正在 Ping 192.168.100.66 具有 32 字节的数据:
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.100.100 的回复: 字节=32 时间<1ms TTL=64

192.168.100.100 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms