`
iffiffj
  • 浏览: 156735 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【原创】解决Piranah中"/sbin/ipvsadm command failed!"问题的过程

阅读更多
1.LVS问题现象
在一次系统部署的过程中测试发现LVS运行过程中出现异常,当一台RS挂掉的时候整个LVS的路由都被清空了(操作系统为RHEL5.5,使用piranha套件)。经过改LVS的配置,改心跳脚本,换piranha的版本,问题依旧,而且无法定位问题的所在,备受打击,以前没有遇到这种情况。不过经过接下来几天的努力终止发现问题所在,并解决了该问题,以下是问题的分析和解决过程。
2.LVS配置
OS :RHEL5.5
VIP:192.168.142.100:80
RS1:192.168.142.158:8080
RS2:192.168.142.159:8080
配置如下,心跳脚本就不贴了:
serial_no = 34
primary = 192.168.142.160
service = lvs
backup_active = 0
backup = 0.0.0.0
heartbeat = 1
heartbeat_port = 539
keepalive = 30
deadtime = 18
network = direct
nat_nmask = 255.255.255.0
debug_level = NONE
virtual diff {
     active = 1
     address = 192.168.142.100 eth0:1
     vip_nmask = 255.255.255.0
     port = 80
     expect = "OK"
     use_regex = 0
     send_program = "/etc/sysconfig/ha/lvs.sh %h"
     load_monitor = none
     scheduler = rr
     protocol = tcp
     timeout = 30
     reentry = 10
     quiesce_server = 0
     server 158 {
         address = 192.168.142.158
         active = 1
         weight = 1
         port = 8080
     }
     server 159 {
         address = 192.168.142.159
         active = 1
         weight = 1
         port = 8080
     }
}

3.系统日志的分析
系统日志(/var/log/messages)打印的信息如下:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Apr 29 08:34:03 RHEL55 pulse[10082]: STARTING PULSE AS MASTER
Apr 29 08:34:21 RHEL55 pulse[10082]: partner dead: activating lvs
Apr 29 08:34:21 RHEL55 lvs[10085]: starting virtual service diff active: 80
Apr 29 08:34:21 RHEL55 nanny[10089]: starting LVS client monitor for 192.168.142.100:80 -> 192.168.142.158:8080
Apr 29 08:34:22 RHEL55 lvs[10085]: create_monitor for diff/128 running as pid 10089
Apr 29 08:34:22 RHEL55 lvs[10085]: create_monitor for diff/129 running as pid 10093
Apr 29 08:34:22 RHEL55 nanny[10093]: starting LVS client monitor for 192.168.142.100:80 -> 192.168.142.159:8080
Apr 29 08:34:22 RHEL55 nanny[10089]: [ active ] making 192.168.142.158:8080 available
Apr 29 08:34:22 RHEL55 nanny[10093]: [ active ] making 192.168.142.159:8080 available
Apr 29 08:34:27 RHEL55 pulse[10094]: gratuitous lvs arps finished

Apr 29 08:35:52 RHEL55 nanny[10089]: Trouble. Received results are not what we expected from (192.168.142.158:8080)
Apr 29 08:35:52 RHEL55 nanny[10089]: [inactive] shutting down 192.168.142.158:8080 due to connection failure

Apr 29 08:35:52 RHEL55 nanny[10089]: /sbin/ipvsadm command failed!
Apr 29 08:35:52 RHEL55 lvs[10085]: nanny died! shutting down lvs
Apr 29 08:35:52 RHEL55 lvs[10085]: shutting down virtual service diff

Apr 29 08:35:52 RHEL55 nanny[10093]: Terminating due to signal 15
Apr 29 08:35:52 RHEL55 nanny[10093]: /sbin/ipvsadm command failed!
Apr 29 08:36:56 RHEL55 pulse[10082]: Terminating due to signal 15

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、其中(深红色)颜色的信息表示检测脚本返回的值不是OK时,nanny进程准备把对应的LVS路由(192.168.142.158)删除,是正常的。
2、其中(大红色)颜色的信息表示nanny进程调用/sbin/ipvsadm进行删除LVS路由时出现异常,结果导致整个LVS服务都被shutdown了,这就不正常了。

4.调试源代码
从系统日志只能看出nanny调用/sbin/ipvsadm出错了,但如何出错的,出错在哪里,为什么出错,却不能从该日志中获得信息。只有走最后一步了:调试源代码。
先下载源码:
piranha-0.8.4-16.el5.src.rpm

然后在RHEL系统中安装该源码:
rpm -ivh piranha-0.8.4-16.el5.src.rpm

去到打补丁目录,运行命令进行打补丁:
cd /usr/src/redhat/SPECS
rpmbuild -bp piranha.spec

然后去到打完补丁的目录
cd /usr/src/redhat/BUILD/piranha

经过一翻的查找,找到ipvs_exec.c文件中的runCommand和shutdownDev这两个函数,其中shutdownDev就是RS服务器挂掉(心跳脚本执行不通过)时要执行的函数,我在runCommand函数的开头写了些调试信息,把命令和参数都打印出来,代码如下:
runCommand (char *cmd, int flags, char **argv, int log_flag)
{
  int i=0;
  for(i=0; argv[i] != NULL; i++){
    piranha_log (flags, (char *) "tyler println:%s", argv[i]);
  }
//......

然后执行make,把编译出来的nanny程序替换/usr/sbin/nanny,启动pulse,查看系统日志,当RS服务器挂掉时日志如下(可能与原来的有点差别):
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
May  5 13:02:28 RHEL5 nanny[8378]: Trouble. Received results are not what we expected from (192.168.142.158:8080)
May  5 13:02:28 RHEL5 nanny[8378]: [inactive] shutting down 192.168.142.158:8080 due to connection failure
May  5 13:02:28 RHEL5 nanny[8378]: tyler println:/sbin/ipvsadm
May  5 13:02:28 RHEL5 nanny[8378]: tyler println:-d
May  5 13:02:28 RHEL5 nanny[8378]: tyler println:-t
May  5 13:02:28 RHEL5 nanny[8378]: tyler println:192.168.142.100:80:80
May  5 13:02:28 RHEL5 nanny[8378]: tyler println:-r
May  5 13:02:28 RHEL5 nanny[8378]: tyler println:192.168.142.158:8080
May  5 13:02:28 RHEL5 nanny[8378]: /sbin/ipvsadm command failed!
May  5 13:02:28 RHEL5 lvs[8370]: nanny died! shutting down lvs
May  5 13:02:28 RHEL5 lvs[8370]: shutting down virtual service lvs
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
把命令重组一下:
/sbin/ipvsadm -d -t 192.168.142.100:80:80 -r 192.168.142.158:8080

拿到控制台中执行,发现执行出错,怪不得nanny都要自杀了。
其实正确的命令应该如下,RS的IP是不需要带端口的(如果一定要指定端口就指定VIP的端口吧):
/sbin/ipvsadm -d -t 192.168.142.100:80:80 -r 192.168.142.158


/sbin/ipvsadm -d -t 192.168.142.100:80:80 -r 192.168.142.158:80


5.给piranha的补丁打上补丁
nanny执行ipvsadm命令出错的原因已经找到了,程序中多加了RS服务器的端口号,知道这个原因就容易多了,下面是对shutdownDev函数的修改:
//sprintf (remoteName, "%s:%d", inet_ntoa (*remoteAddr), rport);
sprintf (remoteName, "%s", inet_ntoa (*remoteAddr));

注释了添加端口的方法,改为不添加RS服务器的端口。去掉runCommand函数中的注释,然后执行make,把编译出来的nanny程序替换/usr/sbin/nanny,启动pulse。
经过测试发现一切正常。

6.总结一下
经过这次对piranha的调试,可以发现当VIP暴露的端口与RS的端口一致时一般都不会出现该问题,但一但端口对不上的时候问题就可能出现了,这还取决于你的运气好不好,因为一般RS运行都是很稳定的,长期都不会挂机,也就不会出现任何问题,一但出现挂机情况,问题都浮现了。

修改过的源代码可以打成RPM包,或者是直接就拷程序也可以,涉及的程序有lvsd,pulse,nanny,直接覆盖原程序就OK了,如果要打成RPM包,下面摘录了打RPM包的过程:
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法, 
方法一: 
1.执行rpm -i your-package.src.rpm 
2. cd /usr/src/redhat/SPECS 
3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件 
4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录 
5. ./configure 这一步和编译普通的源码软件一样,可以加上参数
也可以具体看该目录下的INSTALL文件,按照指导进行安装
6. make 
7. make install
方法二: 
1.执行rpm -i you-package.src.rpm 
2. cd /usr/src/redhat/SPECS 
前两步和方法一相同 
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件 
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等) 
在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。 
执行rpm -i new-package.rpm即可安装完成。

分享到:
评论
2 楼 iffiffj 2013-04-27  
royzs 写道
cd /usr/src/redhat/SPECS 
rpmbuild -bp piranha.spec
到这步就卡住了,SPECS目录里面没有piranha.spec

安装piranha的源码没?
1 楼 royzs 2013-04-26  
cd /usr/src/redhat/SPECS 
rpmbuild -bp piranha.spec
到这步就卡住了,SPECS目录里面没有piranha.spec

相关推荐

    Nginx通过/etc/init.d/nginx方式启停【nginx配置文件】

    vi /etc/init.d/nginx 修改nginx后 chmod +x /etc/init.d/nginx /sbin/chkconfig nginx on sudo /sbin/chkconfig --list nginx /etc/init.d/nginx start

    详细unix命令大全

    /usr/sbin/lsattr -El sys0 -a realmem /usr/sbin/lsps -s HP-UX: grep Physical /var/adm/syslog/syslog.log /usr/sbin/swapinfo -t LINUX: cat /proc/meminfo|grep MemTotal /sbin/swapon -s SOLARIS: /usr/...

    IPsec及PKI

    网络安全技术中关于IPsec及PKI相关技术概述

    qt_uImage_root_GUI.zip

    修改:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin" 改为:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/...

    nessus2023-04-10漏洞更新包all-2.0.tar.gz

    nessus2023-04-10漏洞更新包all-2.0.tar.gz以把插件包上传到服务器后, 执行/opt/nessus/sbin/nessuscli update 插件包文件路径 Linux/Unix /opt/nessus/sbin/nessuscli fetch --register-offline nessus.license ...

    linux进程监控与自动重启的简单实现方法

    目的: linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。 实现原理: 由定时任务crontab调用脚本,脚本...proc_name=/home/wkubuntu/named/sbin/named # 进程名 fi

    linux-ftpd-0.17安装包

    压缩包已经解决了以下两个问题: 报错: (1) 报错内容:Compiler arm-linux-gcc does not exist or cannot compile C; try another. (2)报错内容:ftpcmd.y:108: error: array type has incomplete element type 4、...

    ORACLE数据库安装

    /usr/sbin/groupadd -g 501 oinstall /usr/sbin/groupadd -g 502 dba /usr/sbin/groupadd -g 503 oper /usr/sbin/useradd -g oinstall -G dba,oper oracle mkdir -p /opt/oracle/product/11.2.0/dbhome chown -R ...

    k8s 1.9 成功部署记录.txt

    /usr/sbin/semodule: Failed! restorecon: lstat(/var/lib/docker) failed: No such file or directory warning: %post(docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch) scriptlet failed, exit status 255

    Linux中Apache的配置详解

    Linux中Apache的配置详解Linux中Apache的配置详解

    A8开发板的/sbin/ip文件

    CAN0 up和down以及波特率设置不能使用的备用ip文件

    Linux命令学习总结:详解reboot命令

    相当于Windows系统中的restart命令。 命令语法: /sbin/reboot [-n] [-w] [-d] [-f] [-i] 或 reboot [-n] [-w] [-d] [-f] [-i] 命令参数: 参数 长参数 描叙 -d 重新启动时不把数据写入记录文件/...

    Linux系统目录解析

    /bin,/sbin与/usr/bin,/usr/sbin: /bin一般存放对于用户和系统来说“必须”的程序(二进制文件)。 /sbin一般存放用于系统管理的“必需”的程序(二进制文件,一般普通用户不会使用,根用户使用)。 /usr/bin一般...

    nessus2022-11-23漏洞更新包all-2.0.tar.gz

    nessus2022-11-23漏洞更新包all-2.0.tar.gz ,以把插件包上传到服务器后, 执行/opt/nessus/sbin/nessuscli update 插件包文件路径nessus2022-11-23漏洞更新包all-2.0.tar.gz ,以把插件包上传到服务器后, 执行/opt...

    1操作系统上机报告.doc

    /usr/lib/qt- 3.3/bin:/usr/kerberos/sbin:/usr/kerberos/ bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/ bin:/root/bin c.键入 which abcd,看看得到的错误信息; /usr/bin/...

    MAC常见五国及解决办法

    MAC常见五国及解决办法 开机按 F8 用 -v -s 进入后,键入以下命令,重建权限 /sbin/fsck -fy /sbin/mount -uw / chmod -R 755 mach_kernel chown -R root:wheel mach_kernel chmod -R 755 /System/Library...

    开机自起nginx

    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #ExecReload=/usr/local/nginx/sbin/nginx -s ...

    linux系统下网卡和路由的配置

     在该文件中加入类似下列各行(#号以后为注释,下同):  #配置第一个以太网卡eth0的IP地址,子网掩码,UP起激活作用  /sbin/ifconfig,etho 202.117.11.47 netmask 255.255.255.0 UP  #配置并激活回环设备lo ...

    linux全志R16的linux系统编译的资料_20170502_1655.7z

    ERROR: build buildroot Failed rootroot@cm-System-Product-Name:/home/wwt/linux_r16/lichee$ d/buildroot-config/conf.o /home/wwt/linux_r16/lichee/out/sun8iw5p1/linux/common/buildroot/build/buildroot-...

    Nginx启动常见错误及解决方法

    重新启动服务器,访问web服务发现无法浏览啦!登陆服务器之后进到nginx使用./nginx -s reload... [root@localhost sbin]# ./nginx -s reload  nginx: [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2

Global site tag (gtag.js) - Google Analytics