使用Gearman提高自动化运维的远程执行速度

在自动化运维时,经常需要用ssh登录一台远程主机,然后执行一条命令,获取结果后,再登录下一台。
每次ssh登录的开销都要0.5秒以上。
所以想到用gearman来替代ssh快速执行远程命令,每次远程执行的开销可以降到0.01秒。
当然是在安全的前提下,可以是集群的机器间互访,肯定不能对公网开放gearman服务端口。

gearman与ssh远程执行时间对比

下面是本地运行pwd,ssh远程运行pwd,gearman远程运行pwd的时间对比:

本地运行: 0毫秒
ssh运行: 129毫秒
gearman运行:10毫秒

ssh和gearman服务器都在本机,实际局域网多机间的ssh需要500毫秒,gearman还是10毫秒。

shen@debian:~$ time pwd
/home/shen

real    0m0.000s
user    0m0.000s
sys 0m0.000s

shen@debian:~$ time sshpass -p 123456 ssh debian 'pwd'
/home/shen

real    0m0.129s
user    0m0.012s
sys 0m0.000s

shen@debian:~$ time echo 'pwd' | gearman -h debian -f run 
/home/shen/gearman-workers

real    0m0.010s
user    0m0.004s
sys 0m0.000s

gearman worker: run 的相关脚本:

shen@debian:~/gearman-workers$ cat run.sh 
#!/bin/bash
read line
$line 2> _run_stderr
echo $? > _run_rc

shen@debian:~/gearman-workers$ cat stderr.sh 
#!/bin/bash
cat _run_stderr

shen@debian:~/gearman-workers$ cat rc.sh 
#!/bin/bash
cat _run_rc

启动gearman worker:

shen@debian:~/gearman-workers$ gearman -h debian -w -f run -- ./run.sh

shen@debian:~/gearman-workers$ gearman -h debian -w -f stderr -- ./stderr.sh 

shen@debian:~/gearman-workers$ gearman -h debian -w -f rc -- ./rc.sh 

gearman -h debian -w -f run -- ./run.sh 相当于开启了一个ssh server,可访问远程结点名称为debian

其他运维时常用的命令:

shen@debian:~$ echo 'df -h'  | gearman -h debian -f run
文件系统                                                容量  已用  可用 已用% 挂载点
rootfs                                                  455G  6.0G  426G    2% /
udev                                                     10M     0   10M    0% /dev
tmpfs                                                   388M  660K  387M    1% /run
/dev/disk/by-uuid/f863a021-7966-4cad-a24a-2670bba22d10  455G  6.0G  426G    2% /
tmpfs                                                   5.0M     0  5.0M    0% /run/lock
tmpfs                                                   1.6G   19M  1.6G    2% /run/shm
/dev/sda1                                               487M  128K  486M    1% /boot/efi
shen@debian:~$ gearman -h debian -s -f stderr
shen@debian:~$ gearman -h debian -s -f rc
0

shen@debian:~$ echo 'ls ~/aabbcd'  | gearman -h debian -f run
shen@debian:~$ gearman -h debian -s -f stderr
ls: 无法访问~/aabbcd: 没有那个文件或目录
shen@debian:~$ gearman -h debian -s -f rc
2

shen@debian:~$ echo 'ps -edf'  | gearman -h debian -f run | grep gearmand
root      4807     1  0 07:32 ?        00:00:00 /usr/local/sbin/gearmand -d
shen      5504  4892  0 08:38 pts/3    00:00:00 grep gearmand

使用Gearman提高自动化运维的远程执行速度_第1张图片

使用Gearman提高自动化运维的远程执行速度_第2张图片

使用Gearman提高自动化运维的远程执行速度_第3张图片

使用Gearman提高自动化运维的远程执行速度_第4张图片

注意:

  • gearman只能在命令执行完后,才会返回结果,
  • gearman不能执行交互式命令,例如top,ssh等,gearman worker将一直卡住。
  • gearman发出的命令不能取消,除非关闭对应的gearman worker。
  • gearman只能执行单一命令, ls | wc之类的复合命令都不能执行。

启动 gearman server:

RedHat:

sudo gearmand -d

Debian:

sudo /usr/local/sbin/gearmand -d

停止 gearman server:

不需要sudo执行

gearadmin --shutdown

远程也可以关闭

shen@debian:~/gearman-workers$ gearadmin -h debian --shutdown
shen@debian:~/gearman-workers$ gearadmin -h debian --workers
Error: Error connecting to debian.

启动 gearman worker:

gearman -h <gearman_server_ip> -w -i <pidfile> -f <worker> -- <command>

停止 gearman worker:

确保启动worker时,实用-i参数生成pid文件

shen@debian:~/gearman-workers$ gearman -h debian -i run.pid -w -f run -- ./run.sh

停止worker

shen@debian:~/gearman-workers$ kill -9 `cat run.pid`

使用Gearman提高自动化运维的远程执行速度_第5张图片

查看远程结点上是否已启动gearman worker:

3个worker: run, stderr, rc 都已启动情况

shen@debian:~$ gearadmin -h debian --workers
34 127.0.0.1 - : stderr
35 127.0.0.1 - : rc
36 127.0.0.1 - :
33 127.0.0.1 - : run
.

3个worker: run, stderr, rc 都未启动情况

shen@debian:~$ gearadmin -h debian --workers
33 127.0.0.1 - :
.

远程结点的gearman server未启动的情况

shen@debian:~$ gearadmin -h debian --workers
Error: Error connecting to debian.

怎么快速启动和关闭远程结点的gearman server和worker

这个时候需要ssh 帮忙了

远程启动gearman server

#准备工作:把远程结点的/usr/local/var/log/gearmand.log权限设为666
sudo chmod 777 /usr/local/var/log/
sudo chmod 666 /usr/local/var/log/gearmand.log

sshpass -p 123456 ssh debian '/usr/local/sbin/gearmand -d'

远程关闭gearman server

shen@debian:~/gearman-workers$ gearadmin -h debian --shutdown

远程启动gearman worker

shen@debian:~/gearman-workers$ cat start_worker_run.sh 
#!/bin/bash
cd $(dirname $(readlink -f $0))
nohup gearman -h debian -i run.pid -w -f run -- ./run.sh &

#必须使用ssh的-f参数
shen@debian:~$ sshpass -p 123456 ssh -f debian '/home/shen/gearman-workers/start_worker_run.sh'

远程关闭gearman worker

shen@debian:~$ sshpass -p 123456 ssh -f debian 'kill -9 `cat /home/shen/gearman-workers/run.pid`'

Gearman参考资料

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。它的 任务分布非常 简单,简单得可以只需要用脚本即可完成。

Redhat/CentOS上二进制安装gearman

yum install gearmand

Debian/Ubuntu上编译安装gearman: http://my.oschina.net/fitnessefan/blog/349664

官网: http://gearman.org/
使用入门: http://gearman.org/getting-started/

你可能感兴趣的:(gearman,自动化运维)