Keepalived 高可用集群实践

keepalived介绍

   Keepalived是一个基于vrrp协议的高可用方案,vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务。实现一个双机热备高可用功能,检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

vrrp协议

VRRP是一种容错协议,它通过把几台路由设备联合组成一台虚拟的路由设备,并通过一定的机制来保证当主机的下一跳设备出现故障时,可以及时将业务切换到其它设备,从而保持通讯的连续性和可靠性。

 

vip漂移实验

需求:实现VIP自动漂移的高可用环境。这种模式下,vip附属于在master的机器上,当master机器出现故障,自动把vip漂移到backup机器上;继续提供服务。

 

资源列表

master: 172.17.5.242 centos6.9

backup: 172.17.5.241 centos6.6

对外提供访问的IP: VIP 172.17.6.100

 安装

MASTER和BACKUP都是一样,使用yum 安装

[root@master ~]# yum install -y keepalived

#修改配置文件

[root@master ~]# > /etc/keepalived/keepalived.conf
[root@master ~] vim /etc/keepalived/keepalived.conf

清空原来的配置文件;把下面的配置文件分别黏贴到MASTER和BACKUP上面去。

MASTER的配置文件如下:
! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_01  #keepalived服务器路由表示;局域网内唯一
}

vrrp_instance VI_1 {      # 实例名称
    state MASTER          # 实例的角色;只有MASTER和BACKUP两种。都是大写
    interface eth0        # 通讯的网卡,要注意区分 VIP的ip的网卡
    virtual_router_id 51  # 虚拟路由ID 跟BACKUP的一样。
    priority 150          # 优先级,数字越大越优先
    advert_int 1          # 与BACKUP通信间隔时间,默认1S
    authentication {
        auth_type PASS    #权限认证;官方推荐PASS密码方式,与BACKUP一样。
        auth_pass 1111    #明文密码。与BACKUP一样
    }
    virtual_ipaddress {  虚拟IP,即VIP地址;绑定接口eth0 别名是:eth0:1
        172.17.6.100/21 dev eth0 label eth0:1
    }
}

BACKUP的配置文件如下:
! 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 192.168.200.1
     smtp_connect_timeout 30
     router_id LVS_02  #keepalived服务器路由表示;局域网内唯一;与MASTER不同
 }

  vrrp_instance VI_1 {      # 实例名称
      state BACKUP          # 实例的角色;只有MASTER和BACKUP两种。都是大写
      interface eth0        # 通讯的网卡,要注意区分 VIP的ip的网卡
      virtual_router_id 51  # 虚拟路由ID 跟BACKUP的一样。
      priority 100          # 优先级,数字越大越优先;低于MASTER
      advert_int 1          # 与BACKUP通信间隔时间,默认1S
      authentication {
          auth_type PASS    #权限认证;官方推荐PASS密码方式,与BACKUP一样。
          auth_pass 1111    #明文密码。与BACKUP一样
      }
      virtual_ipaddress {  虚拟IP,即VIP地址;绑定接口eth0 别名是:eth0:1
          172.17.6.100/21 dev eth0 label eth0:1
      }
  }

留意MASTER与BACKUP上的配置文件差异。

注意:特别要留意配置文件的内容是否有错误,keepalived没有配置文件检测功能,启动并不会报错。

 

配置文件完成后,启动服务

[root@master ~] /etc/init.d/keepalived start #启动

master查看是否有虚拟ip

[root@master ~]# 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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:15:5d:02:18:1a brd ff:ff:ff:ff:ff:ff
    inet 172.17.5.242/21 brd 172.17.7.255 scope global eth0
    inet 172.17.6.100/21 scope global secondary eth0:1
    inet6 fe80::215:5dff:fe02:181a/64 scope link
       valid_lft forever preferred_lft forever
   

查看进程

[root@master ~]# ps aux|grep keepalived
root     49936  0.0  0.0 110292  1380 ?        Ss   16:22   0:00 /usr/sbin/keepalived -D
root     49937  0.0  0.0 114592  3044 ?        S    16:22   0:00 /usr/sbin/keepalived -D
root     49938  0.0  0.0 114468  2304 ?        S    16:22   0:00 /usr/sbin/keepalived -D
root     50072  0.0  0.0 103324   896 pts/1    S+   16:23   0:00 grep keepalived

看到了进程,看到了虚拟ip表明keepalived服务正常

测试

1.在master 关掉keepalived服务。在backup上查看是否有虚拟ip

2. master 启动后,虚拟ip是否能漂移回来。

 

解决高可用只针对物理服务器的问题

  默认的情况下,keepalived软件仅仅在对方机器宕机或是keepalived停止服务的时候,才会接管服务。但是在实际的工作中,例如 web服务挂掉了而keepalived还在正常工作,这就会导致用户访问vip的时候就找不到对应的服务。对于这个问题我们怎么处理呢?
第一个方法,写守护脚本处理,当nginx业务有问题的时候,自动停止本地的keepalived服务,让IP自动漂移到对端。继续接管服务。
脚本如下:
[root@master src]# cat /usr/local/src/check_nginx.sh
#!/bin/bash

while true
  do
   if [ `netstat -lnpt|grep nginx|wc -l` -ne 1 ];then
     /etc/init.d/keepalived stop
   fi
    sleep 5
 done
脚本的运行思想是检测有没有nginx服务的80端口。没有就停止掉keepalived;脚本写在MASTER上。
 
启动脚本 后台运行
[root@master src]# sh /usr/local/src/check_nginx.sh &
 
停止掉nginx服务,在BACKUP上查看vip是否飘移了。 访问web网页内容
[root@master src]# /etc/init.d/nginx stop
 
第二个方法
可以使用keepalived的配置文件参数触发写好的检测服务脚本。
监测服务脚本如下:
[root@master src]# cat chk_nginx_proxy.sh
#!/bin/bash

   if [ `netstat -lnpt|grep nginx|wc -l` -ne 1 ];then
     /etc/init.d/keepalived stop
   fi
此时MASTER上的keepalived的配置文件如下:
! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_01  #keepalived服务器路由表示;局域网内唯一
}


vrrp_script chk_nginx_proxy {
 script "/usr/local/src/chk_nginx_proxy.sh"
 interval 2
 weight 2
}


vrrp_instance VI_1 {      # 实例名称
    state MASTER          # 实例的角色;只有MASTER和BACKUP两种。都是大写
    interface eth0        # 通讯的网卡,要注意区分 VIP的ip的网卡
    virtual_router_id 51  # 虚拟路由ID 跟BACKUP的一样。
    priority 150          # 优先级,数字越大越优先
    advert_int 1          # 与BACKUP通信间隔时间,默认1S
    authentication {
        auth_type PASS    #权限认证;官方推荐PASS密码方式,与BACKUP一样。
        auth_pass 1111    #明文密码。与BACKUP一样
    }
    virtual_ipaddress {  虚拟IP,即VIP地址;绑定接口eth0 别名是:eth0:1
        172.17.6.100/21 dev eth0 label eth0:1
    }

 track_script {
  chk_nginx_proxy
 }

}

 

测试接管结果;MASTER 上测试
[root@master src]# netstat -lntp|grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      49271/nginx
[root@master src]# /etc/init.d/keepalived status
keepalived (pid  49293) 正在运行...
[root@master src]# ip add|grep 172.17.6.100
    inet 172.17.6.100/21 scope global secondary eth0:1
[root@master src]# service nginx stop
停止 Nginx:                                               [确定]
[root@master src]# ip add|grep 172.17.6.100
[root@master src]# /etc/init.d/keepalived status
keepalived 已停

 

SLAVE 上查看ip是否产生了飘移
[root@slave ~]# ip addr |grep 172.17.6.100
    inet 172.17.6.100/21 scope global secondary eth0:1
至此,keepalived服务搭建完成。
 

 

 

原文地址:https://www.cnblogs.com/zyos/p/7111643.html