keepalive

作者: 麟之趾a | 来源:发表于2020-05-13 11:38 被阅读0次

高可用

传统高可用

image.png

问题: 两台主机为高可用时,当B主机认为A主机宕机了。但是B自己出的问题,或者网络出了问题。此时A还没有宕机,就会出现资源争夺问题

仲裁机制的高可用

大于半数的主机,BC认为A宕机了。A就是宕机了。主机应为基数个


image.png

为了防止A,没有完全宕机。应采取隔离机制,给A补上一枪

隔离机制

  • SIONTH:断A的电源,A,B,C都是通过电源交换机连接,电源交换机可以接收由leader发出的信息,给A进行断电源
  • FENCE:隔离,中断A对外通信的信号信息。

keepalive

采用不同以上的高可用,而是VRRP协议 虚拟冗余路由协议
vrrp 协议的实现,原生设计的目的为了高可用ipvs服务
基于VRRP吸引完成地质流动
为VIP地址所在的节点生成ipvs规则(在配置文件中预先定义)
为ipvs集群的RS做健康状态检查
基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务

组件

核心组件

  • vrrp stack vrrp组件
  • ipvs wrapper ipvs配置组件
  • checkers ipvs健康检查组件
    控制组件
  • 配置文件分析器
    IO复用器
    内存管理组件

keepalive 配置前提

  • 各节点时间必须同步
    ntp,chrony
  • 确保iptables和selinux不会成为阻碍
  • 各节点之间可用过主机名互相通信(对KA并非必须),建议使用/etc/hosts文件实现
  • 确保各节点的用于集群服务的接口支持MULTICAST通信(组播通信)D类地址
    224-239

keepalive 安装配置

keepalive主配置文件   /etc/keepalived/keepalived.conf
keepalive 环境配置文件 /etc/sysconfig/keepalived
unti file  文件  /usr/lib/systemd/system/keepalived.service
主程序    /usr/sbin/keepalived
--------------------------------------------------------------------------------------------------------------------------------
TOP HIERACHY
      GLOBAL CONFIGURATION
             Global definitions
             Static routes/addresses/rules
      VRRPD CONFIGURATION
             VRRP synchronization group(s)   同步组,LVS做nat模式使用
             VRRP instance(s)
      LVS CONFIGURATION
             Virtual server group(s)
             Virtual server(s)  ipvs的VS和RS

配置keepalive的VIP漂移和邮件通知

MASTER

[root@mysql keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
   }
 vrrp_mcast_group4 224.0.0.18
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     172.16.1.101/24 dev ens33  label ens33:1
    }
 notify_master "/etc/keepalived/notify.sh master"
 notify_backup "/etc/keepalived/notify.sh backup"
 notify_fault  "/etc/keepalived/notify.sh fault"
}

-------------------------------------------------------------------------------------------------------------
[root@mysql keepalived]# cat notify.sh 
#!/bin/bash
contact='root@localhost'
notify(){
   mailsubject="$(hostname) to be $1"
   mailbody="$(date) vrrp tranisition,$(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:master|backup|fault"
       exit 1
       ;;
 esac


tcpdump  -i ens33 host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
17:19:17.663974 IP db01 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
17:19:18.665246 IP db01 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
17:19:19.666747 IP db01 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
17:19:20.668326 IP db01 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20

BACKUP

[root@ceshi ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
 vrrp_mcast_group4 224.0.0.18
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 96
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     172.16.1.101/24 dev ens33 label ens33:2
    }
 notify_master "/etc/keepalived/notify.sh master"
 notify_backup "/etc/keepalived/notify.sh backup"
 notify_fault  "/etc/keepalived/notify.sh fault"

}
--------------------------------------------------------------------------------------------------------------------------------
[root@mysql keepalived]# cat notify.sh 
#!/bin/bash
contact='root@localhost'
notify(){
   mailsubject="$(hostname) to be $1"
   mailbody="$(date) vrrp tranisition,$(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:master|backup|fault"
       exit 1
       ;;
 esac
[root@ceshi ~]# tcpdump  -i ens33 host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
18:34:33.386612 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
18:34:34.387876 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
18:34:35.389109 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
18:34:36.390451 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
18:34:37.391968 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
18:34:38.393955 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
18:34:39.395785 IP 10.0.0.11 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20

配置keepalive ipvs及健康检查

MASTER

[root@mysql ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.14/24 dev ens33  label ens33:1
    }
 notify_master "/etc/keepalived/notify.sh master"
 notify_backup "/etc/keepalived/notify.sh backup"
 notify_fault  "/etc/keepalived/notify.sh fault"
}
virtual_server 10.0.0.14 80 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server  127.0.0.1 80
       real_server 10.0.0.12 80 {
        weight 1
        HTTP_GET {
            url {
            path /
            status_code 200
            
        }
    }
}
            real_server 10.0.0.13 80 {
        weight 1
        HTTP_GET {
            url {
            path /
            status_code 200
        }
    }
}
}
}

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 mysql1
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 96
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.14/24 dev ens33 label ens33:1
    }
 notify_master "/etc/keepalived/notify.sh master"
 notify_backup "/etc/keepalived/notify.sh backup"
 notify_fault  "/etc/keepalived/notify.sh fault"

}
virtual_server 10.0.0.14 80 {
        delay_loop 2
        lb_algo rr 
        lb_kind DR
        protocol TCP
        sorry_server  127.0.0.1 80
           real_server 10.0.0.12 80 {
                weight 1
                HTTP_GET {
                    url {
                        path /
                        status_code 200
                        
                }
        }       
}       
            real_server 10.0.0.13 80 {
                weight 1
                HTTP_GET {
                        url {
                        path /
                        status_code 200
                }       
        }       
}       
}
}

高可用nginx服务

MASTER

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

! Configuration File for keepalived

global_defs {
   notification_email {
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
! Configuration File for keepalived

global_defs {
   notification_email {
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_ngx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -10
        fall 1
        rise 1
}


vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.14/24 dev ens33  label ens33:1
    }
    track_script {
        chk_ngx
        }
}

BACKUP

[root@ceshi ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
 vrrp_mcast_group4 224.0.0.18
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_ngx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -10
        fall 1
        rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 96
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     172.16.1.101/24 dev ens33 label ens33:2
    }
track_script {
        chk_ngx
        }
 notify_master "/etc/keepalived/notify.sh master"
 notify_backup "/etc/keepalived/notify.sh backup"
 notify_fault  "/etc/keepalived/notify.sh fault"

}

相关文章

网友评论

      本文标题:keepalive

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