Linux系统集群部署模块之Keepalived双机热备

目录

概述

一、keepalived安装

二、配置文件

三、 其他配置项说明

四、名词解释

五、高阶使用

1、介绍

2、keepalived主要作用

3、工作在三层、四层和七层原理

4、健康状态检测方式

4.1 HTTP服务状态检测

4.2 TCP端口状态检测(使用TCP端口服务基本上都可以使用)

4.3 邮件服务器SMTP检测

4.4 用户自定义脚本检测real_server服务状态

5、状态转换通知功能

5.1 实例状态通知

5.2 虚拟服务器检测通知

六、项目实际中配置


概述

Keepalived是一个基于VRRP协议(虚拟冗余路由协议)来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息(心跳检测,heartbeat)给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。

一、keepalived安装

[root@web1 ~]# yum install -y epel-release
[root@web1 ~]# yum install keepalived nginx

配置并启动

[root@web2 keepalived]# echo web2 > /usr/share/nginx/html/index.html 
[root@web2 keepalived]# systemctl enable --now  keepalived.service nginx.service 

验证

[root@web1 keepalived]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:c8:dc:33 brd ff:ff:ff:ff:ff:ffinet 192.168.115.111/24 brd 192.168.115.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.115.250/32 scope global ens33
##停掉master查看backup
[root@web1 keepalived]# systemctl stop  keepalived.service
[root@web2 keepalived]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:8a:4a:79 brd ff:ff:ff:ff:ff:ffinet 192.168.115.112/24 brd 192.168.115.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.115.250/32 scope global ens33

二、配置文件

global_defs {notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个sysadmin@fire.loc}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人smtp_server localhost #指定smtp服务器地址smtp_connect_timeout 30 #指定smtp连接超时时间router_id LVS_DEVEL #运行keepalived机器的一个标识
}
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
inside_network #实例名
outside_network
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
notify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}

Keepalived在转换状态时会依照状态来呼叫:

  • 当进入Master状态时会呼叫notify_master

  • 当进入Backup状态时会呼叫notify_backup

  • 当发现异常情况时进入Fault状态呼叫notify_fault

vrrp_instance inside_network {state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备靠priority决定interface eth0 #设置实例绑定的网卡 VRRP心跳包从哪块网卡发出dont_track_primary #忽略vrrp的interface错误(默认不设置)track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换eth1eth2}mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ipgarp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求virtual_router_id 50 #VPID标记 相同VRID的LVS属于同一组,根据优先级选举出一个主priority 99 #优先级,高优先级竞选为masteradvert_int 10 #检查间隔,默认1秒 VRRP心跳包(报文)的发送周期,单位为s 组播信息发送间隔,两个节点设置必须一样(实际并不一定完全是10秒,测试结果是小于10秒的随机值)nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高

首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。

 preempt_delay #抢占延时,默认5分钟debug #debug级别authentication { #设置认证auth_type PASS #认证方式auth_pass 111111 #认证密码(密码只识别前8位)}virtual_ipaddress { #设置vip192.168.202.200}
}
virtual_server 192.168.202.200 23 {delay_loop 6 #健康检查时间间隔(实际并不一定完全是6秒,测试结果是小于6秒的随机值?)lb_algo rr  #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dhlb_kind DR  #负载均衡转发规则NAT|DR|TUNpersistence_timeout 5 #会话保持时间protocol TCP #使用的协议persistence_granularity <NETMASK> #lvs会话保持粒度virtualhost <string> #检查的web服务器的虚拟主机(host:头)   sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用real_server 192.168.200.5 23 {weight 1 #默认为1,0为失效inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除notify_up <string> | <quoted-string> #在检测到server up后执行脚本notify_down <string> | <quoted-string> #在检测到server down后执行脚本TCP_CHECK {connect_timeout 3 #连接超时时间nb_get_retry 3 #重连次数delay_before_retry 3 #重连间隔时间connect_port 23  #健康检查的端口的端口bindto <ip>  #检查的IP地址}HTTP_GET | SSL_GET{url{ #检查url,可以指定多个path /digest <string> #检查后的摘要信息status_code 200 #检查的返回状态码,301 302 }connect_port <port>bindto <IPADD>connect_timeout 5nb_get_retry 3delay_before_retry 2}
​SMTP_CHECK{host{connect_ip <IP ADDRESS>connect_port <port> #默认检查25端口bindto <IP ADDRESS>}connect_timeout 5retry 3delay_before_retry 2helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选}MISC_CHECK{misc_path <string> | <quoted-string> #外部脚本路径misc_timeout #脚本执行超时时间misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2}}

三、 其他配置项说明

keepalived 的核心就是将IPVS配置成高可用,生成ipvs规则来完成负载均衡效果

  • virtual server (虚拟服务)的定义:

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

  • virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群

  • virtual_server group string #将多个虚拟服务器定义成组,将组定义成虚拟服务

  • lb_algo{rr|wrr|lc|wlc|lblc|lblcr} #定义LVS的调度算法

  • lb_kind {NAT|DR|TUN} #定义LVS的模型

  • presitence_timeout #定义支持持久连接的时长

  • protocol TCP #规则所能支持的协议

  • sorry_server #如果所有real_server都出现故障了,利用此返回信息

四、名词解释

虚拟路由器: 由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关;

VRID:虚拟路由器的标识。有相同VRID的一组路由器构成一个虚拟路由器;

Master路由器:虚拟路由器中承担报文转发任务的路由器;

Backup路由器 :Master路由器出现故障时,能够代替Master路由器工作的路由器;

虚拟IP 地址:虚拟路由器的IP 地址。一个虚拟路由器可以拥有一个或多个IP地址;

IP地址拥有者: 接口IP地址与虚拟IP地址相同的路由器被称为IP地址拥有者;

虚拟MAC地址: 一个虚拟路由器拥有一个虚拟MAC地址。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址;

优先级VRRP根据优先级来确定虚拟路由器中每台路由器的地位;

非抢占方式如果Backup路由器工作在非抢占方式下,则只要Master路由器没有出现故障,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器;

抢占方式:如果Backup路由器工作在抢占方式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器;否则,将保持Backup状态

五、高阶使用

1、介绍

Keeaplived 主要有两种应用场景,一个是通过配置keepalived结合ipvs做到负载均衡(LVS+Keepalived)。另一个是通过自身健康检查、资源接管功能做高可用(双机热备),实现故障转移

以下内容主要针对Keepalived+MySQL双主实现双机热备为根据,主要讲解keepalived的状态转换通知功能,利用此功能可有效加强对MySQL数据库监控。

2、keepalived主要作用

keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。

3、工作在三层、四层和七层原理

Layer3: 工作在三层时,keepalived会定期向热备组中的服务器发送一个ICMP数据包,来判断某台服务器是否故障,如果故障则将这台服务器从热备组移除。

Layer4: 工作在四层时,keepalived以TCP端口的状态判断服务器是否故障,比如检测mysql 3306端口,如果故障则将这台服务器从热备组移除。

! Configuration File for keepalivedglobal_defs {notification_email {     example@163.com  }    notification_email_from  example@example.comsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MYSQL_HA}vrrp_instance VI_1 {  state BACKUPinterface eth1virtual_router_id 50      nopreempt                   #当主down时,备接管,主恢复,不自动接管      priority 100      advert_int 1authentication {         auth_type PASS   ahth_pass 123       }      virtual_ipaddress {     192.168.1.200          #虚拟IP地址}virtual_server 192.168.1.200 3306 {            delay_loop 6#    lb_algo rr #    lb_kind NATpersistence_timeout 50    protocol TCP  real_server 192.168.1.201 3306 {       #监控本机3306端口        weight 1   notify_down /etc/keepalived/kill_keepalived.sh   #检测3306端口为down状态就执行此脚本(只有keepalived关闭,VIP才漂移 )   TCP_CHECK {         #健康状态检测方式,可针对业务需求调整(TTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK)connect_timeout 3           nb_get_retry 3             delay_before_retry 3     }  #MISC_CHECK {                       ## 使用 MISC_CHECK 方式自定义脚本做健康检查#    misc_path "/etc/keepalived/check.sh"    ## 检测脚本#    misc_timeout   10              ## 执行脚本的超时时间#    misc_dynamic                   ## 根据退出状态码动态调整服务器的权重#    }
​}}

Layer7:工作在七层时,keepalived根据用户设定的策略判断服务器上的程序是否正常运行,如果故障则将这台服务器从热备组移除。

 ! Configuration File for keepalivedglobal_defs {notification_email {example@163.com}notification_email_from  example@example.com      smtp_server 127.0.0.1smtp_connect_timeout 30router_id MYSQL_HA}vrrp_script check_nginx {   script /etc/keepalived/check_nginx.sh    #检测脚本interval 2   #执行间隔时间}vrrp_instance VI_1 {state BACKUPinterface eth1virtual_router_id 50nopreempt                   #当主down时,备接管,主恢复,不自动接管priority 100 advert_int 1authentication {   auth_type PASS        ahth_pass 123     }     virtual_ipaddress {192.168.1.200          #虚拟IP地址   }     track_script {          #在实例中引用脚本    check_nginx      }  }

脚本内容如下:

        # cat /etc/keepalived/check_nginx.shCount1=`netstat -antp |grep -v grep |grep nginx |wc -l`if [ $Count1 -eq 0 ]; then/usr/local/nginx/sbin/nginxsleep 2  Count2=`netstat -antp |grep -v grep |grep nginx |wc -l`if [ $Count2 -eq 0 ]; then service keepalived stop      elseexit 0fi else   exit 0fi 
​#也可以简单如下:#!/bin/bash[[ `ps -C nginx --no-header |wc -l` -eq 0 ]] && exit 1 || exit 0# 如果没有nginx进程 返回错误状态1  #if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then#        echo "$(date) nginx pid not found">>/etc/keepalived/keepalived.log#        #killall keepalived#fi
#在keepalived主机中,运行如下脚本,用来检测本机的nginx进行状态
vim start_keepalived.sh
#!/bin/bash
while true
doif pgrep nginx &> /dev/null;thensystemctl start keepalivedfisleep 3
​
done
​
​
​
#mysql 检测脚本如下:#!/bin/bash[[ `ps -C mysqld --no-header |wc -l` -eq 0 ]] && exit 1 || exit 0# 如果没有nginx进程 返回错误状态1  if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenecho "$(date) nginx pid not found">>/etc/keepalived/keepalived.logkillall keepalivedfi

4、健康状态检测方式

4.1 HTTP服务状态检测
HTTP_GET或SSL_GET {           url {      path /index.html        #检测url,可写多个         digest  24326582a86bee478bac72d5af25089e    #检测效验码        #digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html         status_code 200         #检测返回http状态码    }       connect_port 80 #连接端口  connect_timeout 3  #连接超时时间 nb_get_retry 3  #重试次数delay_before_retry 2 #连接间隔时间}
4.2 TCP端口状态检测(使用TCP端口服务基本上都可以使用)
    TCP_CHECK {             connect_port 80     #健康检测端口,默认为real_server后跟端口    connect_timeout 5      nb_get_retry 3      delay_before_retry 3}
4.3 邮件服务器SMTP检测
SMTP_CHECK {            #健康检测邮件服务器smtp       host {        connect_ip          connect_port    }           connect_timeout 5       retry 2    delay_before_retry 3   hello_name "mail.domain.com"   }
4.4 用户自定义脚本检测real_server服务状态
 MISC_CHECK {         misc_path /script.sh    #指定外部程序或脚本位置      misc_timeout 3      #执行脚本超时时间  !misc_dynamic       #不动态调整服务器权重(weight),如果启用将通过退出状态码动态调整real_server权重值# misc_dynamic        ## 根据退出状态码动态调整服务器的权重}

5、状态转换通知功能

keepalived主配置邮件通知功能,默认当real_server宕机或者恢复时才会发出邮件。有时我们更想知道keepalived的主服务器故障切换后,VIP是否顺利漂移到备服务器,MySQL服务器是否正常?那写个监控脚本吧,可以,但没必要,因为keepalived具备状态检测功能,所以我们直接使用就行了。

主配置默认邮件通知配置模板如下:global_defs           # Block id{   notification_email    # To:   {      admin@example1.com ...        }
​# From: from address that will be in header    notification_email_from admin@example.comsmtp_server 127.0.0.1   # IP  smtp_connect_timeout 30 # integer, secondsrouter_id my_hostname   # string identifying the machine,                        # (doesn't have to be hostname).
5.1 实例状态通知

a) notify_master :节点变为master时执行

b) notify_backup : 节点变为backup时执行

c) notify_fault : 节点变为故障时执行

5.2 虚拟服务器检测通知

a) notify_up : 虚拟服务器up时执行

b) notify_down : 虚拟服务器down时执行

示例:! Configuration File for keepalivedglobal_defs { notification_email {example@163.com     }   notification_email_from example@example.com    smtp_server 127.0.0.1 smtp_connect_timeout 30  router_id MYSQL_HA}    vrrp_instance VI_1 {       state BACKUP     interface eth1virtual_router_id 50  nopreempt           #当主down时,备接管,主恢复,不自动接管   priority 100advert_int 1  authentication {          auth_type PASS          ahth_pass 123     }    virtual_ipaddress {      192.168.1.200     }          notify_master /etc/keepalived/to_master.sh          notify_backup /etc/keepalived/to_backup.shnotify_fault /etc/keepalived/to_fault.sh    } virtual_server 192.168.1.200 3306 {     delay_loop 6     persistence_timeout 50    protocol TCP       real_server 192.168.1.201 3306 {            weight 1         notify_up /etc/keepalived/mysql_up.sh         notify_down /etc/keepalived/mysql_down.sh           TCP_CHECK {connect_timeout 3            nb_get_retry 3            delay_before_retry 3           }        }     }

状态参数后可以是bash命令,也可以是shell脚本,内容根据自己需求定义,以上示例中所涉及状态脚本如下:

  1. 当服务器改变为主时执行此脚本

yum install -y sendmail mailx
systemctl enabled --now sendmail
 # cat to_master.sh #!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="z13516052620@163.com"echo "$Date $IP change to master." |mail -s "Master-Backup Change Status" $Mail
  1. 当服务器改变为备时执行此脚本

 # cat to_backup.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"echo "$Date $IP change to backup." |mail -s "Master-Backup Change Status" $Mail
​
  1. 当服务器改变为故障时执行此脚本

  # cat to_fault.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"echo "$Date $IP change to fault." |mail -s "Master-Backup Change Status" $Mail
  1. 当检测TCP端口3306为不可用时,执行此脚本,杀死keepalived,实现切换

# cat mysql_down.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"pkill keepalivedecho "$Date $IP The mysql service failure,kill keepalived." |mail -s "Master-Backup MySQL Monitor" $Mail
  1. 当检测TCP端口3306可用时,执行此脚本

 # cat mysql_up.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"echo "$Date $IP The mysql service is recovery." |mail -s "Master-Backup MySQL Monitor" $Mail

六、项目实际中配置

检测nginx配置

global_defs {router_id    masterenable_script_security
}
vrrp_script check_nginx {script  /etc/keepalived/check_nginx.shinterval 1weight -20
}
​
vrrp_instance VI_1 {state  MASTERinterface eth2virtual_router_id 201priority   100advert_int 3authentication {auth_type PASSauth_pass 1114}
track_script {check_nginx}virtual_ipaddress {10.239.167.8}
}
​
vrrp_instance VI_2 {state  BACKUPinterface eth0virtual_router_id 202priority   100advert_int 3authentication {auth_type PASSauth_pass 1114}
track_script {check_nginx}virtual_ipaddress {10.1.19.105}
}
​

2

! Configuration File for keepalived
​
global_defs {router_id LVS_HTTPscript_user root
}
#vrrp_script check_keepalived {
#       script "/etc/keepalived/check_keepalived.sh"
#       interval 2
#       weight 3
#}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 21nopreemptpriority 130advert_int 3authentication {auth_type PASSauth_pass 1111}#track_script {#   check_keepalived#}virtual_ipaddress {10.1.13.27/24}#notify_master "/etc/keepalived/master.sh ethxx"   #切换主执行#notify_backup "/etc/keepalived/slave.sh eth0"  ##切换备执行#notify_stop "/etc/keepalived/stop.sh eth0"  ##
}
​
virtual_server 10.1.13.27 26000 {        #设置虚拟服务器的 IP 和端口,用空格隔开delay_loop 6                             #设置运行情况检查时间,单位是秒
# lb_algo rr                               #负载调度算法(轮询)
# lb_kind DR                               #负载均衡机制(NAT、TUN、DR)persistence_timeout 50                   #会话保持时间(秒)protocol TCP                             #转发协议类型real_server 10.1.13.136 26000 {       #配置服务节点weight 90                        #配置服务节点的权重notify_down /etc/keepalived/failoverdb.sh  #虚拟服务故障响应脚本TCP_CHECK {                      #使用TCP_CHECK方式进行健康检查connect_timeout 10           #10秒无响应即超时delay_before_retry 3         #重试间隔时间}#MISC_CHECK {                       ## 使用 MISC_CHECK 方式自定义脚本做健康检查#    misc_path "/etc/keepalived/check.sh"    ## 检测脚本#    misc_timeout   10              ## 执行脚本的超时时间#    misc_dynamic                   ## 根据退出状态码动态调整服务器的权重#    }}
}

 在Openeluer系统中,以上环境将存储系统更改为NFS,构建一个双机热备环境,该如何操作?

构建高可用NFS共享存储方案(基于Keepalived + NFS on OpenEuler)

实验环境规划

操作系统:OpenEuler 22.03 LTS
1. VIP主机 (Keepalived Master):IP: 192.168.1.100
2. 备份主机 (Keepalived Slave):IP: 192.168.1.101
3. 客户端主机:IP: 192.168.1.102
4. 虚拟IP (VIP):192.168.1.200
5. 共享目录:/data/nfs_share

配置步骤详解(OpenEuler系统)

第一阶段:NFS服务器配置(Master & Slave 执行)
  1. 安装NFS服务

    dnf install nfs-utils rpcbind -y
  2. 创建共享目录并设置权限

    mkdir -p /data/nfs_share
    chown nfsnobody:nfsnobody /data/nfs_share
    chmod 777 /data/nfs_share
  3. 配置NFS导出文件 (/etc/exports)

    echo "/data/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)" | tee /etc/exports
  4. 启动NFS服务

    systemctl enable --now rpcbind
    systemctl enable --now nfs-server
    exportfs -arv  # 重新加载配置
  5. 验证NFS共享

    showmount -e localhost
    # 应显示: /data/nfs_share 192.168.1.0/24

第二阶段:Keepalived配置(实现VIP漂移)
  1. 安装Keepalived(双节点执行)

    dnf install keepalived -y
  2. Master节点配置 (/etc/keepalived/keepalived.conf)

    confvrrp_script chk_nfs {script "/usr/bin/pgrep nfsd || exit 1"interval 2weight 50
    }vrrp_instance VI_1 {state MASTERinterface eth0                    # 使用ip a查看实际网卡名virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.200/24}track_script {chk_nfs}
    }
  3. Slave节点配置 (/etc/keepalived/keepalived.conf)

    confvrrp_script chk_nfs {script "/usr/bin/pgrep nfsd || exit 1"interval 2weight 50
    }vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.200/24}track_script {chk_nfs}
    }
  4. 启动Keepalived服务

    systemctl enable --now keepalived
    systemctl status keepalived
  5. 验证VIP分配

    ip addr show eth0
    # Master节点应显示192.168.1.200

第三阶段:客户端配置
  1. 安装NFS客户端

    dnf install nfs-utils -y
  2. 创建挂载点

    mkdir -p /mnt/nfs
  3. 挂载NFS共享

    mount -t nfs 192.168.1.200:/data/nfs_share /mnt/nfs
  4. 验证挂载

    df -hT | grep nfs
    # 应显示: 192.168.1.200:/data/nfs_share nfs4 ...touch /mnt/nfs/testfile  # 测试写入
  5. 配置开机自动挂载

    echo "192.168.1.200:/data/nfs_share /mnt/nfs nfs defaults 0 0" | sudo tee -a /etc/fstab

高可用测试流程

  1. 在Master节点创建文件

    echo "From Master" > /data/nfs_share/master.txt
  2. 客户端验证

    cat /mnt/nfs/master.txt  # 应显示"From Master"
  3. 模拟Master故障

    # 在Master节点执行:
    systemctl stop keepalived
  4. 验证VIP漂移

    # 在Slave节点执行:
    ip addr show eth0  # 应显示VIP 192.168.1.200
  5. 客户端持续访问

    echo "After failover" >> /mnt/nfs/master.txt
    cat /mnt/nfs/master.txt
    # 应显示两行内容,证明切换成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914669.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TDengine 使用最佳实践(1)

目录 数据建模 单列模型 多列模型 分库分表 边界限制 资源规划 CPU 主频 CPU 核数 内存分类 内存计算 CPU 内存比例 磁盘 网络 下一篇 TDengine 使用最佳实践&#xff08;1&#xff09; 关于 TDengine TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台&am…

Java行为型模式---责任链模式

责任链模式基础概念责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。这些对象连接成一条链&#xff0c;请求沿着链传递&#xff0c;直到有…

嵌入式学习笔记- 结构体名字被赋值时是整体内容赋值

结构体变量名被赋值时&#xff0c;‌不是赋值的地址&#xff0c;而是执行对整个结构体内容的复制&#xff08;值拷贝&#xff09;‌直接赋值是成员级复制‌ 当使用 s2 s1; 形式的赋值时&#xff08;其中 s1 和 s2 是同类型结构体变量&#xff09;&#xff0c;系统会‌逐成员复…

基于UDP/IP网络游戏加速高级拥塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP网络游戏加速高级拥塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目标检测】06-模型部署(C++)

上一节课,我们学习了模型的预测。那么,如何用C++部署呢? 克隆项目 进入cmd,进入自己的项目文件夹,然后git clone项目: git clone https://github.com/Geekgineer/YOLOs-CPP 进入到YOLOs-CPP文件夹: 配置环境 ONNX Runtime 后续构建项目的时候,会自动下载,因此,我…

【第零章编辑器开发与拓展】

前言&#xff1a;对编辑器拓展与开发可以节省很多时间&#xff0c;提高开发效率&#xff0c;比如技能编辑器&#xff0c;关卡编辑器这种。当然这只是编辑器开发的一些典型应用&#xff0c;它能做不止这些。学习完这个之后&#xff0c;我们可以开发项目需要的工具。我本意在编辑…

使用 mongoimport 导入本地 JSON 文件到 MongoDB 及数据查看指南

在项目中&#xff0c;我们经常需要将本地 JSON 文件批量导入 MongoDB 数据库。本文以 Ubuntu 22.04 环境为例&#xff0c;详细记录了如何安装 mongoimport 工具、正确导入多个 JSON 文件&#xff0c;以及查看导入后的数据。一、环境介绍操作系统&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python数据处理Excel报表自动化生成与分析

Python实现Excel报表自动化系统全流程指南本文将详细介绍如何使用Python实现一个完整的Excel报表自动化系统&#xff0c;涵盖从数据清洗、分析到可视化报表生成的全流程。本教程面向Python初学者&#xff0c;通过实际案例讲解pandas和openpyxl库的核心用法。系统概述Excel报表自…

【第六节】docker可视化工具portainer安装

该文章参考了这篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一个基于网页的docker可视化管理工具&#xff0c;试想一下我们怎么登录路由器管理界面的&#xff0c;异曲同工。那么就需要在服务器的docker内安装portainer&#xff0c;然后在我们的开发机或者说工作…

使用 Certbot 申请和自动续签 Let’s Encrypt 的免费 SSL 证书

一. Let’s Encrypt 介绍 Let’s Encrypt 是当前最常用的免费 HTTPS 证书生成工具之一。该服务由非营利组织提供&#xff0c;致力于为全球范围内的网站提供便捷的自动化证书颁发服务。虽然 Let’s Encrypt 证书的有效期只有90天&#xff0c;但是可以自动续期&#xff0c;这使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器详解 它确保集群中所有(或部分)节点上都运行一个 Pod 的副本。当有新节点加入集群时&#xff0c;DaemonSet 会自动在新节点上创建 Pod&#xff1b;当节点从集群中移除时&#xff0c;这些 Pod 也会被垃圾回收。 DaemonSet 的核心特性 每个节点一个 P…

内测分发平台应用的异地容灾和负载均衡处理和实现思路

内测分发平台应用的异地容灾和负载均衡处理和实现思路如下&#xff1a;一、异地容灾1.风险评估和需求分析&#xff1a;对现有的IT基础设施进行全面的风险评估和需求分析&#xff0c;评估潜在风险和灾害的可能性&#xff0c;以及确定业务和数据的关键性。2.设计备份架构&#xf…

【Vue】浏览器缓存 sessionStorage、localStorage、Cookie

嘿&#xff0c;各位 Vue 开发者们&#xff01;今天咱们来好好聊聊浏览器里的三种缓存方式&#xff1a;sessionStorage、localStorage 和 Cookie。在实际开发中&#xff0c;合理运用这些缓存能让我们的应用性能大幅提升&#xff0c;同时避免一些不必要的问题。下面就跟着我的笔记…

c#如何将不同类型的数据存储到一起

在 C# 中&#xff0c;存储不同类型的数据有多种方式&#xff0c;具体选择取决于你的需求&#xff08;类型安全、性能、灵活性等&#xff09;。以下是常见的解决方案及其适用场景&#xff1a;1. 使用 object 类型&#xff08;装箱 / 拆箱&#xff09;将所有数据转换为基类 objec…

超唯美治愈风卡通插画PPT模版

海洋卡通风治愈系PPT模版&#xff0c;儿童可爱治愈可爱PPT模版&#xff0c;治愈风商务通用PPT模版&#xff0c;治愈系课件PPT模版&#xff0c;治愈风插画PPT模版&#xff0c;超唯美治愈风PPT模版&#xff0c;可爱插画治愈系女孩PPT模版 超唯美治愈风卡通插画PPT模版&#xff1a…

el-tooltip 快速滚动的时候出现残影如何解决 vue3

<el-tooltip:disabled"isScrolling" <!-- 新增滚动状态绑定 -->:popper-options"{ modifiers: [{ name: computeStyles, options: { adaptive: false }] }"effect"dark":content"label.name"placement"right-start"…

【经典面经】C++新特性 TCP完整收发数据 TLS1.2 TLS1.3

文章目录cpp新特性C11C14C17C20tcp如何保证完整收发数据结论1. **面向连接的三次握手**2. **字节序号与确认机制**3. **校验和&#xff08;Checksum&#xff09;**4. **超时重传与快速重传**5. **滑动窗口&#xff08;流量控制&#xff09;**6. **数据重组与排序**7. **四次挥手…

Spring AI 系列之十一 - RAG-进阶RetrievalAugmentationAdvisor

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

[TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4

文章目录一、工具安装二、gif 转mp4三、mp4 两倍速一、工具安装 安装 ffmpeg 工具&#xff1a; sudo apt install ffmpeg二、gif 转mp4 1. 配置环境 核心指令: ffmpeg -i input.mp4 -filter_complex "[0:v]setpts0.5*PTS[v];[0:a]atempo2.0[a]" -map "[v]&q…

linux中INIT_MM_CONTEXT宏对pgd的重复赋值

在GNU C中&#xff0c;支持通过标号元素对指定结构体成员名进行初始化&#xff0c;这允许初始化值以任意顺序出现。在linux内核中对init_mm初始化时有如下代码。#define INIT_MM_CONTEXT(name) \.pgd init_pg_dir,struct mm_struct init_mm {.mm_rb RB_ROOT,.pgd swapper…