1. 环境: 操作系统为SUSE 12,keepalived 的版本为当前最新的 2.2.1 ,在suse上通过编译方式安装部署。

configure --prefix=/user/local/keepalived

make & make install

上述安装步骤会把源码程序中的keepalive.service 复制到/usr/lib/systemd/system/目录中,是把keepalived 注册为系统服务,执行systemctl start keepalived可以启动服务。

另外需要做的两个事情是:

(1)把配置文件复制到/etc/keepalived  在源码的keepalived 启动脚本中指明了配置文件要到这个位置且名字为keepalived.conf

(2)把执行的参数选项文件复制到/etc/sysconfig/keepalived

cp /opt/keepalived-2.2.1/keepalived/etc/init.d/keepalived.suse.init.in /etc/init.d/keepalived  (测试发现与rh以及keepalived 本身代码不同,但效果相同)

cp /opt/keepalived-2.2.1/keepalived/etc/keepalived/keepalived  /etc/keepalived/keepalived

2. 问题描述:  使用keepalived 做数据库的双机热备,使用notify_master、 notity_backup 和notitfy_stop 机制在状态切换时执行相应的shell 脚本。在测试时,如果执行systemctl stop keepalived 命令关闭keepalived,会看到stop的脚本程序在未执行完时就被杀掉了,stop脚本会关闭数据库并卸载共享分区。由于数据库关闭较慢,造成还未来得及关闭执行脚本的进程就没有了,所以这种情况下数据库和分区都仍在运行和挂载状态,只是vrrp的VIP没有了。

3. 分析:

在stop脚本中加入日志输入,检测脚本进程和keepalived进程,可以看到在stop keepalived 服务时,stop 脚本确实是被调用并开始执行了,但随后进程就被kill掉。

stop.sh 脚本:

执行情况:

#################### stop.sh executing ###################################
2021-02-24 14:26:16  execute stop.sh! now beginning  stop db
root 2798 2748 0 09:26 pts/1 00:00:00 tail -f /var/log/keepalived.log

root 23931 1 0 14:25 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D

root 23933 23931 0 14:25 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D

root 24478 2664 0 14:26 pts/0 00:00:00 /bin/sh /etc/init.d/keepalived stop

root 24479 24478 0 14:26 pts/0 00:00:00 killproc keepalived

root 24480 23933 0 14:26 ? 00:00:00 /bin/bash /etc/keepalived/stop.sh

root 24482 24480 0 14:26 ? 00:00:00 /bin/bash /etc/keepalived/stop.sh
#######################ps -ef | grep stop.sh  命令 检测 stop.sh 脚本的执行进程 ######################################
root 24480 23933 0 14:26 ? 00:00:00 /bin/bash /etc/keepalived/stop.sh

root 24486 24480 0 14:26 ? 00:00:00 /bin/bash /etc/keepalived/stop.sh

输出就到这里,后面因为stop.sh 被kill。

在测试过程中发下, 如果是将notify_stop的脚本(比如改成test.sh)中只加入/etc/keepalived/stop.sh 这么一行,通过这个脚本文件调用stop.sh ,这时可以发现,在keepalived stop时,test.sh 被kill掉,但test.sh 调用的stop.sh 脚本进程却不会被kill,任务目标可以顺利完成。

可以看到,在第一次检测进程时,test.sh 的进程作为stop.sh 父进程。在第二次检测脚本进程时,test.sh 进程就没有了,而stop.sh 脚本的进程还在,且其父进程被改成了1号进程,但其自身的进程号并没有改变。(按照道理,kill 父进程应该会kill掉其子孙进程把? 要不这些进程就变成了僵尸/孤儿进程),但不知道啥原因,这个进程被系统接管了。(看了半天fork 之类的资料,也没有搞清楚怎么回事,如果这样可以,为什么kill keepalived时要把其调用的test.sh 进程也给kill了呢? 求指正!! )

4. 解决办法:

(1) 按照上述分析,使用一个stop脚本去执行真正的任务脚本。

(2) 在将keepalived 注册为系统服务时,一般仅仅是复制其源码自带的keepalived.service 文件到系统服务文件所在目录。自带文件如下:

在查找资料中发现,系统服务有ExecStop 以及ExecStopPost 两个选项可以对在调用stop以及调用stop之后所做的工作进行定制。

测试了下,发现用着两个选项可以替代notify_stop的命令,推荐使用ExecStopPost,在keepalvied stop之后调用进程。

可以看到,ExecStop调用时就已经使用1号进程为父进程,而不是用keepalived。无论是用ExecStop 还是ExecStopPost都可以完成后续停止服务和卸载分区的需求。

需要注意在任务步骤增加sleep,保证上一个步骤完成再进行下一个步骤。

keepalived notify_stop 脚本的问题相关推荐

  1. Keepalived监测脚本不执行

    Keepalived监测脚本一直不执行 今天在搭建Nginx+Keepalived集群时,启动Keepalievd发现检查脚本不执行,脚本本身是没有问题的. 1.1 监测脚本 脚本如下: A=`ps ...

  2. Keepalived 添加脚本配置监控haproxy方案

    作者:风过无痕-唐 出处:http://www.cnblogs.com/tangyanbo/ 上一篇文章已经讲到了keepalived实现双机热备,且遗留了一个问题 master的网络不通的时候,可以 ...

  3. keepalived 检测服务状态、keepalived 检测脚本

    前言 环境:centos 7.9 keepalived-2.2.7 说明 前面我们模拟vip漂移,总是把keepalived手动停止来模拟服务器死机,这种模拟是不太合理的,在生产环境中,我们更多的是监 ...

  4. MySQL共享存储主备模式利用Keepalived实现双机高可用

    简单介绍 先简单说下MySQL主从复制与keepalived模式和MySQL共享存储与Keepalived模式 MySQL共享存储主备模式不同于MySQL主主复制模式,MySQL主主是利用MySQL自 ...

  5. Keepalived源码、yum安装-高可用(主备、主主)场景

    目录 前言 1.安装 1.1 方式一(yum安装) 1.1.1 yum安装 1.1.2 查看版本 1.1.3 查看安装后目录 1.2 方式二(源码安装) 1.2.1 先安装keepalived依赖组件 ...

  6. 一文带你浅入浅出Keepalived

    目录 前言 初识keepalived 1.vrrp协议 2.工作原理 3.安装&配置 Nginx+keepalived 前言 假设你搭建了一个电商网站,一开始你只有一台服务器对用户提供服务,用 ...

  7. drbd+keepalived nfs高可用方案实践

    实验环境 系统CentOS 6.5 X64 Ip:172.16.25.162 172.16.25.163 epel源 每台主机有/dev/sdb1: 1073 MB挂载点/test供drbd使用 先升 ...

  8. CentOS7搭建keepalived+DRBD+NFS高可用共享存储

    CentOS7搭建keepalived+DRBD+NFS高可用共享存储 一.服务器信息 IP地址 类型 主机名 操作系统 内存 磁盘 172.25.10.100 主服务器 node1 centos7 ...

  9. 基于keepalived的mysql_【实用】基于keepalived的mysql双主高可用系统

    原标题:[实用]基于keepalived的mysql双主高可用系统 mysql单节点存储时,系统出现故障时服务不可用.不能及时恢复的问题,因此实际使用时,一般都会使用mysql双机方案,使用keepa ...

最新文章

  1. 通过loganalyzer展示数据库中的日志
  2. 在哪里学python好-为什么要选择学python,亮点在哪呢?
  3. Android TV 快进帧预览
  4. php session/完整判断是否https/对象与数组互转/文件下载
  5. data:image data url 文件上传
  6. aws lambda_它会融合吗? 或如何在AWS Lambda中运行Google Chrome
  7. vuedraggable嵌套块拖拽_Vue.Draggable拖拽效果
  8. python逗号表达式_python – 如何用位于括号外的逗号分割一个字符串?
  9. PJzhang:经典子域名爆破工具subdomainsbrute
  10. 怎么源码安装 PKGCONFIGPATH设置转
  11. CCNA CCNP全套教材 CCNA CCNP视频 CCNA CCNP最新题库解析
  12. 最强的linux命令总结.pdf
  13. linux系统查看网卡是否开启,查看Linux下网卡状态或 是否连接
  14. golang批量修改文件名称
  15. Python3.x爬虫下载网页图片
  16. 数字图像处理实验(五)|图像复原{逆滤波和伪逆滤波、维纳滤波deconvwnr、大气湍流扰动模型、运动模糊处理fspecial}(附matlab实验代码和截图)
  17. Oracle死锁问题: enq: TX - row lock contention
  18. Python零基础自学3(黑马)
  19. 前端笔记之服务器Ajax(上)服务器PHP数据交互HTTP
  20. 一篇 认为未来房价会跌的文章

热门文章

  1. 手机公司陷入集体焦虑
  2. 安卓 background的图片随着textview的大小而改变_苹果4G内存吊打安卓8G内存?看看苹果是怎么虐安卓的!...
  3. ubuntu18.04 安装英伟达显卡驱动
  4. 实现Vista系统下重新分区
  5. 易基因|综述科普:单细胞测序技术下的小鼠脑部DNA甲基化图谱
  6. 如何去掉收费的wma格式
  7. 【报错解决-Golang】go mod 安装第三方包提示:module declares its path as: ××× but was required as: ×××
  8. 锁定计算机耗电吗,电脑一天的耗电量是多少?不算不知道 一算吓一跳!
  9. 2021年3月26日心路历程-(过于煽情了)
  10. 迎新年html,迎接新年句子精选十条