由于外网运行系统需要同时好几台机器提供服务,这样就有个问题是程序代码发布后,这些服务器怎么能比较及时的更新代码。这样就需要一个服务器之间文件同步的机制。在Unix下有一个比较好的工具rsync。具体场景为代码发布程序到服务器A,其他服务器B、C、D需要比较及时的从服务器A获取更新的代码。
整体架构是服务器A当做rsync server,其他几个服务器B、C、D定时与服务器A进行文件同步。(这些服务器的操作系统都是freeBSD)
第一步:搭建rsync server
1、安装 rsync 。采用ports方式安装,具体是在/usr/ports/net/rsync/ ,在该目录下make install。
2、配置rsync server,假定IP地址为:192.168.1.92
1)、创建目录/etc/rsyncd
2)、在/etc/rsyncd下创建三个文件:
rsyncd.conf(rsyncd的配置文件),其中配置文件的说明可以查看这个rsync.conf
rsyncd.secrets(rsyncd的认证文件),该文件的属性是600
rsyncd.motd (rsyncd的登录时候欢迎信息)。
具体rsyncd.conf配置如下:
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid #rsyncd的运行的ID号
port = 873 #rsyncd监听的端口号,
address = 192.168.1.92 #rsyncd的IP地址
uid = root #rsyncd运行的用户
gid = wheel #rsyncd运行的用户所属的组
use chroot = yes
read only = yes #只读
#limit access to private LANs
hosts allow=192.168.1.111/255.255.255.0 #允许那些IP地址可以访问这个rsyncd服务
hosts deny=* #拒接那些IP链接,*表示拒绝所有,这个与hosts allow一起判断
max connections = 5 #最大链接数
motd file = /etc/rsyncd/rsyncd.motd #欢迎界面内容
#This will give you a separate log file
#log file = /var/log/rsync.log
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log format = %t %a %m %f %b #log的格式
syslog facility = local3
timeout = 300
[home92] #模块,rsyncd采用模块方式来管理同步的目录,client端只需要指出需要同步的模块名称即可。
path = /home/test #同步时的目录
list=yes #是否允许list
ignore errors #忽略所有同步过程中的错误
auth users = waden #认证的用户(必须是服务器A的系统用户)
secrets file = /etc/rsyncd/rsyncd.secrets #waden的密码,最好不要和系统用户的密码一致。格式是用户:密码
comment = home 92
exclude = cryptmod/ et_security/ #该目录下/home/test不同步的目录
3)、启动rsync, 需要按照daemon方式启动,/usr/local/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
4)、可以通过命令rsync --list-only [email protected] 查看rsync服务器提供那些文件同步服务。
2、搭建rsync的client端。
1)、安装rsync
2)、执行命令rsync -avzP --delete [email protected]::home92 /home/waden
解释一下:-avzP
-a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息
--delete: 表示在被同步的目录下的文件在服务器A同步目录没有的话,就要被删除
[email protected]::home92 @之前的表示账号,接下里是服务器A的地址,然后是需要同步的模块
执行上述命令,会出现一个输入密码的提示,输入在A服务器rsyncd.secrets的密码
3)、为了自动能同步,需要设置一个密码文件,这样就不需要有提示输入密码的提示了。具体参数是:
--password-file=rsync.password
其中rsync.password文件的属性必须是600
为了能自动定时去执行同步的命令,只需要写个同步命令的脚本,然后放到crontab中定时去执行就可以了。