目录
一.keepalived简介
keepalived是一个用于实现高可用性的软件,主要用于在Linux系统上实现服务器的故障转移和负载均衡。它可以监控服务器的状态,并在主服务器出现故障时自动将流量切换到备份服务器,以确保服务的连续性和可用性。
keepalived的工作原理是通过VRRP(Virtual Router Redundancy Protocol)协议实现的。它将多台服务器组成一个虚拟路由器,其中一台服务器作为主服务器,负责处理流量,其他服务器作为备份服务器,监控主服务器的状态。当主服务器出现故障时,备份服务器会接管流量,成为新的主服务器。
除了故障转移,keepalived还支持负载均衡功能。它可以将流量分发到多台服务器上,以提高系统的性能和可扩展性。通过配置权重和调度算法,keepalived可以根据服务器的负载情况智能地分配流量。
总的来说,keepalived是一个简单而强大的工具,可以帮助管理员实现服务器的高可用性和负载均衡。它可以在不影响服务的情况下自动处理服务器故障,并提供可靠的服务。
二.keepalived的重要功能
keepalived具有以下几个重要功能:
故障转移:keepalived可以监控服务器的状态,当主服务器出现故障时,它可以自动将流量切换到备份服务器上,确保服务的连续性和可用性。
负载均衡:keepalived可以将流量分发到多台服务器上,以提高系统的性能和可扩展性。它可以根据服务器的负载情况智能地分配流量,并支持配置权重和调度算法。
健康检查:keepalived可以定期检查服务器的健康状态,例如检测服务器的网络连接、CPU负载、内存使用等。如果某个服务器不健康,keepalived可以将其从负载均衡池中移除,以避免将流量发送到故障的服务器上。
虚拟路由器:keepalived使用VRRP协议将多台服务器组成一个虚拟路由器。其中一台服务器作为主服务器,负责处理流量,其他服务器作为备份服务器,监控主服务器的状态。当主服务器故障时,备份服务器可以接管流量。
配置灵活性:keepalived提供了灵活的配置选项,可以根据实际需求进行配置。管理员可以定义故障转移的触发条件、备份服务器的优先级、负载均衡的调度算法等。
这些功能使得keepalived成为一个强大而灵活的工具,可以帮助管理员实现服务器的高可用性和负载均衡。
三.keepalived高可用故障转移的原理
keepalived通过VRRP(Virtual Router Redundancy Protocol)协议实现高可用故障转移。以下是keepalived高可用故障转移的原理:
主备服务器:keepalived将多台服务器组成一个虚拟路由器,其中一台服务器作为主服务器,其他服务器作为备份服务器。主服务器负责处理流量,备份服务器监控主服务器的状态。
VRRP协议:keepalived使用VRRP协议来实现主备服务器之间的通信和状态同步。VRRP协议定义了主备服务器之间的通信规则和状态转换机制。
虚拟IP地址:在keepalived配置中,给主备服务器分配了一个虚拟IP地址,该IP地址用于对外提供服务。客户端将流量发送到虚拟IP地址,而不是直接发送到主服务器。
心跳检测:备份服务器通过发送心跳包来监控主服务器的状态。主服务器定期发送心跳包,备份服务器接收到心跳包后确认主服务器的存活状态。
故障检测:如果备份服务器在一定时间内没有接收到主服务器的心跳包,就会认为主服务器发生故障。备份服务器会发起一次选举过程,选择一个备份服务器作为新的主服务器。
虚拟路由器切换:一旦新的主服务器选举出来,备份服务器会将虚拟IP地址绑定到新的主服务器上,然后将流量切换到新的主服务器上处理。
通过这种方式,keepalived可以实现在主服务器故障时自动将流量切换到备份服务器,从而实现高可用性的故障转移。整个过程是自动化的,不需要人工干预,可以保证服务的连续性和可用性。
四.keepalived原理
keepalived高可用架构图
keepalived工作原理描述
Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。
4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。
5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:
Keepalived高可用是通过 VRRP 进行通信的, VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在 Keepalived 服务之间,只有作为主的服务器会一直发送 VRRP 广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。
五. Keepalived高可用部署
准备工作
服务机说明 | 服务机名称 | ip | 系统 |
第一台 haproxy DR机 | H1.example.com | 192.168.187.128 | centos8 |
第二台 haproxy DR机 | H2.example.com | 192.168.187.131 | centos8 |
第一台 RS机 | RS1.example.com | 192.168.187.129 | centos8 |
第二台 RS机 | RS2.example.com | 192.168.187.140 | centos8 |
第一台与第二台 haproxy DR机 部署
两台haproxy DR机部署一致
# 1.关闭防火墙与selinux
[root@H1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@H1 ~]# setenforce 0
[root@H1 ~]# sed -i s/SELINUX=.*/SELINUX=disabled/ /etc/selinux/config
# 2.安装依赖
[root@H1 ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
# 3.创建haproxy用户
[root@H1 ~]# useradd -r -M -s /sbin/nologin haproxy
# 4.下载haproxy软件包
[root@H1 ~]# wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.10.tar.gz
[root@H1 ~]# ls
anaconda-ks.cfg haproxy-2.7.10.tar.gz
[root@H1 ~]# tar xf haproxy-2.7.10.tar.gz
[root@H1 ~]# ls
anaconda-ks.cfg haproxy-2.7.10 haproxy-2.7.10.tar.gz
[root@H1 ~]# cd haproxy-2.7.10
[root@H1 haproxy-2.7.10]# ls
addons CHANGELOG doc INSTALL Makefile scripts tests
admin CONTRIBUTING examples LICENSE README src VERDATE
BRANCHES dev include MAINTAINERS reg-tests SUBVERS VERSION
# 5.编译安装haproxy,详细阅读INSTALL,里面有安装操作
# 清理
[root@H1 haproxy-2.7.10]# make clean
# 编译
[root@H1 haproxy-2.7.10]# make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE=1 USE_SYSTEMD=1
# 安装时指定路径
[root@H1 haproxy-2.7.10]# make install PREFIX=/usr/local/haproxy
[root@H1 haproxy-2.7.10]# cd /usr/local/
[root@H1 local]# ls
bin etc games haproxy include lib lib64 libexec sbin share src
[root@H1 local]# cd haproxy/
[root@H1 haproxy]# ls
doc sbin share
# 6.方便启动haproxy,我们给它做一个软链接
[root@H1 haproxy]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/
[root@H1 haproxy]# which haproxy
/usr/sbin/haproxy
# 这样就能找到它了
# 7.配置各个负载的内核参数
[root@H1 haproxy]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
[root@H1 haproxy]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@H1 haproxy]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
# 8.使用harpoxy帮助文档
[root@H1 share]# pwd
/usr/local/haproxy/share
[root@H1 share]# ls
man
# 这里有一个man目录,但是目前还使用不了
# 编辑/etc/man_db.conf 文件,将当前路径下的man目录写入进去
MANDATORY_MANPATH /usr/local/haproxy/share/man ---接着22行按照模板写入路径
# 然后就可以用man帮助文档查看haproxy
# 9.创建haproxy目录,写入配置文件
[root@H1 share]# mkdir /etc/haproxy
[root@H1 share]# cd /etc/haproxy
[root@H1 share]# cat > /etc/haproxy/haproxy.cfg <<EOF
#--------------全局配置----------------
global
log 127.0.0.1 local0 info
#log loghost local0 info
maxconn 20480
#chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
#maxconn 4000
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option dontlognull
option httpclose
option httplog
#option forwardfor
option redispatch
balance roundrobin
timeout connect 10s
timeout client 10s
timeout server 10s
timeout check 10s
maxconn 60000
retries 3
#--------------统计页面配置------------------
listen admin_stats
bind 0.0.0.0:8189
stats enable
mode http
log global
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
stats auth admin:admin
#stats hide-version
stats admin if TRUE
stats refresh 30s
#---------------web设置-----------------------
listen webcluster
bind 0.0.0.0:80
mode http
#option httpchk GET /index.html
log global
maxconn 3000 # --- 监听http80端口,添加上2台RS主机的信息
balance roundrobin
cookie SESSION_COOKIE insert indirect nocache
server RS1 192.168.187.129:80 check inter 2000 fall 5
server RS2 192.168.187.140:80 check inter 2000 fall 5
#server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5
EOF
# 10.创建haproxy文件开机自启
[root@H1 haproxy]# cat > /usr/lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2
[Install]
WantedBy=multi-user.target
EOF
# 11.刷新
[root@H1 haproxy]# systemctl daemon-reload
# 设置开机自启haproxy
[root@H1 haproxy]# systemctl enable --now haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@H1 haproxy]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
# 80端口和8189端口起来了
# 12.创建日志并重启rsyslog
[root@H1 haproxy]# vim /etc/rsyslog.conf
# 在66行local7.* 的前面加上这一行,将haproxy日志添加进去
local0.* /var/log/harpoxy.log
# 重启rsyslog
[root@H1 haproxy]# systemctl restart rsyslog
RS机 部署
RS1 机 与 RS2 机 部署一致
# 1.部署httpd
[root@RS1 ~]# yum -y install httpd
# 2.启动httpd启并设置开机自启
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
# 3.往网页文件中写点内容
RS1 机写 "忘情天尊"
RS2 机写 "玄一大法师"
便于区分
这时就可以看到效果了,负载均衡配置完成
keepalived 安装
# 1.两台H DR机都要部署keepalived,我们将H1 DR机作为主节点
# 2.配置epel源
# 安装epel配置包
[root@H1 haproxy]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@H1 haproxy]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@H1 haproxy]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
# 3.下载keepalived
[root@H1 ~]# yum list all | grep keepalived
keepalived.x86_64 2.1.5-9.el8 @appstream
[root@H1 ~]# yum -y install keepalived
# 4.keepalived配置文件说明
keepalived 的主配置文件是 /etc/keepalived/keepalived.conf。其内容如下:
[root@H1 ~]# cat /etc/keepalived/keepalived.conf
! 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 LVS_DEVEL //定义路由标识信息,同局域网内唯一
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { //定义实例
state MASTER //指定keepalived节点的初始状态,可选值为MASTER|BACKUP
interface eth0 //VRRP实例绑定的网卡接口,用户发送VRRP包
virtual_router_id 51 //虚拟路由的ID,同一集群要一致
priority 100 //定义优先级,按优先级来决定主备角色,优先级越大越优先
nopreempt //设置不抢占
advert_int 1 //主备通讯时间间隔
authentication { //配置认证
auth_type PASS //认证方式,此处为密码
auth_pass 1111 //同一集群中的keepalived配置里的此处必须一致,推荐使用8位随机数
}
virtual_ipaddress { //配置要使用的VIP地址
192.168.200.16
}
}
virtual_server 192.168.200.16 1358 { //配置虚拟服务器
delay_loop 6 //健康检查的时间间隔
lb_algo rr //lvs调度算法
lb_kind NAT //lvs模式
persistence_timeout 50 //持久化超时时间,单位是秒
protocol TCP //4层协议
sorry_server 192.168.200.200 1358 //定义备用服务器,当所有RS都故障时用sorry_server来响应客户端
real_server 192.168.200.2 1358 { //定义真实处理请求的服务器
weight 1 //给服务器指定权重,默认为1
HTTP_GET {
url {
path /testurl/test.jsp //指定要检查的URL路径
digest 640205b7b0fc66c1ea91c463fac6334d //摘要信息
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3 //连接超时时间
nb_get_retry 3 //get尝试次数
delay_before_retry 3 //在尝试之前延迟多长时间
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 5.keepalived配置主节点,其它多余文件都用不到,直接删了
[root@H1 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id haproxy01
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 99
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456789
}
virtual_ipaddress {
192.168.187.200
}
}
virtual_server 192.168.187.200 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.187.128 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.187.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 启动keepalived服务并设置开机自启
[root@H1 keepalived]# systemctl enable --now keepalived
[root@H1 keepalived]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
# 它是没有端口显示的,但是已经启动了
# 5.备用节点配置
[root@H2 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id haproxy02
}
vrrp_instance VI_1 {
state BACKUP --- 类型是备用
interface ens160
virtual_router_id 99 ---- id一致
priority 90 --- 比主节点低
advert_int 1
authentication {
auth_type PASS
auth_pass 123456789 --- 密码一致
}
virtual_ipaddress {
192.168.187.200
}
}
--- 剩下的一致
virtual_server 192.168.187.200 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.187.128 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.187.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 启动keepalived服务并设置开机自启
[root@H2 keepalived]# systemctl enable --now keepalived
[root@H2 keepalived]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
# 6.查看主节点ip,vip在主节点上
[root@H1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:d8:60:da brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.187.128/24 brd 192.168.187.255 scope global dynamic noprefixroute ens160
valid_lft 1698sec preferred_lft 1698sec
inet 192.168.187.200/32 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed8:60da/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 7.但这时拿vip的ip访问,访问不出来
# 关闭备用节点的haproxy,然后访问vip,就可以访问出页面了
六.模拟主节点宕机效果
1.第一次关闭主节点的keepalived,vip被备用节点抢过去了,可以访问页面
然后开启主节点的keepalived,vip被主节点抢回来了,但是访问不了页面,需要关闭备用节点的haproxy
2.第二次关闭主节点的keepalived,vip被备用节点抢过去了,可以访问页面
然后开启主节点的keepalived,vip被主节点抢回来了,可以访问页面,不需要关闭备用节点的haproxy
之后的主节点宕机,备用节点都会抢占vip并且继续提供转发
然后主节点恢复也会将vip抢占回来,并可以直接提供转发
七.配置主节点宕机更换备用节点报警系统
主节点配置
# 1.编写主节点查询haproxy状态脚本
[root@H1 ~]# mkdir /scripts
[root@H1 ~]# cd /scripts
[root@H1 scripts]# vim check_haproxy.sh
[root@H1 scripts]# cat check_haproxy.sh
#! /bin/bash
haproxy_status=$(ps -ef | grep -Ev "grep|$0" | grep haproxy | wc -l)
if [ $haproxy_status -lt 1 ];then
systemctl stop keepalived
fi
[root@H1 scripts]# chmod +x check_haproxy.sh
# 2.编辑主节点配置文件如下
! Configuration File for keepalived
global_defs {
router_id haproxy01
}
vrrp_script haproxy_check { ------- 添加执行脚本
script "/scripts/check_haproxy.sh" ------ interval 1 执行时间为1s一次
interval 1
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 99
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456789
}
virtual_ipaddress {
192.168.187.200
}
track_script {
haproxy_check --------- 添加脚本名称
}
}
virtual_server 192.168.187.200 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.187.128 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.187.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 重启keepalived服务
[root@H1 scripts]# systemctl restart keepalived
# 3.测试
# haproxy服务与keepalived服务 现启动状态
[root@H1 scripts]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-10-13 03:04:45 EDT; 1s ago
Process: 49165 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
# 关闭haproxy服务,查询keepalived状态
[root@H1 scripts]# systemctl stop haproxy
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Fri 2023-10-13 03:05:14 EDT; 598ms ago
Process: 49165 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 49166 (code=exited, status=0/SUCCESS)
# haproxy服务关闭之后,脚本自动运行,关闭了keepalived服务
备用节点配置
# 1.创建查询haproxy进行数脚本
[root@H2 ~]# mkdir /scripts
[root@H2 ~]# cd /scripts
[root@H2 scripts]# vim notify.sh
[root@H2 scripts]# cat notify.sh
#!/bin/bash
case "$1" in
master)
haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [ $nginx_status -lt 1 ];then
systemctl start haproxy
fi
;;
backup)
haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [ $nginx_status -gt 0 ];then
systemctl stop haproxy
fi
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
[root@H2 ~]# chmod +x notify.sh
# 2.编辑keepalived配置文件
###
notify_master
notify_backup
是固定写法
当keepalived高可用连接不到主节点时,执行notify_master
当keepalived高可用恢复连接主节点时,执行notify_backup
[root@H2 scripts]# vim /etc/keepalived/keepalived.conf
[root@H2 scripts]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id haproxy02
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 99
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456789
}
virtual_ipaddress {
192.168.187.200
}
notify_master "/scripts/notify.sh master" ---- 加上两行
notify_backup "/scripts/notify.sh backup" master和backup参数执行脚本
}
virtual_server 192.168.187.200 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.187.128 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.187.131 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 重启keepalived服务
[root@H2 scripts]# systemctl restart keepalived
实验效果
手动关闭主节点haproxy服务,模拟宕机
# 1.正常状态
[root@H1 scripts]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-10-13 03:40:16 EDT; 2min 3s ago
Process: 54030 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
# 2.关闭主节点haproxy服务
[root@H1 scripts]# systemctl stop haproxy
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: deactivating (stop-sigterm) since Fri 2023-10-13 03:42:52 EDT; 581ms ago
Process: 54030 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
# haproxy服务关闭了,keepalived服务被执行的脚本关闭
# 3.查看备用节点
[root@H2 scripts]# ip a
......省略
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group
inet 192.168.187.200/32 scope global ens160
valid_lft forever preferred_lft forever
......省略
[root@H2 scripts]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
# vip出来了,haproxy服务端口号出来了
# 4.恢复主节点
[root@H1 scripts]# systemctl start haproxy
[root@H1 scripts]# systemctl start keepalived
# vip回来了
[root@H1 scripts]# ip a
......省略
valid_lft 1540sec preferred_lft 1540sec
inet 192.168.187.200/32 scope global ens160
......省略
# 5.备用节点haproxy服务自动关闭了
[root@H2 scripts]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@H2 scripts]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Fri 2023-10-13 03:46:23 EDT; 53min ago
Process: 52655 ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid (code=exited, status=0/SUCCESS)
八.部署zabbix报警,主节点宕机
实验准备
zabbix机 | ip | 系统 |
zabbix服务机 | 192.168.187.134 | centos8 |
zabbix用户机(H2 DR机) | 192.168.187.131 | centos8 |
实验说明
部署一台zabbix服务机 zabbix_server
在H1 DR机上部署zabbix_agentd
通过监控 H1 DR机 上vip是否存在来判断主节点是否宕机
我这里zabbix_server已经部署完成,详情参考博客
zabbix_agentd部署
# 1.我们在zabbix官网上下载zabbix_agent服务软件包
[root@H1 ~]# wget wget https://cdn.zabbix.com/zabbix/sources/stable/6.4/zabbix-6.4.6.tar.gz
[root@H1 ~]# tar xf zabbix-6.4.6.tar.gz
[root@H1 ~]# ls
anaconda-ks.cfg haproxy-2.7.10 haproxy-2.7.10.tar.gz zabbix-6.4.6.tar.gz zabbix-6.4.6
# 创建zabbix组与用户
[root@H1 ~]# groupadd --system zabbix
[root@H1 ~]# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
# 2.安装依赖
[root@H1 ~]# yum -y install gcc gcc-c++ make pcre-devel
# 3.编译
[root@H1 zabbix-6.4.6]# ./configure --enable-agent
***********************************************************
* Now run 'make install' *
* *
* Thank you for using Zabbix! *
* <http://www.zabbix.com> *
***********************************************************
# 立刻make install
[root@H1 zabbix-6.4.6]# make install
# 4.安装完成后可以在/usr/local/etc下看到agent的主配置文件
[root@H1 zabbix-6.4.6]# cd /usr/local/etc
[root@H1 etc]# ls
zabbix_agentd.conf zabbix_agentd.conf.d
# 编辑主配置文件
[root@H1 etc]# vim zabbix_agentd.conf
Server=192.168.187.134 # 指定zabbix服务端的ip
ServerActive=192.168.187.134 # 指定zabbix服务端的ip
Hostname=H1 # 自定义命名,以后在服务端用这个名字来连接这台主机
# 查看端口10050
[root@H1 etc]# zabbix_agentd
[root@H1 etc]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
zabbix控制机部署监控
编写脚本
# 1.编写脚本
[root@H1 ~]# mkdir /666
[root@H1 ~]# cd /666
[root@H2 666]# vim ip.sh
[root@H2 666]# cat ip.sh
#! /bin/bash
if [ `ip a | grep 192.168.187.200|wc -l` == 0 ];then
echo "1"
else
echo "0"
fi
[root@H1 scripts]# chmod +x ip.sh
# 2.在zabbix_agentd主配置文件中编写(这里直接写到最后面)
# 格式: #UserParameter=<key>,<shell command> 自定义键名加上脚本名
[root@H1 666]# vim /usr/local/etc/zabbix_agentd.conf
[root@H1 666]# tail -n1 /usr/local/etc/zabbix_agentd.conf
UserParameter=ip_vip,/bin/bash /666/ip.sh
# 重启zabbix_agentd服务
[root@H1 system]# pkill zabbix_agentd
[root@H1 system]# zabbix_agentd
# 3.在zabbix服务端测试
[root@c83 ~]# zabbix_get -s 192.168.187.128 -k ip_vip
1
# 因为这个时候我的主节点的haproxy服务是关闭的,所以192.168.187.200的ip,echo出一个1,表示错误
配置监控项
自定义触发规则
因为主节点的haproxy服务已经庇,所以30s会触发报警