随笔 - 50  文章 - 0  评论 - 0  阅读 - 3201

高可用解决方案-Keepalived

keepalived

1、安装

1.1 yum

# 环境准备
1、做ssh免密
2、基于hosts做解析,使用域名进行通信,或者使用内网dns解析
# 安装
yum -y install keepalived
rpm -ql 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

1.2 编译

wget https://keepalived.org/software/keepalived-2.2.8.tar.gz
./configure --prefix=/apps/keepalived --disable-fwmark # 禁用iptables
make && make install

2 、配置

/etc/keepalived/keepalived.conf

2.1 配置文件说明

1、global_defs
定义邮件配置,route_id,vrrp配置,多播地址等
2、vrrp_instance VI_1
定义每个vrrp虚拟路由器
3、virtual_server
定义lvs的vs和rs
# 查看详细说明
man keepalived.conf

2.2 配置详细说明

2.2.1 全局配置

global_defs {
	# 故障邮件通知配置
	notification_email {
		gquanheng@163.com
   	}
   	# 发邮件的地址 
   	notification_email_from 982561159@qq.com
   	smtp_server 127.0.0.1
   	smtp_connect_timeout 30 # 邮件服务器超时时间
   	router_id keepalived1 # keepalived主机表示,建议使用本主机名称
   	vrrp_skip_check_adv_addr # 如果收到的报文和上一个报文是同一个路由器则跳过检查报文中的源地址
   	vrrp_garp_interval 0 # 报文发送延迟
   	vrrp_mcast_group4 224.0.0.18 # 指定组播地址
   	vrrp_iptables # 和vrrp_strict同时开启时,则不会添加防火墙规则,若不配置vrrp_strict,则不用配置

2.2.2 虚拟路由

vrrp_instance  str { #<Str>为vrrp的实例名,一般为业务名称
	state MASTER|BACKUP # 当前节点的初始化状态 主|从
	interface IFACE_NAME # vip绑定在哪个网卡
	virtual_router_id VRID # 每个机器的id都不一样
	priority 100 # vip在机器的优先级
	advert_int 1 # vrrp通信间隔
	authentication { #认证机制
		auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
		auth_pass <PASSWORD> #预共享密钥,仅前8位有效,同一个vip的多个keepalived节点必须一样
	}
	virtual_ipaddress {
		192.168.200.102/24 dev eth2 label eth2:1 #指定VIP的绑定网卡label
	}
}

2.2.3 日志启用

vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
vim /etc/rsyslog.conf
local6.*	/var/log/keepalived.log

2.2.4 开启子配置文件

实现可插拔式的配置管理,方便使用
mkdir /etc/keepalived/conf.d
echo >> include /etc/keepalived/conf.d/*.conf /etc/keepalived/keepalived.conf

2.2.5 ipvs设置

2.2.5.1 vs设置

# vs
virtual_server IP port{ #定义虚拟主机IP地址及其端口
	delay_loop <INT>	#检查后端服务器的时间间隔,单位s
	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> # 备用服务器
	real_server{	
		weight <INT> #指定权重
		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{ # 七层检测
			url {
				path <URL_PATH>	#定义要监控的URL
				status_code <INT>	#判断上述检测机制为健康状态的响应码,一般为 200
			}
			connect_timeout <INTEGER> # 请求超时时间
			nb_get_retry <INT> # 重试次数
			delay_before_retry <INT> #重试之前的间隔
			connect_ip <IP ADDRESS> # 针对后端rs的哪个ip进行探测
			connect_port <PORT>	#针对后端rs的哪个端口进行探测
			bindto <IP ADDRESS>	#向当前RS发出健康状态检测请求时使用的源地址
			bind_port <PORT>	#向当前RS发出健康状态检测请求时使用的源端口
		}
		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
		}
	}
	real_server{
	}
}
# vsgroup
# 定义多个vs将其组合起来同一对外提供服务
virtual_server_group VSG_1 { # 定义一个组
	10.0.0.1 8080
	10.0.0.2 80
	192.168.200.1 1358
	192.168.200.3-10 80
	fwmark 1 # #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
	fwmark 2 
}

virtual_server group VSG_1 { # 使用组提供服务,后端是200.1和200.2
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.1 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

2.2.6 VRRP Script 配置

通过自定义脚本,来监控指定应用的状态,一旦发生情况,自动将vip进行切换

2.2.6.1 定义脚本

vrrp_script <SCRIPT_NAME> { # 定义在全局配置之外
    script <STRING>|<QUOTED-STRING> # 指定脚本路径
    interval <INTEGER> # 探测间隔时间默认1s
    timeout <INTEGER> # 超时时间
    weight <INTEGER:-254..254> # 当脚本返回值非0时会将其与此值相加,作为权重,通常设为负数
    fall <INTEGER> # 连续探测几次失败将其视为失败
    rise <INTEGER> # 连续探测成功几次将其视为成功
    user USERNAME [GROUPNAME]	#执行监测脚本的用户或组
    init_fail ##设置默认标记为失败状态,监测成功之后再转换为成功状态
}
# 例子

2.2.6.2 调用脚本

vrrp_instance{
	track_script {
		<SCRIPT_NAME>
	}
}

3、应用

3.1 实现主从架构

# master配置
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 keepalived1
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance NGINX {
    state MASTER
    interface ens33
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.10.3 dev ens33 label ens33:1
    }
}
# backup配置 (多从,配置多个即可)
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 keepalived2
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance NGINX {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.10.3 dev ens33 label ens33:1
    }
}
# 验证
ip a 
主节点服务停掉,从节点执行ip a, 观察到节点ip 可以实现漂移
恢复服务后重新ip a查看可以看到vip又回到了主节点

3.2 通知脚本配置

3.2.1 脚本用户配置

global_defs {
	script_user <USER>
}

3.2.2 脚本类型

配置zai vrrp块

3.2.2.1 节点成为主节点时触发的脚本

notify_master /etc/keepalived/notify.sh master

3.2.2.2 节点转为备节点时触发的脚本

notify_backup /etc/keepalived/notify.sh backup

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

notify_fault /etc/keepalived/notify.sh fault

3.2.2.4 通用脚本

notify /etc/keepalived/notify.sh

3.2.2.5 停止VRRP时触发的脚本

notify_stop /etc/keepalived/notify.sh stop

3.2.2.6 脚本参考

#!/bin/bash
#
contact='gquanheng@163.com' # 要发送邮件的对象

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
	;;
stop)
	notify stop
	;;
*)
	echo "Usage: $(basename $0) {master|backup|fault}"
	exit 1
	;;
esac

3.3 双主架构

由于主从架构会造成其中一个节点资源闲置,配置两个以上vip实现双主架构,其它们互为主从
# 节点1
vrrp_instance NGINX {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.10.3 dev ens33 label ens33:1
    }
}
vrrp_instance Kubernetes {
    state MASTER
    interface ens33
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.10.4 dev ens33 label ens33:2
    }
}
# 节点2
vrrp_instance NGINX {
    state MASTER
    interface ens33
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.10.3 dev ens33 label ens33:1
    }
}

vrrp_instance Kubernetes {
    state BACKUP
    interface ens33
    virtual_router_id 61
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.10.4 dev ens33 label ens33:2
    }
}

4、优化

4.1 抢占模式策略

4.1.1 关闭抢占模式

由于默认启用抢占模式,当主节点故障恢复后会立马抢占从节点的vip可能造成波动
vim /etc/keepalived/keepalived.conf
state BACKUP # 将所有节点都改为从
nopreempt # 在vrrp块配置此选项

4.1.2 抢占延迟

vim /etc/keepalived/keepalived.conf
state BACKUP # 将所有节点都改为从
priority 100 # 优先级100
preempt_delay 60 # 高优先级的设置抢占延迟 单位为s

4.2 广播配置

keepalived使用广播进行互相通过消息,可以替换为单播,减少网络拥塞
# 全局配置
# vrrp_strict 关闭此选项
# vrrp块
unicast_src_ip $ip #发送单播的源ip
unicast_peer {
	$ip 	#指定接收单播的对方目标主机IP
	......
}
posted on   要快乐不要emo  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示