高可用集群 Keepalived 所有内容讲解

目录

系统可用性

实现高可用

Keepalived 介绍

Keepalived 环境准备 

 Keepalived 相关文件

Ubuntu 安装 keepalived 

编译安装 

KeepAlived 配置说明

配置语法说明 全局配置

配置虚拟路由器 

启用 Keepalived 日志功能 

实现 Keepalived 独立子配置文件

 脑裂

非抢占模式 nopreempt 

抢占延迟模式 preempt_delay

VIP 单播配置

通知脚本类型

脚本的调用方法

 实现 Master/Master 的 Keepalived 双主架构

实现 IPVS 的高可用性

 应用层监测

TCP监测

基于 VRRP Script 实现其它应用的高可用性

 VRRP Script 配置

定义 VRRP script 

实现 HAProxy 高可用


系统可用性

SLA:Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约)
A = MTBF / (MTBF+MTTR)

99.95%:(60*24*30)*(1-0.9995)=21.6分钟 #一般按一个月停机时间统计

指标 :99.9%, 99.99%, 99.999%,99.9999%

实现高可用

提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
解决方案:建立冗余机制

  • active/passive 主/备
  • active/active 双主
  • active --> HEARTBEAT --> passive
  • active <--> HEARTBEAT <--> active

Keepalived 介绍

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

vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务
官网:http://keepalived.org/
功能:

  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy  等 

Keepalived 环境准备 

高可用集群 Keepalived 所有内容讲解_第1张图片

 Keepalived 相关文件

  • 软件包名:keepalived
  • 主程序文件:/usr/sbin/keepalived
  • 主配置文件:/etc/keepalived/keepalived.conf
  • 配置文件示例:/usr/share/doc/keepalived/
  • Unit File:/lib/systemd/system/keepalived.service
  • Unit File的环境配置文件:
    •    /etc/sysconfig/keepalived CentOS
    •    /etc/default/keepalived Ubuntu

Ubuntu 安装 keepalived 

默认没有配置文件无法启动
[root@ubuntu2004 ~]#systemctl status keepalived
#利用范例生成配置文件
[root@ubuntu2004 ~]#cp /usr/share/doc/keepalived/samples/keepalived.conf.sample/etc/keepalived/keepalived.conf
[root@ubuntu2004 ~]#systemctl start keepalived

[root@ubuntu2004 ~]#hostname -I #起来之后会出现很多ip,这些ip都是配置上自动生成的
10.0.0.101 192.168.200.11 192.168.200.12 192.168.200.13 
 

编译安装 

#选项--disable-fwmark 可用于禁用iptables规则,可防止VIP无法访问,无此选项默认会启用iptables
规则
[root@ubuntu2004 ~]#./configure --prefix=/usr/local/keepalived --disable-fwmark

KEEPALIVED_VERSION=2.2.7
#KEEPALIVED_VERSION=2.2.2
#KEEPALIVED_VERSION=2.0.20
KEEPALIVED_FILE=keepalived-${KEEPALIVED_VERSION}.tar.gz

KEEPALIVED_INSTALL_DIR=/apps/keepalived
SRC_DIR=/usr/local/src
KEEPALIVED_URL=https://keepalived.org/software/

CPUS=`grep -c processor  /proc/cpuinfo`

. /etc/os-release


color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


download_file (){
    cd  ${SRC_DIR}
    if [ $ID = 'centos' -o $ID = 'rocky' ];then
        rpm -q wget &> /dev/null || yum -y install wget 
    elif [ $ID = 'ubuntu' ];then
        dpkg -l |grep wget || { apt update;  apt install -y wget; } 
    else
        color "不支持此操作系统,退出!" 1
        exit
    fi
    if [ ! -e ${KEEPALIVED_FILE} ];then
        wget --no-check-certificate  ${KEEPALIVED_URL}${KEEPALIVED_FILE} 
        [ $? -ne 0 ] && { color "KEEPALIVED源码包下载失败" 1 ; exit; }
    fi
}

install_keepalived () {
    if [ $ID = 'centos' -o $ID = 'rocky' ];then
        yum -y install make gcc ipvsadm autoconf automake openssl-devel libnl3-devel iptables-devel net-snmp-devel glib2-devel pcre2-devel  libmnl-devel systemd-devel &> /dev/null
    elif [ $ID = 'ubuntu' ];then
        apt update 
        apt -y install make gcc ipvsadm build-essential pkg-config automake autoconf libipset-dev libnl-3-dev libnl-genl-3-dev libssl-dev libxtables-dev libip4tc-dev libip6tc-dev libipset-dev libmagic-dev libsnmp-dev libglib2.0-dev libpcre2-dev libnftnl-dev libmnl-dev libsystemd-dev
    else
        color "不支持此操作系统,退出!" 1
    fi
    tar xf ${KEEPALIVED_FILE}
    cd keepalived-${KEEPALIVED_VERSION}
    ./configure --prefix=${KEEPALIVED_INSTALL_DIR} --disable-fwmark
    make -j $CPUS && make install
    if [ $? -eq 0 ];then
        color "KEEPALIVED编译安装成功" 0
    else
        color "KEEPALIVED编译安装失败,退出!" 1
        exit
    fi
    [ -d /etc/keepalived ] || mkdir -p /etc/keepalived
    cp ${KEEPALIVED_INSTALL_DIR}/etc/keepalived/keepalived.conf.sample  /etc/keepalived/keepalived.conf
    cp ./keepalived/keepalived.service /lib/systemd/system/
}

start_keepalived () {
    systemctl daemon-reload
    systemctl enable --now keepalived &> /dev/null 
    systemctl is-active keepalived
    if [ $? -eq 0 ] ;then
        color "Keepalived 服务安装成功!" 0  
    else
        color "Keepalived 服务安装失败!" 1
        exit 1
    fi
}

download_file

install_keepalived

start_keepalived

KeepAlived 配置说明

配置文件

/etc/keepalived/keepalived.conf

配置文件组成

GLOBAL CONFIGURATION
Global definitions:定义邮件配置,route_id,vrrp配置,多播地址等

VRRP CONFIGURATION
VRRP instance(s):定义每个vrrp虚拟路由器

LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):LVS集群的VS和RS

配置语法说明 全局配置

#/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost        #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
[email protected]
[email protected]
}
notification_email_from keepalived@localhost         #发邮件的地址
smtp_server 127.0.0.1                  #邮件服务器地址
smtp_connect_timeout 30            #邮件服务器连接timeout
router_id ka1.example.com         #每个keepalived主机唯一标识,建议使用当前主机名,如果多节点重名可能会影响切换脚本执行

vrrp_skip_check_adv_addr         #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查

vrrp_strict         #严格遵守VRRP协议,启用此项后以下状况将无法启动服务: 1.无VIP地址     2.配置了单播邻居   3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置

vrrp_garp_interval 0         #gratuitous ARP messages 报文发送延迟,0表示不延迟
vrrp_gna_interval 0          #unsolicited NA messages (不请自来)消息发送延迟
vrrp_mcast_group4 224.0.0.18         #指定多播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18
vrrp_iptables                  #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置,注意:新版加此项仍有iptables规则
}

删了一部分,多了碍事,可删可不删,算一个小优化,下面lvs相关的也可以删掉用法不上的话

高可用集群 Keepalived 所有内容讲解_第2张图片

配置虚拟路由器 

vrrp_instance { #为vrrp的实例名,一般为业务名称
配置参数
......
}

#配置参数:
state MASTER|BACKUP        #当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP    名字就是个代号,主要还看优先级
interface IFACE_NAME         #绑定为当前虚拟路由器使用的物理接口,如:eth0,bond0,br0,可以和VIP不在一个网卡

virtual_router_id VRID         #每个虚拟路由器唯一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一

priority 100             #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepalived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
        auth_type AH|PASS                   #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
        auth_pass       #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress         { #虚拟IP,生产环境可能指定几十上百个VIP地址
/ brd dev scope label

 这样他同属于一个网段,开启后谁的权限大在谁身上,ping 100,就显示当前100所在的主机信息

 高可用集群 Keepalived 所有内容讲解_第3张图片高可用集群 Keepalived 所有内容讲解_第4张图片

 10.0.0.100飘来飘去看权限

启用 Keepalived 日志功能 

apt 安装

[root@ka1 ~]#vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
[root@ka1 ~]#vim /etc/rsyslog.conf
local6.*                                                 /var/log/keepalived.log
[root@ka1 ~]#systemctl restart keepalived.service rsyslog.service

按我脚本安装的在里面 自行加参数几,注意不能起冲突,现在相关文件里看看是否有相关文件参数

[root@ubuntu2004 ~]#cat /apps/keepalived/etc/sysconfig/keepalived

vim /etc/rsyslog.conf          主文件        

vim /etc/rsyslog.d/50-default.conf   配置文件

cat /etc/rsyslog.d/keepalived.conf    #创建文件在里面写如指定日志地址  要conf结尾
local6.*        /var/log/keepalived.log
systemctl restart keepalived.service rsyslog.service    #改了俩文件,所以都得重启就可以了

实现 Keepalived 独立子配置文件

当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中保存所有集群的配置会导致内容过
多,不易管理可以将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件

在原配主文件下指定路径,在指定路径创建文件,在文件里面写入所需要的内容;这样就可以应对以后的很多文件写入了    

global_defs {
   router_id ka1
}

include /etc/keepalived/conf.d/*.conf

 mkdir /etc/keepalived/conf.d
 vim /etc/keepalived/conf.d/www.wang.org.conf

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 {
        10.0.0.100/24 dev eth0 label eth0:1
    }
}

 脑裂

如果是做实现建议多开一块网卡,指定进主机模式 ,改成已定义获取 两边

高可用集群 Keepalived 所有内容讲解_第5张图片

主备节点同时拥有VIP,此时为脑裂理象
注意:脑裂现象原因

  • 心跳线故障                   #互联网线断开,认为对方挂机,则互相抢夺,
  • 防火墙错误配置            #不小心把相关ip禁掉了
  • Keepalived 配置错误    #相同节点未同步,则导致互相抢多

范例: 发现脑裂

[root@ubuntu2004 ~]# arping -I eth1 -c1 10.0.0.100
ARPING 10.0.0.100 from 192.168.10.130 eth1
Unicast reply from 10.0.0.100 [00:0C:29:7E:DA:E6] 0.801ms
Unicast reply from 10.0.0.100 [00:0C:29:97:AF:4F] 0.814ms
Sent 1 probes (1 broadcast(s))
Received 2 response(s) 

非抢占模式 nopreempt 

默认为抢占模式 preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的

master 角色
注意: 非抢占模式下,如果原主机down机, VIP迁移至的新主机, 后续新主机也发生down时,VIP还会迁移回修复好的原主机

但如果新主机的服务down掉(keepalived服务正常),原主机也不会接管VIP,仍会由新主机拥有VIP

即非抢占式模式,只是适合当主节点宕机,切换到从节点的一次性的高可用性,后续即使当原主节点修复好,仍无法再次起到高用功能

注意:要关闭 VIP抢占,必须将各 Keepalived 服务器 state 配置为 BACKUP 

#ha1主机配置

vrrp_instance VI_1 {
state BACKUP         #都为BACKUP
interface eth0
virtual_router_id 66
priority 100               #优先级高
advert_int 1
nopreempt         #添加此行,设为nopreempt

#ha2主机配置
vrrp_instance VI_1 {
state BACKUP         #都为BACKUP
interface eth0
virtual_router_id 66
priority 80                 #优先级低
advert_int 1
#nopreempt #            注意:如果ka2主机也是非抢占式,会导致ka1即使优先级降低于ka2,VIP也不会切换至ka2

抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP 

preempt_delay # #指定抢占延迟时间为#s,默认延迟300s

注意:需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict

范例: 

#ka1主机配置
vrrp_instance VI_1 {
state BACKUP                 #都为BACKUP
interface eth0
virtual_router_id 66
priority 100                       #优先级高
advert_int 1
preempt_delay 60         #抢占延迟模式,默认延迟300s

#ka2主机配置
vrrp_instance VI_1 {
state BACKUP               #都为BACKUP
interface eth0
virtual_router_id 66
priority 80                         #优先级低
advert_int 1

VIP 单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
另外:有些公有云不支持多播,可以单播实现
注意:启用 vrrp_strict 时,不能启用单播 

#在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络
unicast_src_ip #指定发送单播的源IP
unicast_peer {
#指定接收单播的对方目标主机IP
......

 在两台电脑互相互相指向对方,就可以实现单播了

vrrp_mcast_group4 239.0.0.0 #单播优先于多播   多播加在全局配置文件里

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 192.168.0.128  #本机IP
    unicast_peer{
    192.168.0.129      #指向对方主机IP  #如果有多个keepalived,再加其它节点的IP
}

}

通知脚本类型

当前节点成为主节点时触发的脚本 

notify_master |

当前节点转为备节点时触发的脚本

notify_backup |

当前节点转为“失败”状态时触发的脚本

notify_fault |

通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

notify |

当停止VRRP时触发的脚本

notify_stop |

    发消息邮件脚本

contact='root@wo shi gebi laowang.com'
email_send='[email protected]'
email_passwd='111qse/aebieb'
email_smtp_server='smtp.qq.com'

. /etc/os-release

msg_error() {
  echo -e "\033[1;31m$1\033[0m"
}

msg_info() {
  echo -e "\033[1;32m$1\033[0m"
}

msg_warn() {
  echo -e "\033[1;33m$1\033[0m"
}

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


install_sendemail () {
    if [[ $ID =~ rhel|centos|rocky ]];then
        rpm -q sendemail &> /dev/null ||  yum install -y sendemail
    elif [ $ID = 'ubuntu' ];then
        dpkg -l |grep -q sendemail  || { apt update; apt install -y libio-socket-ssl-perl libnet-ssleay-perl sendemail ; } 
    else
        color "不支持此操作系统,退出!" 1
        exit
    fi
}

send_email () {
    local email_receive="$1"
    local email_subject="$2"
    local email_message="$3"
    sendemail -f $email_send -t $email_receive -u $email_subject -m $email_message -s $email_smtp_server -o message-charset=utf-8 -o tls=yes -xu $email_send -xp $email_passwd
    [ $? -eq 0 ] && color "邮件发送成功!" 0 || color "邮件发送失败!" 1 
}

notify() {
    if [[ $1 =~ ^(master|backup|fault)$ ]];then
        mailsubject="$(hostname) to be $1, vip floating"
        mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
        send_email "$contact" "$mailsubject" "$mailbody"
   else
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
   fi
}

install_sendemail 
notify $1

脚本的调用方法

 在 vrrp_instance VI_1 语句块的末尾加下面行,并且把脚本移动到指定文件下

notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

高可用集群 Keepalived 所有内容讲解_第6张图片

 实现 Master/Master 的 Keepalived 双主架构

双主要经常做压力测试,性能不能超过50%

master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。

Master/Master 的双主架构:

即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率

和上面一样,就是在上面的基础上把同一王网段号,主备名,同端口号,密码改一下 让他每个都是互相的主备

后续的几主几从都是一个道理

高可用集群 Keepalived 所有内容讲解_第7张图片

实现 IPVS 的高可用性

高可用集群 Keepalived 所有内容讲解_第8张图片

10.0.0.8  web1      本人用nginx做得网页

10.0.0.18   web2

Virtual Server (虚拟服务器)的定义格式 

virtual_server IP port         #定义虚拟主机IP地址及其端口
virtual_server fwmark int    #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string #使用虚拟服务器组

虚拟服务器配置

virtual_server IP port {             #VIP和PORT
delay_loop                      #检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh     #定义调度方法
lb_kind NAT|DR|TUN                   #集群的类型,注意要大写
persistence_timeout             #持久连接时长
protocol TCP|UDP|SCTP                #指定服务协议,一般为TCP
sorry_server           #所有RS故障时,备用服务器地址
real_server   {        #RS的IP和PORT
weight  #RS权重
notify_up |   #RS上线通知脚本
notify_down | #RS下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }#定义当前主机健康状态检测方法
}
}
    #注意:括号必须分行写,两个括号写在同一行,如: }} 会出错

 应用层监测

应用层检测:HTTP_GET|SSL_GET

HTTP_GET|SSL_GET {
url {
path              #定义要监控的URL
status_code            #判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout   #客户端请求的超时时长, 相当于haproxy的timeout server
nb_get_retry          #重试次数
delay_before_retry    #重试之前的延迟时长
connect_ip     #向当前RS哪个IP地址发起健康状态检测请求
connect_port         #向当前RS的哪个PORT发起健康状态检测请求
bindto         #向当前RS发出健康状态检测请求时使用的源地址
bind_port            #向当前RS发出健康状态检测请求时使用的源端口
}

TCP监测

传输层检测:TCP_CHECK

TCP_CHECK {
connect_ip      #向当前RS的哪个IP地址发起健康状态检测请求
connect_port          #向当前RS的哪个PORT发起健康状态检测请求
bindto          #发出健康状态检测请求时使用的源地址
bind_port             #发出健康状态检测请求时使用的源端口
connect_timeout    #客户端请求的超时时长, 等于haproxy的timeout server
}

范例:lvs在最下面

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 192.168.0.128
    unicast_peer{
        192.168.0.129
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

vrrp_instance VI_1 {
    interface eth0
    virtual_router_id 50
    nopreempt
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.200.11
        192.168.200.12
        192.168.200.13
    }
}


virtual_server 10.0.0.100 80 {    #lvs 下面
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #persistence_timeout 120
    protocol TCP
    #sorry_server 127.0.0.1 80
    real_server 10.0.0.8 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
}
real_server 10.0.0.18 80 {
    weight 1
    TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        }
    }
}

 同样在·102也是一样来一次

[root@ubuntu2004 conf.d]#systemctl restart keepalived.service 
[root@ubuntu2004 conf.d]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.100:80 wrr
  -> 10.0.0.8:80                  Route   1      0          0         
  -> 10.0.0.18:80                 Route   1      0          0       

这样高可用就好了停一台啥事都没有

基于 VRRP Script 实现其它应用的高可用性

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

参考配置文件:

/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck

 VRRP Script 配置

分两步实现:

  • 定义脚本                                                                                                                  vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后,是和global_defs平级的语句块通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点

当 keepalived_script 用户存在时,会以此用户身份运行脚本,否则默认以root运行脚本
注意: 此定义脚本的语句块一定要放在下面调用此语句vrrp_instance语句块的前面

vrrp_script {
script | #此脚本返回值为非0时,会触发下面OPTIONS执行
OPTIONS

调用脚本

track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的
vrrp_script 

track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}

定义 VRRP script 

vrrp_script  {         #定义一个检测脚本,在global_defs 之外配置
script |     #shell命令或脚本路径
interval                   #间隔时间,单位为秒,默认1秒
timeout                    #超时时间
weight           #默认为0,如果设置此值为负数,当上面脚本返回值为非0时,
会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此
值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值fall  #执行脚本连续
几次都失败,则转换为失败,建议设为2以上
rise                       #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME]           #执行监测脚本的用户或组
init_fail                           #设置默认标记为失败状态,监测成功之后再转换为成功状态
}

调用 VRRP script

vrrp_instance VI_1 {
...
track_script {

}
}

 范例;

在两端按相同的法子执行,重其后检测一下就可以看到权限-30

tcpdump -i eth1 -nn host 192.168.0.129

vrrp_script check_down {                   #参数加在前面 。在最后引用
script "[ ! -f /etc/keepalived/down ]" 
interval 1
weight -30
fall 3
rise 2
timeout 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 192.168.0.128
    unicast_peer{
        192.168.0.129
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    track_script {   #引用上面的
        check_down    名字必须一致
}

实现 HAProxy 高可用

#在两个ka1和ka2先实现haproxy的配置
[root@ka1 ~]#cat /etc/haproxy/haproxy.cfg
listen status
    bind 10.0.0.100:9999
    stats enable

listen www.wang.org_80
    bind 10.0.0.100:80 
    server web01 10.0.0.8:80 check
    server web02 10.0.0.18:80 check
 

#在两个ka1和ka2两个节点启用内核参数  

[root@ka1,2 ~]#vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1  加上
[root@ka1,2 ~]#sysctl -p

创建脚本   #进程死了但是还能连上,就把他重启,后期可以检查别的,我这就是省事   
[root@ka1]# yum install psmisc -y
[root@ka1]# cat /etc/keepalived/check_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy

[root@ka1 ~]# chmod a+x /etc/keepalived/check_haproxy.sh

[root@ubuntu2004 keepalived]#cat conf.d/www.wang.org.conf  #引用

vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight -30
fall 3
rise 2
timeout 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 66
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 192.168.0.129
    unicast_peer{
        192.168.0.128
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    track_script {
        check_downi
        check_haproxy
}

tcpdump -i eth1 -nn host 192.168.0.129

你可能感兴趣的:(高可用集群,KEEPALIVED,java,开发语言)