美文网首页
keepalived

keepalived

作者: fengkaipeng | 来源:发表于2017-09-05 18:00 被阅读12次

    keepalved是一个高可用软件,一般用来解决集群中调度器的单点出问题的,实现集群高可用。他还又个功能就是能对LVS集群中的节点进行健康状态检测,实现节点故障时移除,节点恢复时自动加入。
    下面我们来实现双主模型的LVS高可用集群和双主模式的nginx高可用集群。

    LVS双主模型高可用集群

    这里我们使用lvs的dr模式来做调度,调度算法使用rr模式方便测试。
    1.环境(网卡均为eth0):
    保证集群中每台服务器的时间时相同的,用ntpdate可以同步,然后关闭selinux和iptables。

    • 虚拟ip为172.16.200.200和172.16.200.222(双主模型,所以需要两个虚拟ip)
    • 两台调度器ip地址分别为172.16.200.101和172.16.200.102
    • 两台节点ip地址为172.16.200.103和172.16.200.104
      2.配置节点服务器,设置arp响应级别和虚拟ip,将这些配置写到一个脚本中,方便管理,如下(注意,这里要实现双主模型,而且是DR模型,所以节点主机和调度器的vip要一致,而双主模型需要两个前端的虚拟IP,所以节点主机也需要配置两个VIP):
      在两个节点的/root目录下,创建文件lvs.sh,然后写入脚本
    [root@localhost ~]# vim lvs.sh
    #!/bin/bash
    vip=172.16.200.222
    vip2=172.16.200.100
    mask=255.255.255.255
    iface="lo:0"
    iface2="lo:1"
    case $1 in 
    start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        
        ifconfig $iface $vip netmask $mask broadcast $vip up
        ifconfig $iface2 $vip2 netmask $mask broadcast $vip2 up
        route add -host $vip dev $iface 
        route add -host $vip2 dev $iface2 
        ;;
    stop)
        ifconfig $iface down
        ifconfig $iface2 down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        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_announce
        ;;
    *)
        echo "Usage: $(basename $0) start|stop"
        ;;
    esac
    
    [root@localhost ~]# bash lvs.sh start    #执行脚本,加上start参数
    

    执行完成后可以用ip a l命令来查看两个虚拟ip有没有创建成功。
    3.在两台调度器上执行如下操作:

    [root@localhost ~]# yum -y install keepalived nginx    #安装keepalived和nginx
    [root@localhost ~]#  echo "sorry form 172.16.200.101" > /usr/share/nginx/html/index.html    #这里安装nginx是为了实现sorry服务器,当节点都出问题时,调度器的nginx会放回echo的内容。调度器2上echo的是 172.16.200.102,这样方便区分是由哪个调度器工作的
    [root@localhost ~]# service nginx start
    [root@localhost ~]# ifconfig eth0:0 172.16.200.222 netmask 255
    .255.255.255 broadcast 172.16.200.222 up    #在eth0上添加vip
    

    我们可以先装个ipvsadm,手动配置lvs来测试以下,合适了再去配置keepalived

    [root@localhost ~]# yum -y install ipvsadm
    [root@localhost ~]# ipvsadm -A -t 172.16.200.222:80 -s rr
    [root@localhost ~]# ipvsadm -a -t 172.16.200.222:80 -r 172.16.200.103 -g
    [root@localhost ~]# ipvsadm -a -t 172.16.200.222:80 -r 172.16.200.104 -g
    

    然后访问172.16.200.222就可以调度到后端的两个节点提供服务,使用for i in {1..10};do curl http://172.16.200.222;done,就会发现103和104交替出现。 ,将这个调度器的vip删除,在另一台节点上同样上述操作,验证时候需要在客户端先arp -d 172.16.200.222`将自己的arp缓存删除,不然还是会去找之前的调度器的。
    测试成功后,我们就可以去部署keepalived了:
    首先,将ipvsadm手动做的lvs先清空,这样才会不影响keepalived配置,如下:

    [root@localhost ~]# ifconfig eth0:0 down
    [root@localhost ~]# ipvsadm -C
    

    然后配置keepliaved:
    我们先来实现lvs的dr模式,使用主备模式

    [root@localhost ~]# vim /etc/keepalived/keepalived.conf
    #配置文件中有很多virtual_server段,我们只保留第一个,剩下的给注释了就行
    #下面分别为调度器1和调度器2的配置
    
    调度器1的配置文件
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        feng@mageedu.com
       }
       notification_email_from admin@mageedu.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node1
       vrrp_mcast_group4 224.16.120.18
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 16
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.16.200.222
        }
    }
    
    virtual_server 172.16.200.222 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        nat_mask 255.255.0.0
        protocol TCP
        sorry_server 127.0.0.1 80
        real_server 172.16.200.103 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
        real_server 172.16.200.104 80 {
                weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }
    vrrp_instance VI_2 {
        state BACKUP
        interface eth0
        virtual_router_id 61
        priority 95
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.16.200.100
        }
    }
    
    virtual_server 172.16.200.100 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        nat_mask 255.255.0.0
        protocol TCP
        sorry_server 127.0.0.1 80
        real_server 172.16.200.103 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
        real_server 172.16.200.104 80 {
                weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }
    
    
    
    
    第二台调度器配置如下
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        feng@mageedu.com
       }
       notification_email_from admin@mageedu.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node2
       vrrp_mcast_group4 224.16.120.18
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 16
        priority 95
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.16.200.222
        }
    }
    
    virtual_server 172.16.200.222 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        nat_mask 255.255.0.0
        protocol TCP
        sorry_server 127.0.0.1 80
        real_server 172.16.200.103 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 1
            }
         }
        real_server 172.16.200.104 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 1
            }
        }
    }
    vrrp_instance VI_2 {
        state MASTER
        interface eth0
        virtual_router_id 61
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.16.200.100
        }
    }
    
    virtual_server 172.16.200.100 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        nat_mask 255.255.0.0
        protocol TCP
        sorry_server 127.0.0.1 80
        real_server 172.16.200.103 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 1
            }
         }
        real_server 172.16.200.104 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
            status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 1
            }
        }
    }
    

    完成后在将两个调度器中的keepalived都启动(注意keepalived不能重启,有时候配置会不生效,所以如果之前已经启动了,那么关闭后在启动)

    [root@localhost ~]# service keepalived start
    

    测试:
    在测试主机上修改/etc/hosts文件,添加如下内容

    172.16.200.100 www.feng.com
    172.16.200.222 www.feng.com
    

    然后用一个小循环来测试:

    [root@localhost named]# for i in {1..10};do curl www.feng.com ;done
    

    返回结果为172.16.200.103和172.16.200.104交替出现,实验成功

    nginx双主模型高可用集群

    1.在两台调度器上,设置nginx服务配置文件,这里使用的nginx版本为1.10.2,所以配置文件可能有点细微差别

    [root@localhost ~]# vim /etc/nginx/nginx.conf
    在http上下文中定义组
     upstream webapp {
            server 172.16.200.103;
            server 172.16.200.104;
    }
    [root@localhost ~]# vim /etc/nginx/conf.d/test.conf    #注意:先将默认的default去掉,要不测试会报错
    server {
            listen 80 default;
            server_name www.feng.com;
            location / {
                    proxy_pass http://webapp;
            }
    }
    [root@localhost ~]# nginx -t
    [root@localhost ~]# nginx -s reload
    

    2.在两台调度器上,修改keepalived配置文件:
    先将vrrp_instance VI_1和vrrp_instance VI_2这两个上下文中的virtual_server先注释掉(virtual_server就是lvs的配置段,注释掉以防和nginx段冲突)
    然后在global段之下(注意,这里一定要放在global段下面,不然不会生效,而且空格一定只是一个,这个对格式的要求很严格的,一个不慎就不能实现了)定义nginx检测功能,这段的意思就是当检测到nginx服务不存在时,就将这个调度器的权重减去10,注意减去的权重不能小于主和备的差,不然减去之后主调度器的权重还是表备用的高,如下:

    vrrp_script chk_nginx {
            script "killall -0 nginx"
            interval 2
            weight -10
            fall 2
            rise 2
           }
    

    然后在两个vrrp_instance中,都调用nginx检测功能:
    在vrrp_instance VI_1和2中都加入这段内容

     track_script {
            chk_nginx
            }
    

    然后关闭keepalived,再启动,还是用之前的测试主机,使用for i in {1..10};do curl www.feng.com;done来测试,两个ip交替出现证明实验成功

    相关文章

      网友评论

          本文标题:keepalived

          本文链接:https://www.haomeiwen.com/subject/zlaejxtx.html