Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Keepalived的目的是模拟路由器的高可用,一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。
提到高可用我们再来把Heartbeat、Corosync、Keepalived这三个集群组件互相比较一下.
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
在路由器上配上静态路由就会产生单点故障,那该怎么办呢?VRRP就应用而生了,VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器.
VRRP工作原理, 在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER拥有一些特权,比如,拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。
VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由 器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对客户端来说,这种主从的切换是透明的。
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP通告信息(VRRPAdvertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到通告信息), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,VRRP包使用了加密协议进行加密
:为什么要用keepalived+lvs
lvs是一个在四层上实现后端realserver的负载均衡的集群,lvs遗留下两个问题,一个是lvs的单点故障;第二个是lvs不能检测后端realserver的健康状态检查。
解决lvs的单点故障就用到了高可用集群:
1.可以是heartbeat+ldirectord这种重量级的;
2.可以是keepalived+lvs这种轻量级的解决方案。
解决lvs不能检测后端realserver的健康状态也后很多种方法:
1.可以在lvs上写脚本ping后端realserver的ip地址,ping几次发现ip地址ping不通则在ipvs规则里面删除,
当后端服务器可以ping了,则把后端realserver添加到ipvs规则里面。
2.可以在lvs上写脚本请求后端realserver的测试几次网页文件,查看状态码是否为200,不是则在ipvs规则里面清楚,
当测试网页返回的状态吗是200之后,则把后端realserver添加到ipvs规则里面
以上两种方法都是依赖于脚本,keepalived的出现解决了不依赖于脚本,也可以对后端realserver的健康状态检查,keepalived的配置文件里面可以自行
生成ipvs的规则,并且自行检测后端realserver的状态,当后端realserver不能提供服务了,keepalived会自行将其在ipvs规则里面删除,
当后端realserver可以提供服务了,又自行的在ipvs规则里面添加。
实现主从模式IP地主转换
[root@node1 ~]#sentos7 172.18.70.40 主
[root@node2 ~]#sentos7 172.18.70.50 备
互相名字解析便于控制
[root@node1 ~]#vim /etc/hosts
172.18.70.50 node2
[root@node2 ~]#vim /etc/hosts
172.18.70.40 node1
修改同步时间,node1,node2
[root@node1 ~]#ntpdate 172.18.0.1 先同步
[root@node1 ~]#vim /etc/chrony.conf 后修改配置,配置文件是在时间出不多的情况下同步
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 172.18.0.1 iburst 网络ip同步时间
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
[root@node1 ~]#systemctl is-enabled chronyd 查询是否开机启动时间
[root@node1 ~]#systemctl enable chronyd 开机启动
免密码登录 ,安装包,备份配置文件,生成随机口令
[root@node1 ~/.ssh]#ssh-keygen 免密码登录
[root@node1 ~]#cd .ssh
[root@node1 ~/.ssh]#ssh-copy-id -i id_rsa.pub node2: 第一次要输入口令
[root@node2 ~]#ssh-keygen
[root@node2 ~/.ssh]#ssh-copy-id node1:
[root@node1 ~]#yum install ipvsadm keepalived 安装包
[root@node2 ~]#yum install ipvsadm keepalived
[root@node1 /etc/keepalived]#cp keepalived.conf{,.bak} 备份
[root@node1 ~]#openssl rand -hex 4 随机口令
dd2edd1d
修改node1 keepalived配置(全局配置段和主机配置段)
[root@node1 /etc/keepalived]#vim keepalived.conf
global_defs {
notification_email {
root@localhost 邮箱
}
notification_email_from node1@localhost 发件邮箱
smtp_server 172.18.0.1 邮件发送地址
smtp_connect_timeout 30 超时时长
router_id node1 主机名
vrrp_mcast_group4 224.100.100.100 多播地址
}
vrrp_instance VI_1 { vrrp实例 多个实例需要再复制
state MASTER 主
interface ens33 网卡
virtual_router_id 88 集群组
priority 100 优先级
advert_int 1 发送间隔
authentication {
auth_type PASS
auth_pass dd2edd1d 随机口令
}
virtual_ipaddress {
172.18.70.100/16 dev ens33 vip地址
}
}
修改node2 keepalived配置(全局配置段和备机配置段)
[root@node2 /etc/keepalived]#vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
[email protected]
[email protected]
}
notification_email_from node1@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node2 主机2
vrrp_mcast_group4 224.100.100.100
}
vrrp_instance VI_1 {
state BACKUP 备
interface ens33
virtual_router_id 88
priority 90 优先级要比主低
advert_int 1
authentication {
auth_type PASS
auth_pass dd2edd1d
}
virtual_ipaddress {
172.18.70.100/16 dev ens33
[root@node1 /etc/keepalived]#systemctl restart keepalived.service 启动服务 发通告100
[root@node1 ~]#ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:67:33:0e brd ff:ff:ff:ff:ff:ff
inet 172.18.70.40/16 brd 172.18.255.255 scope global ens33 启动服务后vip地址自动绑定在主机器node1ip上
valid_lft forever preferred_lft forever
inet 172.18.70.100/16 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe67:330e/64 scope link
valid_lft forever preferred_lft forever
[root@node1 /etc/keepalived]#tcpdump -i ens33 -nn host 224.100.100.100 抓包 可以看到node1在发广播,88di虚拟器的地址,100优先级
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
21:40:59.250327 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
21:41:00.260083 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
21:41:01.261505 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
21:41:02.263420 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
21:41:03.264706 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
[root@node2 /etc/keepalived]#systemctl restart keepalived.service node2开启服务 没有发通告90
[root@node1 /etc/keepalived]#systemctl stop keepalived node1关闭服务 在查看抓包状态
[root@node1 /etc/keepalived]#tcpdump -i ens33 -nn host 224.100.100.100 可以看到node1机器中断为0后node2机器马上接管服务
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
22:06:18.805795 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
22:06:19.806961 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 100, authtype simple, intvl 1s, length 20
22:06:20.767973 IP 172.18.70.40 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 0, authtype simple, intvl 1s, length 20
22:06:21.419400 IP 172.18.70.50 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 90, authtype simple, intvl 1s, length 20
22:06:22.421297 IP 172.18.70.50 > 224.100.100.100: VRRPv2, Advertisement, vrid 88, prio 90, authtype simple, intvl 1s, length 20
224.100.100.100: 多播模式
[root@node2 /etc/keepalived]#ip a MULTICAS多播模式
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:36:e6:7c brd ff:ff:ff:ff:ff:ff
inet 172.18.70.50/16 brd 172.18.255.255 scope global ens33
valid_lft forever preferred_lft forever
inet 172.18.70.100/16 scope global secondary ens33 node1关闭服务后VIP地址自动转到了node2机器上面
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe36:e67c/64 scope link
已经实现IP的准备模式转换