zoukankan      html  css  js  c++  java
  • Keepalived

    Keepalived的高可用

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

    • 健康节点检查
      对本地的Keepalived进行检查:查看主从是否正确,即主服务器失效后,从的Keepalived是否可以使用

    • 主从切换
      主服务器失效后切换从服务器

    #实验:四台机器:10,11,12,14
    #两台需要安装Keepalived,其余两台需要安装web站点
    yum -y install keepalived
    #一般配置文件位于/etc/keepalived/keepalived.conf
    11,12,安装httpd的Apache站点
    systemctl start keeplived #10,14启动keeplived
    ipvsadm -Ln  #查看策略
    ip a  #查看虚拟VIP
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:9f:51:88 brd ff:ff:ff:ff:ff:ff
        inet 192.168.200.10/24 brd 192.168.200.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet 192.168.200.254/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe9f:5188/64 scope link 
           valid_lft forever preferred_lft forever
    #此时10,14都有策略,但是只有10有虚拟VIP
    systemctl stop keepalived  #关闭10
    ip a  #查看14  发现有254虚拟VIP
    #当10重新启动Keepalived时254又回到10,完成漂移
    
    #检查内核脚本
    #!/bin/bash
    SNS_VIP=192.168.9.254
    ZJKID=0
    case "$1" in
    
    start)
            ifconfig lo:$ZJKID $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
            /usr/sbin/route add -host $SNS_VIP dev lo:$ZJKID
            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/all/arp_ignore
            echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
            echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore
            echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
            sysctl -p > /dev/null 2>&1
            echo "RealSsrver Start OK"
            ;;
    stop)
            ifconfig lo:$ZJKID down
            /usr/sbin/route del $SNS_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 "0" > /proc/sys/net/ipv4/conf/default/arp_ignore
            echo "0" > /proc/sys/net/ipv4/conf/default/arp_announce
            echo "RealServer Stoped"
            ;;
    *)
            echo "Usage: $0 {start|stop}"
    exit 1
    esac
    exit 0
    
    • 启动脚本,并且关闭所有防火墙,在浏览器查看254,并且关闭10的Keepalived,再次查看

    Keepalived与nginx的高可用

    • Keepalived与nginx不可以并发使用,当nginx失效时需要通知Keepalived失效装换从服务器
      10中nginx的Keepalived的配置文件
    ! Configuration File for keepalived
    
    global_defs {
       router_id NGINX_HA_R2
       script_user root                     //脚本使用用户
       enable_script_security               //启动脚本安全
    }
    
    vrrp_script chk_nginx {
            script "/opt/check_ng.sh"       //定义脚本路径和名称
            interval 2                      //脚本执行间隔
            weight -15              //降低优先级
            fall 2                  //检测连续2次失败才算失败
            rise 1                  //检测1次成功就算成功
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        #nopreempt
        interface ens33
        virtual_router_id 51
        priority 99
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.200.254
        }
            track_script {
                    chk_nginx
            }
    }
    

    14nginx的Keepalived的配置

    ! Configuration File for keepalived
    
    global_defs {
       router_id NGINX_HA_R1
    }
    
    vrrp_script chk_nginx {
            script "/opt/check_ng.sh"       //定义脚本路径和名称
            interval 2                      //脚本执行间隔
            weight -15              //降低优先级
            fall 2                  //检测连续2次失败才算失败
            rise 1                  //检测1次成功就算成功
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        nopreempt                                            #抢占模式是否开启
        interface ens33
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.200.254
        }
            track_script {
                    chk_nginx
            }
    }
    

    nginx的Keepalived高可用实验

    #启动10,14的Keepalived
    破坏10的nginx,使其失效
    查看14的ip a
    

    脚本

    #!/bin/bash
    #时间变量,用于记录日志
    d=`date --date today +%Y%m%d_%H:%M:%S`
    #计算nginx进程数量
    n=`ps -C nginx --no-heading|wc -l`
    #如果进程为0,则启动nginx,并且再次检测nginx进程数量,
    #如果还为0,说明nginx无法启动,此时需要关闭keepalived
    if [ $n -eq "0" ]; then
                    /usr/local/nginx/sbin/nginx
            n2=`ps -C nginx --no-heading|wc -l`
            if [ $n2 -eq "0"  ]; then
                    echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                    systemctl stop keepalived
            fi
    fi
    
    #配置文件详解
    # 全局配置
    global_defs {
       # 邮件通知信息
       notification_email {
         # 定义收件人
         acassen@firewall.loc
       }
       # 定义发件人
       notification_email_from Alexandre.Cassen@firewall.loc
       # SMTP服务器地址
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
       router_id LVS_DEVEL
       # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
       vrrp_mcast_group4 224.0.0.18
       vrrp_mcast_group6 ff02::12
    }
    
    # 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
    vrrp_script SCRIPT_NAME {
    
    }
    
    # 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
    vrrp_instance VI_1 {
        # 定义初始状态,可以是MASTER或者BACKUP
        state MASTER
        # 工作接口,通告选举使用哪个接口进行
        interface ens33
        # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
        # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
        virtual_router_id 51
        # 使用哪个虚拟MAC地址
        use_vmac XX:XX:XX:XX:XX
        # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
        track_interface {
            eth0
            ens33
        }
        # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
        priority 100
        # 通告频率,单位为秒
        advert_int 1
        # 通信认证机制,这里是明文认证还有一种是加密认证
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
        virtual_ipaddress {
            # IP/掩码 dev 配置在哪个网卡
            192.168.200.16/24 dev eth1
            # IP/掩码 dev 配置在哪个网卡的哪个别名上
            192.168.200.17/24 dev label eth1:1
        }
        # 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
        virtual_routes {
            192.168.110.0/24 dev eth2
        }
        # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
        nopreempt|preempt
        # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
        preempt delay 300
        # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
        track_script {
    
        }
        # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
        notify_master ""
        notify_backup ""
        notify_fault ""
    }
    
    # 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
    # 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
    virtual_server 10.10.10.2 1358 {
        delay_loop 6
        # 算法
        lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
        # LVS的模式
        lb_kind NAT|DR|TUN
        # 子网掩码,这个掩码是VIP的掩码
        nat_mask 255.255.255.0
        # 持久连接超时时间
        persistence_timeout 50
        # 定义协议
        protocol TCP
        # 如果后端应用服务器都不可用,就会定向到那个服务器上
        sorry_server 192.168.200.200 1358
    
        # 后端应用服务器 IP PORT
        real_server 192.168.200.2 1358 {
            # 权重
            weight 1
            # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
            # 针对应用服务器做健康检查的方法
            MISC_CHECK {}
            # 用于检查SMTP服务器的
            SMTP_CHEKC {}
    
            # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
            TCP_CHECK {
              # 向哪一个端口检查,如果不指定默认使用上面定义的端口
              connect_port <PORT>
              # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
              bindto <IP>
              # 连接超时时间
              connect_timeout 3
            }
    
            # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
            SSL_GET {}
    
            # 应用服务器UP或者DOWN,就执行那个脚本
            notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
            notify_down "/PATH/SCRIPTS.sh 参数"
    
            # 使用HTTP_GET方法去检查
            HTTP_GET {
                # 检测URL
                url { 
                  # 具体检测哪一个URL
                  path /testurl/test.jsp
                  # 检测内容的哈希值
                  digest 640205b7b0fc66c1ea91c463fac6334d
                  # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
                  status_code 200
                }
                url { 
                  path /testurl2/test.jsp
                  digest 640205b7b0fc66c1ea91c463fac6334d
                }
                url { 
                  path /testurl3/test.jsp
                  digest 640205b7b0fc66c1ea91c463fac6334d
                }
                # 向哪一个端口检查,如果不指定默认使用上面定义的端口
                connect_port <PORT>
                # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
                bindto <IP>
                # 连接超时时间
                connect_timeout 3
                # 尝试次数
                nb_get_retry 3
                # 每次尝试之间间隔几秒
                delay_before_retry 3
            }
        }
    
        real_server 192.168.200.3 1358 {
            weight 1
            HTTP_GET {
                url { 
                  path /testurl/test.jsp
                  digest 640205b7b0fc66c1ea91c463fac6334c
                }
                url { 
                  path /testurl2/test.jsp
                  digest 640205b7b0fc66c1ea91c463fac6334c
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }
    
  • 相关阅读:
    P1744 采购特价商品
    P1359 租用游艇
    P3092 [USACO13NOV]没有找零No Change
    P1272 重建道路
    P2014 选课
    P1026 统计单词个数
    P1776 宝物筛选_NOI导刊2010提高(02)
    自定义异步非阻塞tornado框架
    tornado进阶篇
    tornado基础篇
  • 原文地址:https://www.cnblogs.com/wml3030/p/15371936.html
Copyright © 2011-2022 走看看