免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

[其他] 讨论:如何同步上百/千台服务器的某一个配置文件?(获奖名单已公布-2012-9-6) [复制链接]

论坛徽章:
0
91 [报告]
发表于 2012-07-12 08:13 |只看该作者


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个文件句柄.

论坛徽章:
0
92 [报告]
发表于 2012-07-12 08:17 |只看该作者
启用php的 pcntl多线程扩展包,就可以并发执行,把上面的脚本放在web服务器上,就可以通过浏览器,批量管理服务器了.

论坛徽章:
0
93 [报告]
发表于 2012-07-12 08:53 |只看该作者
回复 91# robinhunan


    多谢分享~!

论坛徽章:
0
94 [报告]
发表于 2012-07-12 14:37 |只看该作者
回复 54# 方兆国


   无盘站的运算和存储都由服务器承担,搞几百个无盘站来做什么服务啊?无盘工作站就是用来输入输出,服务器主要工作是计算和存储,两码子事。

论坛徽章:
0
95 [报告]
发表于 2012-07-12 16:03 |只看该作者
羡慕维护成百上千台服务器的~!

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
96 [报告]
发表于 2012-07-12 17:27 |只看该作者
本帖最后由 iceblood 于 2012-07-12 18:35 编辑

看了前面不少人用rsync等其实这个方法并不可取,因为需要在每台服务器上都做配置,还需要在每台服务器部署脚本,判断文件是否更新,更新了才让对应服务reload。总不能每次不管是否更新都reload对吧,仅仅这个部署过程就非常耗费时间。
因此我认为最好的方法还是ssh,方法如下:
一、将每个服务器的ssh的自动登录设置好。(向每个服务器的root传输authorized_keys文件)
二、使用scp将这台服务器的配置文件传到每个服务器对应的位置,然后使用ssh的远程执行模式重新加载配置。
按照以上思路,所有的配置只需要在一台服务器完成,其他服务器唯一动的地方就是authorized_keys文件的传输。
以下为我的脚本。脚本没通过测试,但基本思路是脚本中的内容。

  1. #!/bin/sh

  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

  3. CONFFILE=/root/httpd.conf
  4. #假设目前只有2台服务器
  5. IPLIST='1.1.1.1 2.2.2.2'
  6. for IP in ${IPLIST}; do
  7.         echo -n "Deploy ${IP}..."
  8.         ERR=0
  9.         scp ${CONFFILE} root@${IP}:/etc/httpd/httpd.conf > /dev/null && \
  10.                 ssh root@${IP} -- "/etc/init.d/httpd reload" > /dev/null || (echo "Fail!";ERR=1)
  11.         if [ "$ERR" = "0" ]; then
  12.                 echo "done."
  13.         fi
  14. done
复制代码
以上为单进程模式,再来一个多进程模式,但缺点是无法判断是否顺利的完成了部署。且相对比较消耗资源。

  1. #!/bin/sh

  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

  3. CONFFILE=/root/httpd.conf
  4. #假设目前只有2台服务器
  5. IPLIST='1.1.1.1 2.2.2.2'
  6. #进程数10个
  7. NUM=10
  8. for IP in ${IPLIST}; do
  9.         echo "Deploy ${IP}..."
  10.         scp ${CONFFILE} root@${IP}:/etc/httpd/httpd.conf > /dev/null && \
  11.                 ssh root@${IP} -- "/etc/init.d/httpd reload" > /dev/null &
  12.         T=$(ps axwwww | grep 'ssh root@' | grep -v grep | wc -l)
  13.         while [ $T -gt $NUM ]; do
  14.                 sleep 1
  15.                 T=$(ps axwwww | grep 'ssh root@' | grep -v grep | wc -l)
  16.         done
  17. done
复制代码

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
97 [报告]
发表于 2012-07-12 20:36 |只看该作者
dance_code 发表于 2012-07-12 14:37
回复 54# 方兆国


百度百科说:无盘工作站其实就是把硬盘和主机分离,无盘工作站只执行操作不执行存储。
所以我感觉用操作系统无盘化(从服务器端获取程序),他自己带上工作硬盘,对外提供服务

论坛徽章:
0
98 [报告]
发表于 2012-07-13 08:50 |只看该作者
回复 96# iceblood


    多谢分享

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
99 [报告]
发表于 2012-07-13 09:02 |只看该作者
多谢分享~!

论坛徽章:
0
100 [报告]
发表于 2012-07-14 11:10 |只看该作者
iceblood 发表于 2012-07-12 17:27
看了前面不少人用rsync等其实这个方法并不可取,因为需要在每台服务器上都做配置,还需要在每台服务器部署脚 ...


靠谱。 最省资源的做法拉
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP