zoukankan      html  css  js  c++  java
  • Keepalived高可用集群应用

    一、Keepalived相关介绍

    1、Keepalived简介

     Keepalived软件起初是专门为LVS负载均衡软件设计的用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。

     Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写.VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived一方面具有配置管理LVS功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

     Keepalived软件的官网为 http://www.keepalived.org 。

    2、Keepalived服务功能

     1. 管理LVS负载均衡

     2. 实现对LVS集群节点健康检查功能

     3. 作为系统网络服务的高可能功能

    3、Keepalived高可用故障切换转移原理

     Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的;在Keepalived正常工作时,主Master节点会不断地向备Backup节点发送(多播的方式)心跳信息,当主节点发生故障时,就无法发送心跳信息,备节点也就因此无法继续检测到来自主机点的心跳了,于是调用自身的接管程序,接管主节点的IP资源及服务,而当主节点恢复时,备节点又会释放接管的IP资源及服务,恢复到原来的备用角色。

    4、Keepalived配置文件介绍

     1. 全局定义部分

     1 global_defs {
     2    notification_email {        #设置警报邮箱
     3      acassen@firewall.loc    #邮箱信息
     4      failover@firewall.loc
     5      sysadmin@firewall.loc
     6    }
     7    notification_email_from Alexandre.Cassen@firewall.loc    #设置发件人地址
     8    smtp_server 192.168.200.1        #设置smtp server地址
     9    smtp_connect_timeout 30          #设置smtp超时连接时间
    10    router_id LVS_DEVEL                 #路由或主机标识,注意唯一性
    11    vrrp_mcast_group4 224.100.100.100   #多播地址,不设置默认为224.0.0.18
    12 }

     2. vrrp实例定义区块

     1 vrrp_instance VI_1 {      #VRRP实例定义区块名字是VI_1
     2     state MASTER          #表示当前实例VI_1的角色状态,MASTER或BACKUP
     3     interface eth0        #对外提供服务的网络接口
     4     virtual_router_id 51  #虚拟路由ID唯一标识,范围0-255,主备两台服务器此处ID要相同
     5     priority 100          #优先级 范围1-254,越大越优先
     6     advert_int 1          #为同步通知间隔,主备之间通信检查的时间间隔,默认为1秒
     7     authentication {      #认证机制,同一实例主备认证密码要相同
     8         auth_type PASS    #认证类型,有PASS与HA两种
     9         auth_pass 1111    #密码,最长不超过8位
    10     }
    11     virtual_ipaddress {   #虚拟IP地址
    12         192.168.200.16    #此格式ip a显示 ifconfig不显示
    13         192.168.200.17/24 dev eth0 label eth0:1    #绑定接口为eth0,别名为eth0:1
    14     }
    15 }

     3. 虚拟服务器定义部分

     1 virtual_server 10.10.10.2 80 {   #设置虚拟服务器,指定虚拟IP和端口
     2     delay_loop 6             #健康检查时间为6秒
     3     lb_algo rr               #设置负载调度算法 rr|wrr|sh|dh|lc|wlc|lblc|lblcr|sed|nq 
     4     lb_kind NAT              #设置负载均衡机制 有NAT,TUN和DR三种模式
     5     persistence_timeout 50   #持久连接时长,50秒无响应则重新分配节点
     6     protocol TCP             #服务协议,仅支持tcp
     7 
     8     sorry_server 127.0.0.1 80    #所有RS故障时,备用服务器的地址
     9 
    10     real_server 192.168.200.2 80 {  #RS1节点 
    11         weight 1      #权重
    12         HTTP_GET {    #节点健康检测,应用层检测HTTP_GET|SSL_GET,传输层检测TCP_CHECK
    13             url {
    14               path /testurl/test.jsp  #定义要监控的URL
    15               status_code 200         #判断上述检测机制为健康状态的响应码
    16               digest 640205b7b0fc66c1ea91c463fac6334d  #判断为健康状态的响应内容校验码
    17             }
    18             connect_timeout 3      #请求连接超时时长
    19             nb_get_retry 3         #重试次数
    20             delay_before_retry 3   #重试之前的延迟时长
    21         }
    22     }
    23 
    24     real_server 192.168.200.3 80 {  #RS2节点
    25         weight 1
    26         HTTP_GET {
    27             url {
    28               path /testurl/test.jsp
    29               status_code 200 
    30               digest 640205b7b0fc66c1ea91c463fac6334c
    31             }
    32             connect_timeout 3
    33             nb_get_retry 3
    34             delay_before_retry 3
    35         }
    36     }
    37 }
    1 #传输层检测 TCP_CHECK 
    2 TCP_CHECK {
    3 connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
    4 connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
    5 bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址
    6 bind_port <PORT>:发出健康状态检测请求时使用的源端口
    7 connect_timeout <INTEGER>:连接请求的超时时长
    8 }

     4. 脚本的调用方法

    1 #在vrrp_instance VI_1 语句块最后面加下面行
    2 notify_master "/etc/keepalived/notify.sh master"
    3 notify_backup "/etc/keepalived/notify.sh backup"
    4 notify_fault "/etc/keepalived/notify.sh fault"
    #!/bin/bash
    #
    contact='root@localhost' 
    
    notify() {
        mailsubject="$(hostname) to be $1, vip floating"
        mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" 
        echo "$mailbody" | mail -s "$mailsubject" $contact
    }
    
    case $1 in
    master)
        notify master
        ;; 
    backup)
        notify backup
        ;;
    fault)
        notify fault
        ;; 
    *)
        echo "Usage: $(basename $0) {master|backup|fault}" exit 1
        ;;
    esac
    通知脚本示例 

    二、相关配置实验

    1、Keepalived单主配置实现

     系统:CentOS7.6

     主机:两台,一台主节点(192.168.214.27),一台备节点(192.168.214.37),VIP(192.168.214.100)

     软件包:keepalived(光盘yum源)

     (1) 两台主机分别安装keepalived

    [root@centos7-27 ~]# yum install -y keepalived
    [root@centos7-37 ~]# yum install -y keepalived

     (2) 主Master节点配置

    [root@centos7-27 ~]# cp /etc/keepalived/keepalived.conf{,.bak}   #备份
    [root@centos7-27 ~]# vim /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         admin@localhost
       }
       notification_email_from keepalive@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node1
       vrrp_mcast_group4 224.100.100.100
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 66
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.214.100/16 dev eth0 label eth0:1
        }
    } 

     (3) 备Backup节点配置

    [root@centos7-37 ~]# cp /etc/keepalived/keepalived.conf{,.bak}
    [root@centos7-37 ~]# vim /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         admin@localhost
       }
       notification_email_from keepalive@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node2     #此处修改
       vrrp_mcast_group4 224.100.100.100
    }
    
    vrrp_instance VI_1 {
        state BACKUP    #此处修改
        interface eth0
        virtual_router_id 66   
        priority 80     #此处修改
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.214.100/16 dev eth0 label eth0:1
        }
    }

     (4) 启动keepalived,然后进行测试

    [root@centos7-27 ~]# systemctl start keepalived
    [root@centos7-37 ~]# systemctl start keepalived
    [root@centos7-27 ~]# ip a|grep 192.168.214.100    #可以看到VIP绑在主节点上
        inet 192.168.214.100/16 scope global secondary eth0:1
    [root@centos7-37 ~]# ip a|grep 192.168.214.100
    [root@centos7-27 ~]# systemctl stop keepalived   #在主节点上关闭keepalived
    [root@centos7-27 ~]# ip a|grep 192.168.214.100    #主节点已无VIP
    [root@centos7-37 ~]# ip a|grep 192.168.214.100    #可以看到VIP已漂移至备节点
        inet 192.168.214.100/16 scope global secondary eth0:1

    2、Keepalived双主备配置实现

     系统:CentOS7.6

     主机:两台,一台主节点(192.168.214.27),一台备节点(192.168.214.37),VIP1(192.168.214.100),VIP2(192.168.214.200)

     软件包:keepalived(光盘yum源)

     (1) 两台主机分别安装keepalived

    [root@centos7-27 ~]# yum install -y keepalived
    [root@centos7-37 ~]# yum install -y keepalived

     (2) 主Master节点配置

    [root@centos7-27 ~]# vim /etc/keepalived/keepalived.conf
    [root@centos7-27 ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         admin@localhost
       }
       notification_email_from keepalive@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node1
       vrrp_mcast_group4 224.100.100.100
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 66
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.214.100/16 dev eth0 label eth0:1
        }
    }
    
    vrrp_instance VI_2 {    #添加实例VI_2
        state BACKUP    #第二个实例为备节点
        interface eth0
        virtual_router_id 88   #另一个虚拟路由ID
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 654321
        }
        virtual_ipaddress {
            192.168.214.200/16 dev eth0 label eth0:2  #VIP2
        }
    } 

     (3) 备Backup节点配置

    [root@centos7-37 ~]# vim /etc/keepalived/keepalived.conf
    [root@centos7-37 ~]# cat /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         admin@localhost
       }
       notification_email_from keepalive@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node2
       vrrp_mcast_group4 224.100.100.100
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 66
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.214.100/16 dev eth0 label eth0:1
        }
    }
    
    vrrp_instance VI_2 {   #添加实例VI_2
        state MASTER    #修改此处
        interface eth0
        virtual_router_id 88   #修改此处
        priority 100    #修改此处
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 654321
        }
        virtual_ipaddress {
            192.168.214.200/16 dev eth0 label eth0:2    #VIP2
        }
    } 

     (4) 重启keepalived服务,然后进行测试

    [root@centos7-27 ~]# systemctl restart keepalived
    [root@centos7-37 ~]# systemctl restart keepalived
    #正常情况下,VIP1在主节点上,VIP2在备节点上
    [root@centos7-27 ~]# ip a|grep -E "192.168.214.100|192.168.214.200"
        inet 192.168.214.100/16 scope global secondary eth0:1
    [root@centos7-37 ~]# ip a|grep -E "192.168.214.100|192.168.214.200"
        inet 192.168.214.200/16 scope global secondary eth0:2
    #现在关闭主节点的keepalived服务,VIP1与VIP2应该都在备节点上
    [root@centos7-27 ~]# systemctl stop keepalived
    [root@centos7-27 ~]# ip a|grep -E "192.168.214.100|192.168.214.200"  #主节点无VIP1了
    [root@centos7-37 ~]# ip a|grep -E "192.168.214.100|192.168.214.200"  #都在备节点上了
        inet 192.168.214.200/16 scope global secondary eth0:2
        inet 192.168.214.100/16 scope global secondary eth0:1
    #现在启动主节点的keepalived服务,看是否回归正常
    #以下可以看到是正常的了
    [root@centos7-27 ~]# systemctl start keepalived
    [root@centos7-27 ~]# ip a|grep -E "192.168.214.100|192.168.214.200"
        inet 192.168.214.100/16 scope global secondary eth0:1
    [root@centos7-37 ~]# ip a|grep -E "192.168.214.100|192.168.214.200"
        inet 192.168.214.200/16 scope global secondary eth0:2

    3、Keepalived+LVS配置实现

     系统:CentOS7.6

     主机:四台

      两台keepalived主备:一台主节点(192.168.214.27/16),一台备节点(192.168.214.37/16),VIP1(192.168.214.100)

      两台RS服务器:RS1 (192.168.214.47/16),RS2 (192.168.214.57/16)

     软件包:keepalived,ipvsadm,httpd(光盘yum源)

     (1) 两台keepalived服务器安装 keepalived,ipvsadm服务

    [root@centos7-27 ~]# yum install -y keepalived ipvsadm
    [root@centos7-37 ~]# yum install -y keepalived ipvsadm

     (2) 配置keepalived主备及RS服务器

    [root@centos7-27 ~]# cp /etc/keepalived/keepalived.conf{,.bak}
    [root@centos7-27 ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node1
       vrrp_mcast_group4 224.100.100.100
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 66
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.214.100/32 dev eth0 label eth0:1
        }
    }
    
    virtual_server 192.168.214.100 80 {   #虚拟服务器
        delay_loop 6
        lb_algo wrr 
        lb_kind DR
        protocol TCP
    
        sorry_server 127.0.0.1 80
    
        real_server 192.168.214.47 80 {  #RS1
            weight 1
            HTTP_GET {
                url { 
                  path /
                  status_code 200
            }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    
        real_server 192.168.214.57 80 {  #RS2
            weight 1
            HTTP_GET {
                url { 
                  path /
              status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }
    #从节点配置与以上大致一样,只需修改三项
    # router_id node1 ----> router_id node2
    # state MASTER ----> state BACKUP
    # priority 100  ---->  priority 80

     (3) 配置RS1与RS2服务器,先安装httpd服务,再配置RS服务器的VIP与内核参数(这里使用脚本配置)

    [root@centos7-47 ~]# yum install -y httpd
    [root@centos7-47 ~]# echo "<h1>`hostname`</h1>" > /var/www/html/index.html     #准备主页
    [root@centos7-47 ~]# systemctl start httpd   #启动httpd服务
    [root@centos7-57 ~]# yum install -y httpd
    [root@centos7-57 ~]# echo "<h1>`hostname`</h1>" > /var/www/html/index.html     #准备主页
    [root@centos7-57 ~]# systemctl start httpd   #启动httpd服务
    [root@centos7-47 ~]# bash lvs_dr_rs.sh start   #脚本配置VIP及相关内核参数
    [root@centos7-57 ~]# bash lvs_dr_rs.sh start   #脚本配置VIP及相关内核参数
    [root@centos7-47 ~]# cat lvs_dr_rs.sh 
    #!/bin/bash
    
    vip='192.168.214.100'
    mask='255.255.255.255'
    dev='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/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $dev $vip netmask $mask #broadcast $vip up
        #route add -host $vip dev $dev
        echo "The RS Server is Ready!"
        ;;
    stop)
        ifconfig $dev 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/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo "The RS Server is Canceled!"
        ;;
    *)
        echo "Usage:$(basename $0) start|stop"
        exit 1
        ;;
    esac
    lvs_dr_rs.sh

     (4) 在keepalived主节点与备节点启动keepalived服务,使用ipvsadm查看LVS集群,并查看VIP的绑定情况

    [root@centos7-27 ~]# systemctl start keepalived
    [root@centos7-37 ~]# systemctl start keepalived
    [root@centos7-27 ~]# ipvsadm -Ln  #可以看到lvs集群生成了
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.214.100:80 wrr
      -> 192.168.214.47:80            Route   1      0          0         
      -> 192.168.214.57:80            Route   1      0          0         
    [root@centos7-27 ~]# ip a |grep 192.168.214.100  #VIP也绑在主节点上
        inet 192.168.214.100/32 scope global eth0:1

     (5) 在客户端测试LVS的调度情况及故障转移情况

    [root@centos7 ~]# while true;do curl 192.168.214.100 ;sleep 1;done  #可以看到调度正常
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    ...
    #下面先测试VS服务器(keepalived)的主备故障转移
    [root@centos7-27 ~]# systemctl stop keepalived
    [root@centos7-27 ~]# ip a |grep 192.168.214.100  #VIP已不在主节点上了
    [root@centos7-37 ~]# ip a |grep 192.168.214.100  #VIP已转移到从节点
        inet 192.168.214.100/32 scope global eth0:1
    [root@centos7 ~]# while true;do curl 192.168.214.100 ;sleep 1;done
    #访问也未断
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    ...
    [root@centos7-27 ~]# systemctl start keepalived  #重启主节点
    [root@centos7-27 ~]# ip a |grep 192.168.214.100  #VIP重新回到主节点了
        inet 192.168.214.100/32 scope global eth0:1
    [root@centos7-37 ~]# ip a |grep 192.168.214.100  #VIP已不在从节点上了
    #下面测试RS服务器故障时,lvs的调度情况
    #一开始是轮询的,现在关掉RS1的httpd服务
    [root@centos7-47 ~]# systemctl stop httpd
    [root@centos7 ~]# while true;do curl 192.168.214.100 ;sleep 1;done
    #检查了几次,发现RS1断了,后续访问全调度给RS2了
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    curl: (7) Failed connect to 192.168.214.100:80; Connection refused
    <h1>centos7-57</h1>
    curl: (7) Failed connect to 192.168.214.100:80; Connection refused
    <h1>centos7-57</h1>
    curl: (7) Failed connect to 192.168.214.100:80; Connection refused
    <h1>centos7-57</h1>
    curl: (7) Failed connect to 192.168.214.100:80; Connection refused
    <h1>centos7-57</h1>
    curl: (7) Failed connect to 192.168.214.100:80; Connection refused
    <h1>centos7-57</h1>
    curl: (7) Failed connect to 192.168.214.100:80; Connection refused
    <h1>centos7-57</h1>
    <h1>centos7-57</h1>
    <h1>centos7-57</h1>
    ...
    #接下恢复RS1的httpd服务
    [root@centos7-47 ~]# systemctl start httpd
    [root@centos7 ~]# while true;do curl 192.168.214.100 ;sleep 1;done
    #等RS1重新连接正常后,可以看到后续也参与了调度
    ...
    <h1>centos7-57</h1>
    <h1>centos7-57</h1>
    <h1>centos7-57</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    <h1>centos7-57</h1>
    <h1>centos7-47</h1>
    ...
  • 相关阅读:
    js 或者 element-ui 将年月日时分秒转换为时间戳
    element-ui 设置table 表头多列显示
    element-ui table 给表头添加icon,以及hover上去的提示文字
    js 获取本周开始结束时间,本月开始结束时间等....
    element-ui Table 翻页后记忆之前勾选
    element-ui 上传图片或视频时,先回显在上传
    element-ui Upload 上传获取当前选择的视频时长
    element-ui 自定义 Upload 上传进度条
    Sqoop(二)常用命令及常数解析
    使用IDEA构建Spring Boot项目简单实例
  • 原文地址:https://www.cnblogs.com/hovin/p/12098840.html
Copyright © 2011-2022 走看看