分布式系统管理利剑--pdsh

最近受命为系统增加一个紧急关机功能,刚开始想自己写个shell脚本来控制机群中的数百台机器的关闭,后来发现有现成的软件可以使用,这使得对分布式机群管理方便不少。下面先介绍一下PDSH.

PDSH(Parallel Distributed SHell) 可以并行的执行对目标机器的操作,它采用滑动窗口机制,当目标机器数不能填满窗口时,master主机(发出操作命令的机器)可以并行的对目标执行操作,当窗口满时,对剩余的目标机器的操作会等到窗口有空时才会调度填入窗口。当pdsh接收到SIGINT(CTRL+C)中断时,会显示当前运行的连接的状态。一秒内的第二次SIGINT将会结束pdsh线程。等待的线程是指那些还没被初始化,或正在和目标主机连接中的线程。这些线会在相距SIGINT一秒内的ctrl+z所取消。如果没有指定pdsh的command,则pdsh 以交互的方式运行。

其语法如下:

选项

pdsh [options] ... command

方括号中用来指定目标主机及其它参数,command 用来指定在目标主机上所要执行的命令。

值得注意的是,使用pdsh 时,master该机必须用所要连接目标主机的用户具有无密码访问的权限,且连接时亦不询问yes 或no才可以对目标主机操作成功,具体无密码访问方法可以查阅其它资料。

所有的参数可以通过pdsh --help来查看,下面简要介绍一下其中的常用参数:

-w TARGET, .....

 TARGET用来指示目标主机或目标的过滤条件,该参数不可和-a,-g同时使用,TARGET可以直接使用主机名或主机名列表,如“pdsh -w node1,node2,node3 date” (命令中不含引号,此处只是用来和文字加以隔离,下同)  ,此命令用来查看node1,node2,node3上的时间。可以对目标主机指定范围,如“pdsh -w node[1-10] date” ,在node1到node10上执行date命令。如果目标主机名前有“-”,则表示将此主机从目标中排除,如“pdsh -w node[1-10] -node5 date” ,此命令的目标主机为node1至node4,node6至node10。如果目标前为“^”,则用来指示包含目标主机的文件,文件中每行一个该机名。如“pdsh -w /home/oralce/namelist date” 。如果以“-”开始,后跟“/”,则表示用来选择目标主机的正则表达式,如

pdsh -w host[0-20],/0$/ ...
表示host0-host20中选择以0结尾的主机名。此外,目标主机前还可以加连接模块名及连接的用户名。如“pdsh -w ssh:oracle@node[1-10] date” ,表示使用ssh连接目标该机的oracle用户。

-x host,host,....

用来将主机排除在目标主机之外,一般和-a,-g连用。“^”,“/”,“-”用法与上相同,不再说明。

-l user

这个选项用来指定以user连接到目标主机上。

-t seconds

用来设置连接的超时时间,以秒为单位。默认为10秒。

-u seconds

用来设置远程命令执行的超时时间,以秒为单位,以ssh 连接 时,默认时间为无限。

-f number

用来设置同时连接的目标主机的个数,

-N

用来关闭目标主机所返回值前的主机名显示。

-g groupname

指定目标主机的组名

-X groupname

用来将组名内的主机从目标主机中排除。

-V

用来显示当前pdsh的版本信息及所加载的模块信息。

-L

用来显示当块所有加载的模块信息。

模块(RCMD Modules)

 指用来执行远程命令的方法,可以通过参数-R来指定。一般有rsh,exec,及ssh,在我的服务器上,默认使用的是rsh。本文中以ssh为例进行讲解。

以上内容参考了
http://linux.die.net/man/1/pdsh

http://code.google.com/p/pdsh/wiki/UsingPDSH#Other_Standard_PDSH_options


示例

使用pdsh用关闭系统中的计算机。由于关机命令shutdown属于root用户的专属命令,所以执行远程关机命令时要使用root,或配置sudo,来使用普通用户具有执行关机的权限。
我这里用来发出关机命令的机器名为smdb,用其来执行pdsh。由于系统中机器很多且主机名没有太强的规律,所以通过-w来指定主机很麻烦。所以考虑用-g来指定主机。

要使用-g参数,首先要配置主机名文件,在要发出关机命令的主机smdb的当前用户下,这里用的是oracle用户,增加文件/home/oracle/.dsh/group/all 文件,文件中每行一个目标主机名。配置完成后便可以执行远程关机命令了。

pdsh -R ssh -g all -l zhangjc sudo /sbin/shutdown -h 5

-R ssh 使ssh连接,-g all 指定目标主机为上面配置好的all 文件,如有其它组别,可另行配置。-l zhangjc指定在目标主机上以zhangjc用户执行关机命令,此时要在目标主机上提前配置好用用户zhangjc的sudo 权限。sudo /sbin/shutdown -h 5指定在目标主机上5分钟后关闭计算机。
这时问题便来了,发出关机指令的主机smdb要等待目标主机的完成命令后才返回,且窗口大小不能容下系统中所有主机,所以smdb中的pdsh命令会等到一部分目标主机关机后才会向其它的目标主机发送关机指令。为解决这个问题我们可以设置一个超时。

pdsh -u 1 -R ssh -g all -l zhangjc sudo /sbin/shutdown -h 5

这样smdb连接到目标主机后会等待目标主机一秒钟,然后超时返回向其它目标主机发送关机命令。

在做实验时可以用shutdown -k 5 来代替真正的关机。

异常

在测试中出现了一个异常,在smdb执行上述命令时,当连续按两次ctrl+c时,便终止了目标主机的关机命令,同时也结束pdsh进程 ,但发出此后已连接到目标主机的终端可以继续连接,但无法通过新的连接来连接到目标主机了,并提示如下消息;
 
    
Last login :Mon Dec  26 21:06:08 2011 from smdb
The system is going down on Tue Dec 27 10:07:58 2011


,研究后发现当目标主机执行shutdown时,会先在/etc/目录下生成nologin 文件,此文件的存在会阻止其它用户的登陆,只以把其删除即可。


另外还有pdcp 用来将某结点上的文件复制到其它目标结点上,此命令对于大规模系统上程序的发布很有用。


你可能感兴趣的:(技术文章)