说明:

  服务器是腾讯的云服务器(腾讯用的是linux container),远程登陆云服务器需要使用代理,在服务器中不能访问外网,所以当时也就没有去想做svn

需求:

1、 把同样的代码同步到不同的服务器中,尽量做到各个服务器都能在一个很短的时间内同步完成

注:各服务器之间是在同一个内网中的,数据传输速度很快,当服务器数量不是很多时不需要考虑带宽的问题

在做这项工作时遇到的问题:

  1. 各个服务器之间使用rsync命令进行同步,优点是可以进行增量同步,缺点是每次都需要输入密码
  2. 如何保证各个服务器之间的同步能够尽量在同一时间进行
  3. 脚本|程序的扩展性,当增加或减少服务器时如何只需要很少的修改即可正常进行同步

解决方法:

问题1:

  rsync命令有一个-e参数,是用这个参数可以让其通过ssh进行数据同步。使用ssh就可以通过证书认证的方式达到不输入密码同步数据的效果。但是现实向来是残酷的,下面说下我解决这个问题的历程:

  刚开始我用的是一个算标准的流程吧,但是这个在centos上不适用,我本机用的是ubuntu

  

#输入下面这条命令后会提示你输入一个密码用来加密,可以留空
#因为是给线上服务器同步数据,所以就添加了一个密码password
ssh-keygen -f ~/.ssh/server
#在~/.ssh/目录下会生成两个文件,server(私钥)和server.pub(公钥)
#把公钥添加到线上服务器的认证列表中,因为是给多个服务器同时传送数据
#所以我把同一个公钥添加到了多个服务器上,以此减少认证的复杂度
ssh-copy-id -i ~/.ssh/server.pub serverUser@serverHost
#把私钥添加到ssh-agent中
ssh-add ~/.ssh/server
#报出如下错误
Could not open a connection to your authentication agent.
#意思就是无法连接到认证代理,在这里用的是ssh-agent
#执行命令
ssh-agent
#然后再进行添加,还是报同样的错误
#经过一番搜查需要运行如下命令
eval `ssh-agent -s`
#再次添加,这次OK了,添加时会提示输入证书的密码
#然后就是使用默认账号去连接线上服务器了
ssh serverUser@serverHost
#直接登入成功,但是咱的目的还没有达到,因为不能每次同步之前都先执行一下上面的命令吧
#然后我就找到了keychain这个东东,网上说用来管理证书会很方便,不用再去打开一个bash
#具体设置方法是编辑~/.bash_profile,在最后添加(我是参考着这个设置的:https://wiki.gentoo.org/wiki/Keychain,打开可能会有些慢) keychain ~/.ssh/id_dsa
. ~/.keychain/$HOSTNAME-sh
. ~/.keychain/$HOSTNAME-sh-gpg #保存之后执行一下
source ~/.bash_profile
#确实也有用,但是最后我发现每次我远程登陆这个服务器的时候这个证书都可以使用,我
#还是比较喜欢每次同步时输入以此证书密码
#因此又加入了--clear,每次登陆时重新添加证书,这时问题又来了,就是每次登陆此服务
#器我需要输入两次密码,后来我想把keychain的执行命令放到脚本中去,最后宣告失败
#因为在脚本中的话keychain的设置会不能生效
#最后的解决办法是eval `ssh-agent -s`和keychain结合使用
#使用eval `ssh-agent -s`打开一个bash shell,使用keychain --clear清除证书

  

问题2:

  通过资料得知bash是单线程,但是可以通过“&”实现同时执行多个命令,然后我就写了一个for循环,循环体后面加一个“&”符号确保所#执行配置文件,下面会讲到

source server.conf

#源路径
SOURCEDIR='/data/web' #线上服务器的路径
DESTDIR='/data/' #同步所需要的参数,--exclude参数指定要不需要同步的文件
#注意!--exclude=.*不要写成--exclude=".*",否则此参数会失效,具体原因我还没找到
RSYNCOPTION='-avz -i --exclude=.* --exclude=crossdomain.xml'
echo "sync ${SOURCEDIR}" #循环同步到线上服务器,下面会讲到配置
for server in $IP
do
{
#rsync 命令
COMMAND="rsync ${RSYNCOPTION} ${SOURCEDIR}
${USER}@${server}:${DESTDIR}"
#把所执行的命令和命令执行结果直接输出到日志文件中, 也许应该把正确日志和错误日志分开
echo $COMMAND >> ${LOGDIR}
$COMMAND >> ${LOGDIR}
#在后面添加一个"&"符号可以让for循环里面所有的步骤一起执行而不需要exec by step,这就在一定程度上解决了多个服务器之间同步有延迟的情况
} &
done

问题3:

  脚本的扩展性,因为同步路径都是固定的,所以不需要指定路径,需要变的只有增加或减少服务器的ip地址,配置server.conf的代码如下:

#!/usr/bin/env bash

# 判断是否已经运行了ssh-agent,如果不进行判断的话时间久了会出现很多ssh-agent的进程
agentExists=`ps aux|grep ssh-agent | grep -v grep`
if [ -z ${agentExists} ]
then
  # 清除已经存在的证书
        keychain --clear
else
    eval `ssh-agent -s`
fi ssh-add ~/.ssh/server1 # 服务器的ip地址,多个地址以空格隔开 IP='serverHost1 serverHost2' # servers user # 因为腾讯上一个应用的所有服务器用户名都一样,所以加了这个参数,如果也有人用的是腾讯的cvm的话也不用为每个ip指定用户名了 USER='serverUser' # 日志文件,记录同步日期和同步的内容的 LOGDIR='./rsync.log' DATE=`date`
#同步时间
echo "[${DATE}]" >> $LOGDIR

这个脚本我写好有一段时间了,现在想想我不应该直接把代码同步到线上,应该在线上服务器分别建立一个同步用文件夹,然后从同步文件夹同步到线上。

还有一个解决方案就是使用linux的磁盘自动挂载技术(autofs),所有的服务器挂载同一块磁盘,读取同一块磁盘中的数据,这样只需要同步一次即可全部更新,但是这时负载均衡的一个优势就失去了。当存有代码的服务器宕机之后所有的服务器都将不可用。各有利弊吧。

加油!Boy!

[linux][shell]负载均衡下多个服务器代码同步方案的更多相关文章

  1. 负载均衡下的资源文件配置/多站点下的资源文件夹共享(Windows IIS)

    前言: 负载均衡用的是NLB,微软的方案不太靠谱,举个例子吧,AB两台服务器负载出C,如果用户访问访问C之后分配的是A,那么如果A挂了,是不会自动切换到B的.据说后来还有一种NLB的方案可以实现,也不 ...

  2. Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)

    上一篇文章介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 ...

  3. Nginx负载均衡中后端节点服务器健康检查的操作梳理

    正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样 ...

  4. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  5. Linux CentOS 6.5 下 vsftpd ftp服务器搭建

    Linux CentOS 6.5 下 vsftpd ftp服务器搭建 by:授客 QQ:1033553122   操作系统环境:CentOS 6.5-x86_64 下载地址:http://www.ce ...

  6. Pycharm远程连接服务器(windows下远程修改服务器代码)

    1.写在前面     之前一致用putty,ssh,修改代码,或者本地修改,上传到服务器,各种不爽,现在改用xshell,但是有时候还是不方便感觉,于是自己配置了远程连接pycharm,这样不用总是到 ...

  7. Linux搭建nginx负载均衡(两台服务器之间)

    负载均衡种类 第一种:通过硬件负载解决,常见的有NetScaler.F5.Radware和Array等商用的负载均衡器,价格比较昂贵 第二种:通过软件负载解决,常见的软件有LVS.Nginx.apac ...

  8. springboot+nginx+https+linux实现负载均衡加域名访问简单测试

    把springboot项目打包成三个jar包,并指定端口为 14341,14342,14343 下载腾讯云免费ssl证书,解压后会出现如下图文件夹 把nginx文件夹下的 .crt 和 .key文件复 ...

  9. Linux centosVMware 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建

    一.负载均衡集群介绍 主流开源软件LVS.keepalived.haproxy.nginx等 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做 ...

随机推荐

  1. SpringBoot 整合 Security5

    https://my.oschina.net/yunduansing/blog/2032475 https://blog.csdn.net/SWPU_Lipan/article/details/805 ...

  2. Linux 命令之权限修改

    chmod 改变一个文件的权限:chmod [mode] file.txt改变一个目录的权限:chmod [mode] dir改变一个目录和其子目录的权限:    chmod [mode] dir - ...

  3. FreeRTOS 调试方法(printf---打印任务执行情况)

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家介绍 FreeRTOS 的调试方法,这里的调试方法主要是教会大家如何获取任务的执行情况,通过获取 ...

  4. 基于html5和jquery的篮球跳动游戏

    今天给大家分享一款基于html5和jquery的篮球跳动游戏.这款实例和之前分享的HTML5重力感应小球冲撞动画类似.用鼠标拖动篮球,篮球在页面上跳动,可在演示中看下效果.效果图如下: 在线预览    ...

  5. [基础]关于extern指针和数组的用法

    之前有在外面面试,遇到一题如下: filea.c char *p = "abcdefg"; fileb.c extern char p[]; printf(]); result=? ...

  6. Linux - Windows10连接linux服务器

    当我们通过windows连接服务器时,大多数用的是ssh客户端软件,推荐使用ssh,安全系数比较高.下面介绍用telnet连接服务器. 客户端:C:\Users\dell>systeminfo主 ...

  7. 009Maven_建立私服——报错问题

    前一篇文章的建立私服一直出问题,这里的问题是: jdk6.0只支持nuxus2.5及以下的版本,要支持nexus2.6以上,必须要jdk7.0以上.不然报错,把nexus-2.6.2war包放在Tom ...

  8. php -- 可变变量

    有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例如: <?php $a = 'hello'; ?> 一个可变变量获取了一个普通 ...

  9. js 版本号

    在web项目开发过程中,我们经常会引用css.js文件,更新文件后常出现缓存问题(明明更改了代码,在浏览器上访问的时候却没有发生变化),这种情况我们通常采用以下两种解决方案: 1.手动清除浏览器缓存 ...

  10. hdu 1232:畅通工程(数据结构,树,并查集)

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...