- 论坛徽章:
- 0
|
1000台以上的机器,要考虑一个问题 (1)时效性 (2)可用性 (3) 容错机制
时效性就是1000台服务器,如果要部署一个大的安装包,循环的机制是否可行,当遇到1台服务器当机,后面的循环会卡死
(2) 可用行
如果一台服务器都在一台服务器上分发的话,同时改上千上万台服务器,是否会成为瓶颈?
(3) 容错
批量更新上千,上万台服务器,需要有一个回馈,检查机制
我以前在部署机器少的时候 ,写过在securecrt客户端用js脚本来批量执行命令. 用expect我就不写了.
打开secureCrt,
# $language = "JScript"
# $interface = "1.0"
function main()
{
var str, server_ip, result;
crt.Screen.Synchronous = true;
InputComm = crt.Dialog.Prompt("输入你要在所有服务器运行的命令:", "批量执行命令", "", false);
ips = new Array(
'192.168.0.100',
'192.168.0.101',
'192.168.0.102',
'192.168.0.103',
'192.168.0.104',
'192.168.0.105',
'192.168.0.106',
'192.168.0.107',
'192.168.0.108',
'192.168.0.109'
);
ip_count = ips.length;
ip_selected = 0;
while (true)
{
ip_selected = ip_selected % ip_count;
server_ip = ips[ip_selected];
//crt.Dialog.MessageBox(server_ip);
result = crt.Screen.WaitForString("root@", 0); //登录提示文字
//crt.Dialog.MessageBox(result);
if (result)
{
crt.Screen.Send("ssh root@" + server_ip + "\r"); //登录的用户名和要登录的服务器
/*
result = crt.Screen.WaitForString("Are you sure you want to continue connecting (yes/no)? ", 0);
if (result)
{
crt.Screen.Send("yes" + "\r");
}
*/
result = crt.Screen.WaitForString(" password: ", 0);
if (result)
{
crt.Screen.Send("secret???" + "\r"); //发送登录密码
}
crt.Window.Caption = server_ip;
}
crt.Screen.Send(InputComm +" " + "\r");
ip_selected++;
if (ip_selected == ip_count)
{
// crt.Dialog.MessageBox("Finished!");
break;
}
}
}
将上面的文件保存成一个allServer.js
打开secureCrt,选择"菜单"-->"script"->"run" ->allServer.js 比如输入命令 "date"就会在所有的服务器上执行该命令了.
这么的好处是比如说每台服务器执行的deploy很长的话,如果在发布机上执行,就会消耗,很长的时间 . 这样发布系统只是一个分发命令的作用,不会给发布系统带来额外的压力.
参考这个这个原来,将这个代码部署为一个 web管理系统就很方便了,于是就产生了下面的方案.
我在中国移动手机视频项目的时候,就用php写过一个类似的管理系统. php下载一个一个扩展http://pecl.php.net/package/ssh2 , php就可以作为一个ssh的客户端了.
<?php
$connection = ssh2_connect('192.168.0.100', 22);
if (ssh2_auth_password($connection, 'root', 'secret')) {
echo "Authentication Successful!\n";
} else {
die('Authentication Failed...');
}
?>
登录后,就可以调用运行命令了. 考虑到服务器成千上万台,比如部署命令是 "wget http://192.168.0.200/deploy.rpm; rpm -Uvh deploy.sh &" 安装包服务器192.168.0.200用http集群.
另外需要修改操作系统 和php的文件数限制, 默认只支持同时打开1024个文件句柄. |
|