高可用集群KEEPALIVED

目录

实验环境简介:

一.高可用集群

1.1 集群类型

1.2 系统可用性

1.3 系统故障

1.4 实现高可用

1.5.VRRP:Virtual Router Redundancy Protocol

1.5.1 VRRP 相关术语

1.5.2 VRRP 相关技术

二.Keepalived 部署

2.1 keepalived 简介

2.2 Keepalived 架构

 2.3 Keepalived 环境准备

2.4 Keepalived 相关文件

2.5 Keepalived 安装

2.6 KeepAlived 配置说明

2.6.1 配置文件组成部分

2.6.2 配置语法说明

2.6.2.1 全局配置

2.6.2.2 配置虚拟路由器

2.6.2.3 启用keepalived日志功能 

2.6.2.4 实现独立子配置文件

 三.Keepalived 企业应用示例

3.1 实现master/slave的 Keepalived 单主架构

3.2 抢占模式和非抢占模式

3.2.1 非抢占模式 nopreempt

3.2.2 抢占延迟模式 preempt_delay 

3.3 VIP单播配置

3.4 Keepalived 通知脚本配置

3.4.1 通知脚本类型 

3.4.2 脚本的调用方法

 3.4.3 创建通知脚本

3.4.4 邮件配置 

 3.4.5 实现 Keepalived 状态切换的通知脚本

3.5 实现 master/master 的 Keepalived 双主架构

3.6 实现IPVS的高可用性

3.6.1 IPVS相关配置

3.6.1.1 虚拟服务器配置结构

 3.6.1.2 virtual server (虚拟服务器)的定义格式

3.6.1.3 虚拟服务器配置

3.6.2 示例:

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

3.7.1 VRRP Script 配置

3.7.2 利用脚本实现主从角色切换

3.7.3 keepalived+haproxy的高可用集群


实验环境简介:

nodeIP
KA1.exam.org172.25.250.10
KA2.exam.org172.25.250.20
RS1.exam.org172.25.250.110
RS2.exam.org172.25.250.120

一.高可用集群

1.1 集群类型

  • LB:Load Balance 负载均衡

        LVS/HAProxy/nginx(http/upstream, stream/upstream)

  • HA:High Availability 高可用集群

        数据库、Redis

  • SPoF: Single Point of Failure,解决单点故障                                                                 

        HPC:High Performance Computing 高性能集群

1.2 系统可用性

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%

1.3 系统故障

硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素                                                    软件故障:设计缺陷 bug

1.4 实现高可用

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

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

1.5.VRRP:Virtual Router Redundancy Protocol

虚拟路由冗余协议,解决静态网关单点风险

  • 物理层:路由器、三层交换机
  • 软件层:keepalived

1.5.1 VRRP 相关术语

  • 虚拟路由器:Virtual Router
  • 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
  • VIP:Virtual IP
  • VMAC:Virutal MAC (00-00-5e-00-01-VRID)
  • 物理路由器:
    • master:主设备
    • backup:备用设备
    • priority:优先级

1.5.2 VRRP 相关技术

通告:心跳,优先级等;周期性

工作方式:抢占式,非抢占式

安全认证:

  • 无认证
  • 简单字符认证:预共享密钥
  • MD5

工作模式:

  • 主/备:单虚拟路由器
  • 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

二.Keepalived 部署

2.1 keepalived 简介

vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务

官网:http://keepalived.org/

功能:

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

2.2 Keepalived 架构

官方文档:

  • https://keepalived.org/doc/
  • http://keepalived.org/documentation.html

 1. 用户空间核心组件:

  • vrrp stack:VIP消息通告
  • checkers:监测real server
  • system call:实现 vrrp 协议状态转换时调用脚本的功能
  • SMTP:邮件组件
  • IPVS wrapper:生成IPVS规则
  • Netlink Reflector:网络接口
  • WatchDog:监控进程

2. 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

3. IO复用器:针对网络目的而优化的自己的线程抽象

4. 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

 2.3 Keepalived 环境准备

  •  各节点时间必须同步:ntp, chrony
  • 关闭防火墙及SELinux
  • 各节点之间可通过主机名互相通信:非必须
  • 建议使用/etc/hosts文件实现:非必须
  • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须

2.4 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

2.5 Keepalived 安装

[root@KA1 ~]# dnf install keepalived -y

[root@KA1 ~]# systemctl start keepalived

2.6 KeepAlived 配置说明

2.6.1 配置文件组成部分

配置文件:/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

2.6.2 配置语法说明

帮助   man keepalived.conf

2.6.2.1 全局配置
global_defs {
   notification_email {
      123123@qq.com                #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区
                                    分写多个
   }
   notification_email_from keepalived@ka1.exam.org      #发邮件的地址
   smtp_server 127.0.0.1                                #邮件服务器地址
   smtp_connect_timeout 30                              #邮件服务器连接timeout
   router_id ka1.exam.org                               #每个keepalived主机唯一标识,多节点 
                                                         重名不影响

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

   #vrrp_strict                            #严格遵循vrrp协议
                                           #启用此项后以下状况将无法启动服务:
                                              1.无VIP地址
                                              2.配置了单播邻居
                                              3.在VRRP版本2中有IPv6地址
                                           #建议不加此项配置

   vrrp_garp_interval 0                    #报文发送延迟,0表示不延迟
   vrrp_gna_interval 0                     #消息发送延迟
   vrrp_mcast_group4 224.0.0.18            #指定组播IP地址范围:
}
2.6.2.2 配置虚拟路由器
vrrp_instance VI_1 {
    state MASTER
    interface eth0                   #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和            
                                      VIP不在一个网卡
    
    virtual_router_id 100            #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此 
                                      值必须唯一,否则服务无法启动
                                      同属一个虚拟路由器的多个keepalived节点必须相同
                                      务必要确认在同一网络中此值必须唯一
    
    priority 100                    #当前物理节点在此虚拟路由器的优先级,范围:1-254
                                     值越大优先级越高,每个keepalived主机节点此值不同

    advert_int 1                    #vrrp通告的时间间隔,默认1s
    authentication {                #认证机制
        auth_type PASS              #PASS为简单密码(建议使用)
        auth_pass 1111              #预共享密钥,仅前8位有效
                                     同一个虚拟路由器的多个keepalived节点必须一样
    }
    virtual_ipaddress {             #虚拟IP,生产环境可能指定上百个IP地址
                                    
        172.25.250.100/24 dev eth0 label eth0:1    #<IPADDR> dev <STRING> scope <SCOPE>                                     
                                                   label <LABEL>
                                       #指定VIP,不指定网卡,默认为eth0,注意:不指 
                                        定/prefix,默认32
    }
}

示例:

2.6.2.3 启用keepalived日志功能 
[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@ka1 ~]#tail -f /var/log/keepalived.log

2.6.2.4 实现独立子配置文件

当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理

将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含 子配置文件

格式:include /path/file

[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 


global_defs {
   notification_email {
      123123@qq.com
   }
   notification_email_from keepalived@ka1.exam.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.exam.org
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_ipsets keepalived
   vrrp_iptables
}
include /etc/keepalived/conf.d/*/conf     #相关配置文件


[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.250.100.conf
[root@ka1 ~]# cat /etc/keepalived/conf.d/172.25.250.100.conf
vrrp_instance VI_1 {
	state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
}

 三.Keepalived 企业应用示例

3.1 实现master/slave的 Keepalived 单主架构

MASTER配置

global_defs {
   notification_email {
      123123@qq.com
   }
   notification_email_from keepalived@ka1.exam.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.exam.org
   vrrp_skip_check_adv_addr
   #vrrp_strict                #添加此选项无法访问vip,可以用nft list ruleset查看
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
}

 Note:注释掉vrrp_strict 不然无法访问vip

slave配置 

也要同时关闭strict

vrrp_instance VI_1 {
    state BACKUP       #设置为BACKUP
    interface eth0
    virtual_router_id 100
    priority 80         #优先级必须比MASTER低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
}

 抓包观察

tcpdump -i eth0 -nn host 224.0.0.18           #224.0.0.18为组播IP范围


3.2 抢占模式和非抢占模式

3.2.1 非抢占模式 nopreempt

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色, 这样会使vip在KA主机中来回漂移,造成网络抖动, 建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色 非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机

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

3.2.2 抢占延迟模式 preempt_delay 

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

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

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

3.3 VIP单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量

注意:启用 vrrp_strict 时,不能启用单播

master配置

global_defs {
   notification_email {
      123123@qq.com
   }
   notification_email_from Keep@KA1.exam.org
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id KA1.exam.org
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   #vrrp_mcast_group42 224.0.0.18
   #vrrp_iptables
   vrrp_ipsets keepalived
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 20
    priority 100 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }   
    unicast_src_ip 172.25.250.10
    unicast_peer {
        172.25.250.20
    }
}

slave配置 

global_defs {
   notification_email {
      123123@qq.com
   }   
   notification_email_from Keep@KA1.exam.org
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id KA1.exam.org
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   #vrrp_mcast_group42 224.0.0.18
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 20
    priority 80
    advert_int 1
    preempt_delay 60
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }   
    unicast_src_ip 172.25.250.20
    unicast_peer {
        172.25.250.10
    }   
}

抓包查看单播效果 

[root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.250.10 and dst 172.25.250.20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
23:42:54.596433 IP 172.25.250.10 > 172.25.250.20: VRRPv2, Advertisement, vrid 200, prio 80, authtype simple, intvl 1s, length 20
23:42:54.661832 IP 172.25.250.10 > 172.25.250.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
23:42:55.597131 IP 172.25.250.10 > 172.25.250.20: VRRPv2, Advertisement, vrid 200, prio 80, authtype simple, intvl 1s, length 20
23:42:55.662116 IP 172.25.250.10 > 172.25.250.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel

3.4 Keepalived 通知脚本配置

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户

默认以用户keepalived_script身份执行脚本

如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份

global_defs {

......

script_user

......

}

3.4.1 通知脚本类型 

当前节点成为主节点时触发的脚本 
notify_master <STRING>|<QUOTED-STRING>

当前节点转为备节点时触发的脚本 
notify_backup <STRING>|<QUOTED-STRING>

当前节点转为“失败”状态时触发的脚本 
notify_fault <STRING>|<QUOTED-STRING>

通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
notify <STRING>|<QUOTED-STRING>

当停止VRRP时触发的脚本
notify_stop <STRING>|<QUOTED-STRING>

3.4.2 脚本的调用方法

在 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"

 3.4.3 创建通知脚本

 [root@KA1 +KA2 ~]# chmod +x /etc/keepalived/mail.sh

3.4.4 邮件配置 

安装邮件发送工具
[root@KA2 ~]# yum install mailx -y

QQ邮箱配置 

[root@KA1 ~]# vim /etc/mail.rc

############################
set from=123123@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=123123@qq.com
set smtp-auth-password=                  #设置 SMTP 认证的密码
set smtp-auth=login
set ssl-verify=ignore

##############################
set from=<QQ 邮箱地址>
set smtp=smtp.qq.com
set smtp-auth-user=<QQ 邮箱地址>
set smtp-auth-password=<邮箱授权码>
set smtp-auth=login

 获取授权码

发送测试邮件 

[root@KA1 ~]# echo test message |mail -s test 123123@qq.com

 3.4.5 实现 Keepalived 状态切换的通知脚本

[root@ka1~]# cat /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='123123@qq.com'
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
    master)
    mail_send master
    ;;
    backup)
    mail_send backup
    ;;
    fault)
    mail_send fault
    ;;
    *)
    exit 1
    ;;
esac


[root@ka1~]# chmod +x /etc/keepalived/mail.sh
[root@KA1 +K2 ~]#vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 1111
}
virtual_ipaddress {
    172.25.250.100/24 dev eth0 label eth0:0
    }
    unicast_src_ip 172.25.250.10
    unicast_peer {
        172.25.250.20
    }
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"
}

#模拟master故障
[root@ka1-centos8 ~]#killall keepalived

测试:在浏览器中观察邮件即可

3.5 实现 master/master 的 Keepalived 双主架构

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

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

配置:

Note:master的backup和slave的master保持一致

master: 

vrrp_instance VI_1 {
    state MASTER            #主
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1    #VIP
    }
}


# master的backup和slave的master保持一致
vrrp_instance VI_2 {
    state BACKUP            #备
    interface eth0
    virtual_router_id 200    #router_id =slave-master
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.200/24 dev eth0 label eth0:2   #VIP
    }
}

 slave:

vrrp_instance VI_2 {    #此时从机为路由2
    state MASTER        #主
    interface eth0
    virtual_router_id 200    #注意此id 等于master bakcup的id
    priority 100        #优先级和主机master一致
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.200/24 dev eth0 label eth0:2  #VIP和主机backup一致
    }
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80          #备
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
}

3.6 实现IPVS的高可用性

3.6.1 IPVS相关配置

3.6.1.1 虚拟服务器配置结构
virtual_server IP port {
    ...
real_server {
    ...
}
real_server {
    ...
    }
    …
}
 3.6.1.2 virtual server (虚拟服务器)的定义格式

virtual_server IP port                         #定义虚拟主机IP地址及其端口

virtual_server fwmark int                 #ipvs的防火墙打标,实现基于防火墙的负载均衡集群 virtual_server group string                 #使用虚拟服务器组

3.6.1.3 虚拟服务器配置
virtual_server IP port {             #VIP和PORT
    delay_loop <INT>                     #检查后端服务器的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh     #定义调度方法
    lb_kind NAT|DR|TUN                     #集群的类型,注意要大写
    persistence_timeout <INT>              #持久连接时长
    protocol TCP|UDP|SCTP                  #指定服务协议,一般为TCP
    sorry_server <IPADDR> <PORT>           #所有RS故障时,备用服务器地址

real_server <IPADDR> <PORT> {        #RS的IP和PORT
    weight <INT>                         #RS权重
    notify_up <STRING>|<QUOTED-STRING>       #RS上线通知脚本
    notify_down <STRING>|<QUOTED-STRING>     #RS下线通知脚本
    HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }     #定义当前主机健康状
                                                                  态检测方法
    }
}
#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错

应用层检测:HTTP_GET|SSL_GET

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

TCP监测 

传输层检测:TCP_CHECK

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

3.6.2 示例:

1. RS1和RS2

永久添加vip-lo,并关闭arp对外响应

[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo


DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
IPADDR1=172.25.250.100
NETMASK1=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
[root@RS1 ~]# vim /etc/sysctl.d/arp.conf 
[root@RS1 ~]# cat /etc/sysctl.d/arp.conf 
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2


[root@RS1 ~]# sysctl --system
[root@RS1 ~]# sysctl -p

2. 主机 KA1 KA2 中安装ipvsadm

yum install ipvsadm -y

3.配置keepalived 

virtual_server 172.25.250.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 172.25.250.110 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }

    real_server 172.25.250.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

[root@ka1 ~]# [root@ka1 ~]# systemctl restart keepalived.service 

[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.250.100:80 wrr
  -> 172.25.250.110:80            Route   1      0          0         
  -> 172.25.250.120:80            Route   1      0          0 

 4. 测试

 Note:别在server上测试 因为关闭了对外响应


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

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

参考配置文件:/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck

3.7.1 VRRP Script 配置

  • 定义脚本

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

  • 调用脚本

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

3.7.2 利用脚本实现主从角色切换

[root@ka1 ~]# vim /etc/keepalived/test.sh
[root@ka1 ~]# 
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
[root@ka1 ~]# cat /etc/keepalived/test.sh 
#!/bin/bash
[ ! -f "/etc/test" ]

创建文件后 脚本就会检测

ka1的VIP跑到了ka2上面 实现VIP转换

3.7.3 keepalived+haproxy的高可用集群

1 KA1、KA2 安装haproxy

[root@ka1 ~]# yum install haproxy -y

 2 配置haproxy 

#两台主机都要配置
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg

listen webserver
    bind 172.25.250.100:80
    mode http
    balance roundrobin
    server web1 172.25.250.110:80 check inter 3 fall 2 rise 5
    server web2 172.25.250.120:80 check inter 3 fall 2 rise 5

#直接复制过去
[root@ka1 ~]# scp /etc/haproxy/haproxy.cfg root@172.25.250.20:/etc/haproxy/haproxy.cfg 
root@172.25.250.20's password: 
haproxy.cfg                                                      100% 3348     3.6MB/s   00:00 

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

[root@ka1 ~]# vim /etc/sysctl.conf

[root@ka2 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

 4 KA1 和KA2   都要编写检测haproxy的脚本

[root@ka1 ~]# vim /etc/keepalived/haproxy.sh
[root@ka1 ~]# chmod +x /etc/keepalived/haproxy.sh 
[root@ka1 ~]# cat /etc/keepalived/haproxy.sh 
#!/bin/bash
killall -0 haproxy

 补充:最小化安装可能没有killall命令 需要下载

[root@ka1 ~]# yum install -y psmisc

5 两台主机keepalived的配置

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

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.250.10
    unicast_peer {
        172.25.250.20
    }
    track_script {
        check_haproxy
    }
}

 6 rs1 rs2

开启对外响应

测试   同时在客户端curl 172.25.250.100

 

当ka1停止haproxy服务后

 

ka1的VIP跑到了ka2上面  

 Note:为什么客服端还能curl通呢? 因为内核参数net.ipv4.ip_nonlocal_bind=1

net.ipv4.ip_nonlocal_bind=1 是一个 Linux 内核参数设置。

这个设置允许进程绑定到不属于本地接口的 IP 地址。


  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值