小丑的个人博客

记录精彩的学习过程

  menu
17 文章
0 浏览
ღゝ◡╹)ノ❤️

keepalived

高可用集群概念

集群类型:


LB(Load Balance) #lvs/HAProxy/nginx(http/upstream, stream/upstream)
HA(High Availability) #高可用集群,数据库、Zookeeper、Redis 
	SPoF: Single Point of Failure,解决单点故障
HPC #高性能集群(High Performance Computing) https://www.top500.org


系统可用性:SLA(Service-Level Agreement)

95%=(60*24*30)*(1-0.9995)
(指标)=99.9%, ..., 99.999%,99.9999%

系统故障:

硬件故障:设计缺陷、wear out(损耗)、自然灾害......
软件故障:设计缺陷

提升系统高用性的解决方案之降低MTTR- Mean Time To Repair(平均故障时间)


	解决方案:建立冗余机制
	active/passive 主/备
	active/active 双主
	active --> HEARTBEAT --> passive
	active <--> HEARTBEAT <--> active

高可用的是"服务"

HA nginx service:
	vip/nginx process[/shared storage]
资源:组成一个高可用服务的“组件”
(1) passive node的数量
(2) 资源切换

shared storage

NAS(Network Attached Storage):网络附加存储,基于网络的共享文件系统。
SAN(Storage Area Network):存储区域网络,基于网络的块级别的共享

Network partition:网络分区

quorum:法定人数
	with quorum: > total/2
	without quorum: <= total/2

隔离设备: fence

node:STONITH = Shooting The Other Node In The Head(强制下线/断电)
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/high_availability_addon_reference/s1-unfence-haar

双节点集群(TWO nodes Cluster)

辅助设备:ping node, quorum disk(仲裁设备)
	Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作
	Failback:故障移回,即某资源的主节点故障后重新修改上线后,将之前已转移至其它节点的资源重新切回的过程

HA Cluster实现方案:

AIS(Applicaiton Interface Specification)应用程序接口规范
	RHCS:Red Hat Cluster Suite红帽集群套件
	heartbeat:基于心跳监测实现服务高可用
	pacemaker+corosync:资源管理与故障转移
	vrrp(Virtual Router Redundancy Protocol):虚拟路由冗余协议,解决静态网关单点风险
	软件层—keepalived
	物理层—路由器、三层交换机

高可用集群-后端存储

https://access.redhat.com/documentation/zhcn/red_hat_enterprise_linux/5/html/cluster_suite_overview/s1-rhgfs-overview-cso

image-20211210152441511

JBOD ( Just a Bunch Of Disks )不是标准的 RAID 等级,它通常用来表示一个没有控制软件提供协调控制的磁盘集合, JBOD 将多个物理磁盘串联起来,提供一个巨大的逻辑磁盘, JBOD 的数据存放机制是由第一块磁盘开始按顺序往后存储,当前磁盘存储空间用完后,再依次往后面的磁盘存储数据, JBOD 存储性能完全等同于单块磁盘,而且也不提供数据安全保护,它只是简单提供一种扩展存储空间的机制, JBOD 可用存储容量等于所有成员磁盘的存储空间之和。

NAS(Network Attached Storage): 网络附加存储,基于网络的共享文件系统

SAN(Storage Area Network):存储区域网络,基于网络的块基本的共享

image-20211210152441511

Keepalived简介

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

VRRP-网络层实现

image-20211210153154368

KeepAlived 组成

组件:

用户空间核心组件:
			vrrp stack-VIP消息通告
			checkers-监测real server
			system call-标记real server权重
			SMTP-邮件组件
			ipvs wrapper-生成IPVS规则
			Netlink Reflector-网络接口
			WatchDog-监控进程
	控制组件:配置文件解析器
	IO复用器
	内存管理组件
http://keepalived.org/documentation.html

image-20211210153318128

keepalived:
vrrp协议:Virtual Router Redundancy Protocol
术语:
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
物理路由器:
master:主设备
backup:备用设备
priority:优先级
VIP:Virtual IP=vip
VMAC:Virutal MAC (00-00-5e-00-01-VRID)

通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式,抢占延迟
安全工作:
认证:
无认证
简单字符认证:预共享密钥

工作模式:
主/备:单虚拟路由器
主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

keepAlived 配置

环境准备

各节点时间必须同步
关闭selinux和防火墙

echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p

Keepalived安装

Keepalived安装:
# yum install keepalived (CentOS)
# apt-get install keepalived (Ubuntu)

源码编译:

# 安装编译环境
yum install -y gcc openssh-server openssh-clients openssl openssl-devel libnl3-devel libnl3 make 

cd /usr/local/src
wget https://keepalived.org/software/keepalived-2.2.4.tar.gz
tar xf keepalived-2.2.4.tar.gz
./configure  --prefix=/apps/keepalived  --disable-fwmark
# --disable-fwmark 关闭防火墙标记功能

 make && make install
 
 mkdir /etc/keepalived
 
 cp ./keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

程序环境

程序环境:
	主配置文件:/etc/keepalived/keepalived.conf
	主程序文件:/usr/sbin/keepalived
	Unit File:
		/usr/lib/systemd/system/keepalived.service (CentOS)
		/lib/systemd/system/keepalived.service (Ubuntu)

	Unit File的环境配置文件:
		/etc/sysconfig/keepalived

配置文件组件部分

TOP HIERACHY
GLOBAL CONFIGURATION
	Global definitions

VRRP CONFIGURATION
	VRRP instance(s):即一个个的vrrp虚拟路由器

LVS CONFIGURATION
	Virtual server group(s)
	Virtual server(s):ipvs集群的vs和rs

配置语法

配置虚拟路由器:

配置虚拟路由器:
vrrp_instance <STRING> {
....
}

配置参数
state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口 ens32,eth0,bond0,br0
virtual_router_id VRID:当前虚拟路由器惟一标识,范围是0-255 # MASTER和BACKUP的值需要一样
priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254
advert_int 1:vrrp通告的时间间隔,默认1s


authentication { #认证机制
	auth_type AH|PASS
	auth_pass <PASSWORD> # 仅前8位有效
}

virtual_ipaddress { #虚拟IP
	<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
	192.168.200.17/24 dev eth1
	192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
	eth0
	eth1
	…
}


组播配置示例-MASTER

默认为抢占模式

组播配置示例-MASTER
global_defs {
	notification_email {
		root@localhost #keepalived 发生故障切换时邮件发送的对象,可以按行区分写多个
	}
	notification_email_from keepalived@localhost
	smtp_server 127.0.0.1
	smtp_connect_timeout 30
	router_id ha1.example.com
	vrrp_skip_check_adv_addr #所有报文都检查比较消耗性能,此配置为如果收到的报文和上一个报文是同一个路由器则跳过检查报文中的源地址
	vrrp_strict #严格遵守VRRP协议,不允许状况:1,没有VIP地址,2.配置了单播邻居,3.在VRRP版本2中有IPv6地址.
	vrrp_garp_interval 0 #ARP报文发送延迟
	vrrp_gna_interval 0 #消息发送延迟
	vrrp_mcast_group4 224.0.0.18 #默认组播IP地址,224.0.0.0到239.255.255.255
	#vrrp_iptables  # yum安装会自动生成防火墙策略,可以删除或禁止生成
} 

vrrp_instance VI_1 {
	state MASTER
	interface eth0
	virtual_router_id 80  # MASTER和BACKUP的值需要一样
	priority 100
	advert_int 1

	authentication {
		auth_type PASS
		auth_pass 1111qwer
	}
	virtual_ipaddress {
		192.168.7.248 dev eth0 label eth0:0   # 这里也可以直接一个ip地址
	}
}




组播配置示例-BACKUP


global_defs {
	notification_email {
		root@localhost
	}
	notification_email_from keepalived@localhost
	smtp_server 127.0.0.1
	smtp_connect_timeout 30
	router_id ha2.example.com
	vrrp_skip_check_adv_addr #
	vrrp_strict #严格遵守VRRP协议。
	vrrp_garp_interval 0 #ARP报文发送延迟
	vrrp_gna_interval 0 #消息发送延迟
	vrrp_mcast_group4 224.0.0.18 #组播IP地址,224.0.0.0到239.255.255.255
	#vrrp_iptables  # yum安装会自动生成防火墙策略,可以删除或禁止生成
}

vrrp_instance VI_1 {
	state BACKUP
	interface eth0
	virtual_router_id 80  # MASTER和BACKUP的值需要一样
	priority 90
	advert_int 1

	authentication {
		auth_type PASS
		auth_pass 1111qwer
	}
	virtual_ipaddress {
		192.168.7.248 dev eth0 label eth0:0  # 这里也可以直接一个ip地址
	}
}

VIP 测试

# iptables -D INPUT -s 0.0.0.0/0 -d 192.168.7.248 -j DROP #yum安装会自动生成防火墙策略,可以删除或禁止生成(vrrp_iptables)

tcpdump -i ens32 -nn host 224.0.0.18

image-20211210220901317

ping 192.168.119.248

非抢占

nopreempt #关闭VIP抢占,需要各keepalived服务器state为BACKUP
vrrp_strict #严格遵守VRRP协议。 这个选项需要注释掉
	vrrp_instance VI_1 {
		state BACKUP
		interface eth0
		virtual_router_id 88
		priority 100
		advert_int 1
		nopreempt

	vrrp_instance VI_1 {
		state BACKUP
		interface eth0
		virtual_router_id 88
		priority 80
		advert_int 1
		nopreempt

抢占延迟模式

默认就是抢占模式

preempt_delay 60s #抢占延迟模式,默认延迟300s,需要各keepalived服务器state为BACKUP
	vrrp_instance VI_1 {
		state BACKUP
		interface eth0
		virtual_router_id 88
		priority 100
		advert_int 1
		preempt_delay 60s #抢占延迟模式,默认延迟300s

	vrrp_instance VI_1 {
		state BACKUP
		interface eth0
		virtual_router_id 88
		priority 80
		advert_int 1

VIP单播配置及示例

vrrp_instance VI_1 {
	...
	unicast_src_ip #指定单播的源IP
	unicast_peer { #指定单播的对方IP
		目标主机IP
	}
	...
}
[root@s2 ~]# tcpdump -i eth0 host -nn 192.168.119.101 and host 192.168.119.102

Keepalivde 双主配置

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

Keepalived通知配置

发件人配置:
[root@localhost ~]# yum install mailx -y
[root@localhost ~]# vim /etc/mail.rc

set from=61864003@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=61864003@qq.com
set smtp-auth-password=rwgleepbciexbjhh
set smtp-auth=login
set ssl-verify=ignore

定义通知脚本:


notify_master <STRING>|<QUOTED-STRING>:
	当前节点成为主节点时触发的脚本
notify_backup <STRING>|<QUOTED-STRING>:
	当前节点转为备节点时触发的脚本
notify_fault <STRING>|<QUOTED-STRING>:
	当前节点转为“失败”状态时触发的脚本
notify <STRING>|<QUOTED-STRING>:
	通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

Keepalived通知脚本

[root@localhost keepalived]# cat /etc/keepalived/notify.sh
#!/bin/bash
contact='61864003@qq.com'
notify() {
	mailsubject="$(hostname) to be $1, vip 转移"
	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

脚本的调用方法:

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

停止keepalived服务,验证IP 切换后是否收到通知邮件:

KeepAlived与IPVS

虚拟服务器配置参数:
virtual server (虚拟服务)的定义:
virtual_server IP port #定义虚拟主机IP地址及其端口
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string #将多个虚拟服务器定义成组,将组定义成虚拟服务

virtual_server IP port
{
	...
		real_server {
		...
	}
		…
}
delay_loop <INT>: # 检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh:# 定义调度方法
lb_kind NAT|DR|TUN: # 集群的类型
persistence_timeout <INT>:# 持久连接时长
protocol TCP|UDP|SCTP:# 指定服务协议
sorry_server <IPADDR> <PORT>: # 所有RS故障时,备用服务器地址
real_server <IPADDR> <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_CHEC K { ... }:# 定义当前主机的健康状态检测方法
}

应用层监测

HTTP_GET|SSL_GET:应用层检测

HTTP_GET|SSL_GET {
	url {
		path <URL_PATH>:定义要监控的URL
		status_code <INT>:判断上述检测机制为健康状态的响应码
	}

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>:发出健康状态检测请求时使用的源地址
bind_port <PORT>:发出健康状态检测请求时使用的源端口
}

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
}

Keepalived案例一:实现LVS-DR模式

准备web服务器并使用脚本绑定VIP至web服务器lo网卡

配置keepalived

virtual_server 192.168.119.188 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #persistence_timeout 120 #会话保持时间
    protocol TCP
    #sorry_server 172.18.200.105 80
    real_server 192.168.119.103 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 60
            nb_get_retry 3
            delay_before_retry 1
            connect_port 80
        }
    }
    real_server 192.168.119.104 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 60
            nb_get_retry 3
            delay_before_retry 1
            connect_port 80
        }
    }
}
# 一行不能写两个大括号(  }}  ),不然ipvs不能加上配置,配置文件对缩进没有要求。

ipvs DR模式初始化脚本

这个脚本要放到后端服务器上执行

#!/bin/sh   
#LVS DR模式初始化脚本
#2017-08-18 
LVS_VIP=192.168.119.188	# 这里设置VIP的地址
source /etc/rc.d/init.d/functions  
case "$1" in  
start)  
       /sbin/ifconfig lo:0 $LVS_VIP netmask 255.255.255.255 broadcast $LVS_VIP  
       /sbin/route add -host $LVS_VIP dev lo:0  
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore  
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce  
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore  
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce  
       sysctl -p >/dev/null 2>&1  
       echo "RealServer Start OK"  
       ;;  
stop)  
       /sbin/ifconfig lo:0 down  
       /sbin/route del $LVS_VIP >/dev/null 2>&1  
       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_ignore  
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce  
       echo "RealServer Stoped"  
       ;;  
*)  
       echo "Usage: $0 {start|stop}"  
       exit 1  
esac  
exit 0


测试web访问

# while true;do curl http://192.168.119.188 && sleep 1;done
ipvsadm -L -n --stats

real_server http监测

real_server 192.168.7.103 80 {
	weight 1
	HTTP_GET {
		url {
			path /index.html
			status_code 200
		}
	}
	connect_timeout 5
	nb_get_retry 3
	delay_before_retry 3
}

VRRP Script

keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作,脚本可被多个实例调用。
track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
分两步:(1) 先定义一个脚本;(2) 调用此脚本

vrrp_script <SCRIPT_NAME> {
	script <STRING>|<QUOTED-STRING>
	OPTIONS
}
track_script {
	SCRIPT_NAME_1
	SCRIPT_NAME_2
}
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
	script <STRING>|<QUOTED-STRING> # shell命令或脚本路径
	interval <INTEGER> # 间隔时间,单位为秒,默认1秒
	timeout <INTEGER> # 超时时间
	weight <INTEGER:-254..254> # 权重,监测失败后会执行权重相加,权重可以为负数即相加后降低本机权重
	fall <INTEGER> #脚本几次失败转换为失败
	rise <INTEGER> # 脚本连续监测成功后,把服务器从失败标记为成功的次数
	user USERNAME [GROUPNAME] # 执行监测的用户或组
	init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
vrrp_script chk_down { #基于第三方仲裁设备
	script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 7 || exit 0"
	interval 1
	weight -80
	fall 3
	rise 5
	timeout 2
}

vrrp_instance VI_1 {
…
	track_script {
	chk_down
	}
}

touch /etc/keepalived/down #当存在此仲裁设备时发生故障迁移,适用场景:在backup服务器探测文件是否存在,当master运行正常的时候没有此文件,当master异常的时候生成此文件,然后将backup服务器的优先级设置高于master,从而将VIP接管到backup服务器

vrrp_script chk_down {
	script “/bin/bash -c ‘[[ -f /etc/keepalived/device/down ]]’ && exit 0 || exit 7“ #成功退出为0
	interval 1
	weight +80
	fall 3
	rise 5
	timeout 2
}

高可用HAProxy

vrrp_script chk_haproxy {   # 这个配置段和vrrp_instance 平级
	script "/etc/keepalived/chk_haproxy.sh"
	interval 1
	weight -80
	fall 3
	rise 5
	timeout 2
}

track_script {  # 这个配置段放在vrrp_instance配置段里面
	chk_haproxy
}


[root@s1 ~]# yum install psmisc -y
[root@s1 ~]# cat /etc/keepalived/chk_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
[root@s1 ~]# chmod a+x /etc/keepalived/chk_haproxy.sh

高可用Nginx

vrrp_script chk_nginx {   # 这个配置段和vrrp_instance 平级
	script "/etc/keepalived/chk_nginx.sh"
	interval 1
	weight -80
	fall 3
	rise 5
	timeout 2
}

track_script { # 这个配置段放在vrrp_instance配置段里面
	chk_nginx
}

[root@s1 ~]# yum install psmisc -y
[root@s1 ~]# cat /etc/keepalived/chk_nginx.sh
#!/bin/bash
/usr/bin/killall -0 nginx
[root@s1 ~]# chmod a+x /etc/keepalived/chk_nginx.sh

练习:

keepalived 高可用性IPVS集群,IPVS集群提供php,如phpwind
Keepalived 双主Nginx或者HAProxy
vrrp_script 高可用性Nginx

1、编译安装keepalived。
2、实现keepalived(20+ vip)+nginx 双主高可用。
3、实现keepalived(60+ vip)+haproxy 三服务器高可用。
4、实现keepalived(100+ vip)+LVS高可用、real server状态监测及规则管理。

1.编译安装HAProxy较新 LTS版本.,选择编译安装keepalived。
2.开启HAProxy多进程,进程数与CPU核心数保持一致并实现HAProxy进程绑定。
3.因业务较多避免配置文件误操作,需要按每业务一个配置文件并统一保存至/etc/haproxy/conf 目录中。 -f /etc/haproxy/conf
4.实现keepalived include导入配置文件功能,使用LVS-DR模型代理后端Nginxweb服务器。
5.基于ACL实现单IP多域名负载功能(适用于企业较少公网IP多域名场景)。
6.实现MySQL主从复制,并通过HAProxy对MySQL进行反向代理。
7.最终完成HAProxy+Nginx+Tomcat+ Redis,并实现session会话保持统一保存到Redis。

负载均衡与web实战案例

image-20211210162431618

安装

yum install keepalived -y

配置文件介绍

keepalived配置文件 /etc/keepalived/keepalived.conf

GLOBAL CONFIGURATION --- 全局配置部分

VRRPD CONFIGURATION --- VRRP协议配置部分

LVS CONFIGURATION --- LVS 服务管理配置部分

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

global_defs {				# 全局配置部分
   router_id LVS_DEVEL		# router id (高可用集群主机身份表示,集群中主机身份标识名称不能重复。)
}

vrrp_instance test {		# vrrp 相关配置(vrrp实例配置)   ###  vrrp协议家族   test
    state MASTER		# 标识所在家族中的身份(MASTER/BACKUP)
    interface eth0		# 指定虚拟ip地址出现在什么网卡上
    virtual_router_id 51	# 标识家族身份信息,多台高可用服务配置要一致
    priority 100			# 设定优先级   数字大优先
    advert_int 1			# 定义组播包发送的时间间隔(秒)主备配置需要一样
    authentication {		# 通讯认证	实现通讯需要有认证过程
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {	# 配置虚拟IP地址信息
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

示例配置:

lb01:

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

global_defs {
   router_id lb01
}

vrrp_instance test {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

lb02:

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

global_defs {
   router_id lb02
}

vrrp_instance test {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

启动服务:systemctl restart keepalived

实现keepalived服务自动释放vip地址

nginx + keepalived: nginx 服务停止,keepalived 也必须停止

[root@lb01 scripts]# cat check_web.sh 

#!/bin/bash
num=`ps aux |grep -c nginx `
echo $num
if [ $num -lt 3 ];then
	systemctl stop keepalived 
fi

实时监控nginx服务状态

vrrp_script check_web {
script "/server/scripts/check_web.sh"		# 定义要监控的脚本(脚本是执行权限)
interval 2			# 执行 脚本的间隔时间 (秒)
weight 2			# 
}

track_script {
check_web			# 调用执行脚本信息
}

track_script 段要放在vrrp段里

高可用双主配置

lb01:

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

global_defs {
   router_id lb01
}

vrrp_instance test01 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 105
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/32
    }
}
vrrp_instance test02 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/32
    }
}

lb02:

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

! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance test01 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/32
    }
}
vrrp_instance test02 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 105
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/32
    }
}

上述配置需要注意一下配置

vrrp instance NAME

state MASTER|BACKUP

virtual_router_id NUMBER

priority NUMBER

virtual_ipaddress 配置段

NGINX不能监听本地不存在的IP地址

解决办法:

echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p

# 临时解决办法:
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind

开启日志功能:

[root@proxy1 keepalived]# vim /etc/sysconfig/keepalived 
KEEPALIVED_OPTIONS="-D -S 3"

vim /etc/rsyslog.conf
local3.*        /var/log/keepalived.log

示例通知脚本

[root@proxy1 keepalived]# cat notify.sh 
#!/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

标题:keepalived
作者:harbor
地址:http://www.ipfshyys.com/articles/2022/12/22/1671686662468.html