Keepalived实现IP地址主备模式转换

Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Keepalived的目的是模拟路由器的高可用,一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。
提到高可用我们再来把Heartbeat、Corosync、Keepalived这三个集群组件互相比较一下.
Keepalived实现IP地址主备模式转换_第1张图片
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的准备模式转换

你可能感兴趣的:(Keepalived实现IP地址主备模式转换)