学习目标
1、能够理解为何要服务器间文件同步
2、能够简单描述实现文件同步的几种方式
3、能够实现服务器文件实时同步的案例
一、同步文件介绍
1、服务器文件同步的必要性
![](https://i-blog.csdnimg.cn/blog_migrate/8f4d5cc4f800a717d3d84f143635084e.png)
实现了线上服务的提供,可以给用户提供稳定的整个的web服务。但是,在最近的操作中,也发现了一些问题。
①当业务代码发生改变上传到web服务器时,因为架构已经不是单台服务器提供服务器,而是由多台web服务器提供服务,业务代码需要同时上传到多台web服务器,在操作上带来了很多不便。
故需要解决以上问题,就需要web服务器中的业务代码能够及时同步,保证业务代码的一致性。
业务集群:
线上 对外提供服务的 10台提供给用户对外服务 存储
线下 代码发布(CI CD git、jenkins、gitlab)灰度发布 监控(主机、服务zabbix),日志收集分析(ELK elasticsearch (elasticsearch-head) logstash kibana kafka消息队列)
2、同步文件的几种方式
ssh组件:ssh远程连接服务器 scp安全复制 sftp远程文件传输 慢 比ftp多了ssl
1、scp
scp是secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令 全量同步
问题:全部复制过去比较慢 效率低一些 scp不能够远程删除和增量同步
2、rsync
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法"来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快 增量同步
问题:当文件变动,不能够实时同步
3、rsync+sersync
inotify-tools和sersync属于同类
sersync是基于inotify+rsync的大量文件的多服务器自动同步程序
使用Linux 2.6内核 (uname -r )的inotify监控Linux文件系统事件,被监听目录下如果有文件发生修改,sersync将通过内核自动捕获到事件,并将该文件利用rsync同步到多台远程服务器。sersync仅仅同步发生增、删、改事件的单个文件或目录,不像rsync镜像同步那样需要比对双方服务器整个目录下数千万的文件,并且支持多线程同步,因此效率非常高
sersync主要用于服务器同步,web镜像等功能。基于boost1.43.0,inotify api,rsync command.开发
4、sersync特点:
1、 sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
相比较上面两个项目,sersync配置起来很简单,其中bin目录下已经有基本上静态编译的
2、二进制文件,配合bin目录下的xml配置文件直接使用即可。
另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
3、本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
4、本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。
5、本项目socket与http插件扩展,满足您二次开发的需要。
二、同步文件案例
![](https://i-blog.csdnimg.cn/blog_migrate/492cdbb03ba88b57a10a0767d701f8f8.png)
1、scp
语法: scp本地文件路径用户名@远程IP:远程存储路径
由于需要远程登录,故需要输入密码不是很方便,添加机器的公钥到允许列表中
如果scp远程连接没有响应,很可能是因为没有hosts解析目标服务器的ip
①生成公钥(源服务器)
ssh-keygen
![](https://i-blog.csdnimg.cn/blog_migrate/f7e6d87024d70b0846fb640fc6c8c8c5.png)
②添加公钥到允许文件(源服务器)
先切换到.ssh/
cd /root/ .ssh/
再复制添加公钥
ssh-copy-id -i id_rsa.pub 192.168.17.101
不指定-i也能自动创建authorized_keys,把公钥存进去 发送
![](https://i-blog.csdnimg.cn/blog_migrate/633c9ab5cb5809c528780a33d1a63e7c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd4c9d930ed94ddc4af4e0e47e7d7510.png)
scp -r /usr/local/nginx/html/tp5shop root@192.168.17.102:/usr/local/nginx/html
把整个目录都替换了,全量同步,因为scp不知道哪个文件修改了
可以把以上推送命令,写入到脚本中,业务代码变化之后,直接执行脚本就可以
缺点是速度慢,不能删除操作。
![](https://i-blog.csdnimg.cn/blog_migrate/039f58a73693424b1ea5943efe422f2c.png)
2、rsync
![](https://i-blog.csdnimg.cn/blog_migrate/0b5b039df3b0d0f98bbf9993109438a4.png)
既是一个服务,也是命令
1、web1文件变动
2、在web1执行推送
rsync -av /usr/local/nginx/html/tp5shop/ root@192.168.17.102:/usr/local/nginx/html
在web2上查看实现了增量同步,速度快
假如web1的文本被删除了,rsync也能实现同步删除操作 到远程的web2:ip 102
rsync -av --delete /usr/local/nginx/html/tp5shop/ root@192.168.17.102:/usr/local/nginx/html
问题:不能够文件变动就同步,想折中的版本通过计划任务(crontab) , crontab默认一分钟
![](https://i-blog.csdnimg.cn/blog_migrate/b6ef345246ccd968f52da9f06c3a5d5c.png)
tail -f /var/log/.cron
如何实现文件及时,自动同步?
可以写一个脚本:
vim rsync_20s.sh
![](https://i-blog.csdnimg.cn/blog_migrate/2ccfd657a5fa213691ed34c1efcf7dff.png)
到脚本所在目录后台启动脚本,脚本进程1723
![](https://i-blog.csdnimg.cn/blog_migrate/045102c40337cad0a2cec0bcea755a36.png)
还可以优化脚本,加上rsync日志信息
![](https://i-blog.csdnimg.cn/blog_migrate/ad6d2322285739df5c66f91a9f05c663.png)
![](https://i-blog.csdnimg.cn/blog_migrate/32c23b5e7618e52152882b8420b17c95.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f548c1434df468f9f87eb3d8b54f5e6e.png)
发送增加的文件80kB,被接收的472字节 每秒162276字节 sec秒的缩写 received 被接收
3、rersync + rsync
![](https://i-blog.csdnimg.cn/blog_migrate/1f12321e84d7fcf9f4e3bc971dcf6407.png)
实现方式:
源服务器 安装sersync 监控文件(inotify)的变动 调用rsync传输数据给目标服务器
目标服务器 启动rsync的服务器
源服务器必须 先生成密钥对,然后复制发送公钥给目标服务器实现ssh(远程连接)免密登录
rsync同步web2
sersync监控触发同步web1
3.1、目标服务器配置
配置rsync服务
1、安装rsync
yum -y install rsync
2、配置rsync
vim /etc/rsyncd . conf
配置文件内容
![](https://i-blog.csdnimg.cn/blog_migrate/5bb1a82cc9ed0a9c9b2cc872df310176.png)
启动daemon(后台进程) 也就是守护进程
![](https://i-blog.csdnimg.cn/blog_migrate/b77cc784369eb53699086fc8c40825e0.png)
3.2、源服务器配置
mv sersync2.5.4_64bit_binary_stable_final.tar.gz /usr/local/
cd /usr/local/
tar xvf sersync2 .5.4_64bit_binary_stable_final.tar. gz
mv GNU-Linux-x86 sersync //移动解压出来的文件到sersync
![](https://i-blog.csdnimg.cn/blog_migrate/db8cbca500c38ca42a323aa450938fba.png)
修改配置文件
如果需要同步多台web服务器,可以直接在源服务器的监控软件sersync的配置文件里面添加
目标服务器配置文件里面配置的模块name="模块名称"
![](https://i-blog.csdnimg.cn/blog_migrate/a2ee5da6e80002f21f79429f5d96d758.png)
![](https://i-blog.csdnimg.cn/blog_migrate/15c46ef7fa9a1e38d4d1e2639312accb.png)
启动sersync服务
![](https://i-blog.csdnimg.cn/blog_migrate/d778a59bc8cb0f38d1dc2ea39329a3a4.png)
有些文件源服务器需要,目标服务器不需要,可以排除设置
![](https://i-blog.csdnimg.cn/blog_migrate/e325a9324b474f0005a9e6478dcdd314.png)
![](https://i-blog.csdnimg.cn/blog_migrate/52e7dad18034157a51e04c72c9b6769a.png)