两把集群管理利器

两把集群管理利器

May 2nd, 2011 绚丽也尘埃 Leave a comment Go to comments

最近手头上有12台服务器要管理,服务器主要用于运行tomcat服务器,经常需要重启tomcat,分发配置文件等。如何高效管理这十二台服务器?使用screan是必须的,但是还不够,很多操作如果手工去做,非常容易操作失误,或者漏掉某台服务器。这种情况下使用分布式shell是非常有必要的。在网上找了下,发现两个不错的工具。一个是pssh,另外一个是mssh,分别研究了一番,用起来感觉很不错的。

pssh包括好几个工具,有执行ssh命令的pssh,有执行拷贝的pscp,还有杀进程的pnuke等。mssh则简单许多,只能用于执行命令。二者均使用Python编写,原理都是使用subprocess模块,在线程中创建子进程来干活。由于使用了subprocess模块,它们只能运行于2.4版本以上。pssh代码组织非常好,将线程相关的代码放到一个模块中,因此几个工具的代码结构类似,另外涉及的模块也很多,是学习Python的一个好例子。mssh代码只有一个文件,非常简洁。

pssh比较适合工作量比较大,耗时比较久的命令,此时将服务器运行命令的输出到一个文件中,运行完之后便可以从文件中看到结果。如果命令比较短,需要将输出直接在终端输出,pssh可能就不太适用了。”-P”参数能将命令运行结果输出到终端上,但是会很混乱,从代码中可以看出,pssh会监听所有子进程的输出,只要有输出就将其写到缓冲区中,也不加上互斥,这样会导致格式混乱。pssh有一个很高级的特性,如果命令读输入的数据,并不需要将数据先分发到所有的节点上,只要数据在总控服务器上就行,运行命令如下。

?
1
cat testfile | pssh "grep yes"

另外使用pssh/pscp要注意一些特殊字符,比如*会被shell展开,如果要在集群所有机器上删除/home/admin/pv目录下的文件,使用下面这个命令可能就会出错,因为每台服务器pv目录下的文件都不一样。正确的方式是将*转义,或者将整个命令用引号(单引号和双引号都可以)引起来。

?
1
pssh rm -rf /home/admin/pv/ *

pssh默认超时时间为60s,有些操作可能比较耗费时间。比如删除一个文件即多又大的目录,此时需要将timeout设置大一点。可以在命令行通过”-t ns”或者设置环境变量PSSH_TIMEOUT来修改这个值。

使用过程中发现pssh有一个很蹊跷的问题,如果在脚本中使用pssh,发现程序会阻塞在pssh文件的buffer_input函数中”stdin = sys.stdin.read()”这一句上,上面已经将stdin设置成非阻塞了,并且在命令行中使用也没有问题,无解。pssh在脚本中需要特殊处理下才能正常工作。

?
1
echo '' | pssh "uptime"

pnuke使用”kill -9″直接杀死进程,有时候这种方式可能会导致问题。可以使用pssh运行服务器的正常停止命令。pnuke更多运用于需要简单粗暴杀死一组匹配进程的情景。

mssh适合做一些简单的操作,命令运行的结果也会直接输出到终端上,并且不会出现”pssh -P”那种混乱的显示结果。

pssh和mssh适合运维一批固定的服务器。如果是专门负责运维的同学,这两个工具还是不够的,因为服务器按用途分成了很多组,需对不同的组进行操作。如果能将服务器的用途信息写入专门的数据库中,然后按照应用名对集群进行操作,这会是更好的方法。比如打印出所有搜索服务器的运行时间及负载情况,只要指明”%search”,然后脚本自动去数据库中取服务器的信息,再执行相应的命令。

?
1
mssh %search "uptime"

你可能感兴趣的:(两把集群管理利器)