zoukankan      html  css  js  c++  java
  • 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服务搭建完成。
     

     

     

  • 相关阅读:
    观察者模式(学习笔记17)
    web前端安全编码(模版篇)
    如何获取元素最终使用的css值
    Range在各浏览器下的问题和常见处理办法
    总结cookie的一些问题
    js 设计模式单例模式
    web端不能登录问题汇总
    多域名登录方案思考
    深入分析js中的constructor 和prototype
    由一次代码优化想到的Js 数据类型
  • 原文地址:https://www.cnblogs.com/zyos/p/7111643.html
Copyright © 2011-2022 走看看