duanjigang 发表于 2011-03-01 17:49

详细讨论一个常见的网络工具如何设计

本帖最后由 duanjigang 于 2011-03-10 18:11 编辑

2011-03-10 18:00搞了三四天终于完成了一个版本,先做成了实时的反馈结果,测试一天,再调试多进程的异步方式,哈哈,测试命令如下:
#test batch upload file
./cmclient -p 12345 -f ip1.conf -u 1.txt -d /tmp/1/2-n 20

#test batch run commds
./cmclient -p 12345 -f ip.conf -c "uname -a"-n 20

#test single host command running
./cmclient -p 12345 -h 10.32.20.200 -c "uname -a"-n 20

#test single host file upload
./cmclient -p 12345 -h 10.32.20.200 -u Makefile -d /tmp/-n 20
运行结果如下:
deliver file to directory :
10.32.20.211
success
10.32.20.200
success
10.32.20.2
failed
run command :
10.32.20.211
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.224
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.227
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.228
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.231
10.32.20.200
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.214
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.217
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.218
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
10.32.20.219
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
run command :
10.32.20.200
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
deliver file to directory :
10.32.20.200
success
========================================
需求是这样,做一个部署在客户端的程序和部署在服务端的程序,具体目标如下:
客户端通过参数方式,向多个服务端发送指令,客户端期望知道服务端执行的最终结果。

考虑到的问题是:
第一:接收命令的服务器可能比较多,上万台,因此,客户端需要多线程去发送,当然不能一个主机一个线程吧?应该给每个线程分配N个节点,尽量平均。
第二:客户端发给服务器的命令不一定就是立刻能返回的,可能执行时间比较长,比如让服务器去下载一个文件,然后返回当前目录的大小,因此,我想客户端不能在当前连接中等待服务端返回执行结果吧,也就是说,服务端需要启动一个线程或者进程异步去执行这个任务。
第三:如果服务端异步执行命令,等命令执行完以后,怎么通知客户端,我现在能想到的就是,客户端在分发命令时,把自己的IP和端口以及命令ID一并发给每个服务器,服务器上的线程执行完以后,再连接该命令对应的客户端的地址,把命令ID以及结果反馈给原来发送命令的客户端机器。

关于以上三点,不知诸位有无意见或者更好的方法,谢谢讨论!

附上我设计的结构图,欢迎讨论


2011-03-03
今天实现了个基本的模型,能跑起来了,把结构修改了下,更新上来,但是如果服务器过多的话,可能出现反馈时N对1的情况,会对客户端主机造成类似DOS synflood的攻击吧?呵呵,不知道是不是这样,专业人士帮分析下?详细信息见23楼

Godbach 发表于 2011-03-01 17:51

通常比较大的互联网公司应该就会遇到这样的需求

duanjigang 发表于 2011-03-01 17:54

通常比较大的互联网公司应该就会遇到这样的需求
Godbach 发表于 2011-03-01 17:51 http://bbs.chinaunix.net/images/common/back.gif


    嗯,通过脚本实现的话,异步执行和反馈检查个人感觉不太好做,也不太准确,往往需要人为的判断和纠错。
因此想开发一个比较具体的客户端和服务端,能够把该任务的执行做到完全自动化。期待高见:em21:

send_linux 发表于 2011-03-01 18:12

嗯,通过脚本实现的话,异步执行和反馈检查个人感觉不太好做,也不太准确,往往需要人为的判断和 ...
duanjigang 发表于 2011-03-01 17:54 http://bbs.chinaunix.net/images/common/back.gif


    前两天蜘蛛大哥说他们弄了个系统,在微博上说的,我拖他过来..........:mrgreen:

贺兰云天 发表于 2011-03-01 18:15

好,多谢sendlinux

Godbach 发表于 2011-03-01 18:23

其实这个就需要不少配套的东西,你在服务器上预装一些常用的工具,然后你客户端调用的时候去执行。
客户端可以搞个工具,批量登陆服务器执行命令,并返回执行结果的模式

一介村夫 发表于 2011-03-01 18:26

连接来连接去的太麻烦,不如搞成多进程,每个进程连接若干的服务器并保持连接直到对方返回结果。

duanjigang 发表于 2011-03-01 18:39

其实这个就需要不少配套的东西,你在服务器上预装一些常用的工具,然后你客户端调用的时候去执行。
客户端 ...
Godbach 发表于 2011-03-01 18:23 http://bbs.chinaunix.net/images/common/back.gif


    之前做了个cme_scanner,是多线程调用ssh脚本自动登录执行命令返回结果,但是expect结合ssh做成的自动脚本总感觉不稳定,还有,对于这种执行时间比较长的任务吗,不能一直阻塞着等吧?

duanjigang 发表于 2011-03-01 18:41

连接来连接去的太麻烦,不如搞成多进程,每个进程连接若干的服务器并保持连接直到对方返回结果。
一介村夫 发表于 2011-03-01 18:26 http://bbs.chinaunix.net/images/common/back.gif


    这样的话,命令发起者对于服务器端的执行状态就不是很清楚了,呵呵,我现在设计了一个反馈线程(见一楼的图),在一个固定超时时间到达后,就给statserver返回一个状态信息,表明正在执行,这样是不是能好些?

Godbach 发表于 2011-03-01 18:51

远程执行命令的时候,可以加上一个超时机制吧。执行的命令那些耗时,那些很快就返回,你应该很清楚的。
页: [1] 2 3 4
查看完整版本: 详细讨论一个常见的网络工具如何设计