一、简介:
简介可参考该篇文章:Linux-Rsync服务器/客户端搭建_宇宙无敌大帅锅-CSDN博客_linux rsync客户端
Linux rsync 命令学习 - Michael翔 - 博客园
或参考博主的总结:
在进行集群部署时如何能更加高效,安全?CI/CD的出现是个很好的解决思路,但老旧系统由于各种原因短时间内无法满足CI/CD对于环境和系统的要求,因此还需要根据系统实际情况和特点去制定部署策略。
首先需要解决部署文件一致性的问题,目前能想到的有三种途经:
1.通过将部署文件放置于网络存储服务器上开放给集群系统共享的方式解决,比如NAS存储等。博主所维护的系统之前是通过nas存储这种方式,但因为公司要中止nas服务的使用,全部改为网络对象存储服务,而集群部署无法使用网络对象存储,因此该方式pass掉了。
2.可以手动搭建文件服务器进行服务器间文件共享。比如挂载文件服务器目录的方式,可以参考博主另一篇文章——> 如何进行mount远程挂载 里面有详细记录挂载步骤。这种方式有一个安全隐患,要防止文件服务器上文件丢失或宕机。因此还需要完善备份机制。
比如定期对部署文件进行备份 ,并备份到不同机器上。
3.通过数据备份工具将文件同步到各个集群服务器本地的方式解决,比如rsync+inotify、scp、ssh等。这种方式相对更加安全,不会出现文件丢失的问题,因此决定采用该种方式。
Rsync大致使用三种主要的数据传输方式:本地方式(单个主机本地之间的数据传输,类似cp命令) 、远程方式(ssh通道传输数据,类似scp命令)、c/s守护进程方式(服务,持续后台运行)
本文主要介绍rsync守护进程方式如何安装、配置、使用及故障排查,还会拿工作中的例子作为参考,以下为rsync传输的拓扑图:
- rsync分为服务器端、客户端,服务器端搭建的步骤会比客户端多一些。
- rsync服务器是指daemon方式运行rsync服务的服务器,需要打开rsync daemon和启动xineted服务,默认端口为873。
- rsync客户端是发起rsync连接的服务器,安装rsync即可。文件从客户端推到服务端。
-
rsync客户端发起连接后rsync服务器会检查rsync客户端提交rsync服务器内搭建的用户名和密码是否正确,如果通过检测,则开始文件传输,传输的过程是按照要求先对比文件的大小、属性、权限、MD5值等信息(innode信息),如果两端文件信息不一致,则按照要求同步文件的block块。
二、具体安装步骤:
可参考以下两位的文章进行安装,均为centos6系统下的安装步骤:
rsync+inotify实现多台服务器之间数据实时同步 - 服务器技术综合 - 最新IT资讯_电脑知识大全_网络安全教程 - 次元立方网
rsync+inotify实现多台服务器之间数据实时同步 - liumt - 博客园
若您跟博主一样操作系统是centos7,可以参考下述的安装步骤(区别不大):
1.先检查一下是否已安装rsync及xinetd,在centos7里rsync已被预安装,xinetd作为rsync的超级守护进程需要安装到服务端,这里一并介绍安装方法。不了解xinetd的可以看看这篇:Linux之Xinetd服务介绍_鹤啸九天-CSDN博客_xinetd
rpm -qa | grep rsync
rpm -qa | grep xinetd #服务端需要检查是否安装了xinetd
2.若未安装则执行下列命令进行安装,若已安装则会更新到最新版本
yum install rsync xinetd
3.对xinetd及rsync进行配置
首先服务端需要配置xinetd,将rsync配置到xinetd里
vim /etc/xinetd.d/rsync rsync文件之前是不存在的,这里是新建,加入下列配置项
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
4.启动xinetd
systemctl start xinetd.service
看是否已启动
ps aux |grep xinetd
查看处于listen态的TCP请求里是否有873端口,873端口是rsync的默认端口
ss -antl
5.然后进行rsync的相关文件配置
首先是修改/etc/rsyncd.conf ,这一步只在服务端进行,客户端不需要进行该文件的修改
注意:最好删掉注释部分,尤其是中文注释以避免因非法字符导致的rsync配置文件报错。博主曾经为此调试了好几个小时找不到原因...
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
uid = root
gid = root
use chroot = yes
max connections = 5
pid file = /var/run/rsyncd.pid
lockfile = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
timeout = 900
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp]
# path = /home/ftp
# comment = ftp export area
[code]
path = /nasweb1/codebase/bbs2020
ignore errors = yes
read only = no
write only = yes
hosts allow = 要进行同步的服务器IP
hosts deny = *
list = yes
uid = root
gid = root
auth users = code
secrets file = /etc/web.passwd
关于配置文件rsync.conf的详细说明可参考下面这篇文章:
rsync 03-rsyncd.conf配置文件 - 瞎搞的富哥 - 博客园
6.根据rsync.conf里配置的secrets file创建密码文件
echo "code:code" > /etc/web.passwd
对于服务端来说,配置文件需要用户名和密码,其中第一个code是auth users名,第二个code是对应的密码 。多个用户名和密码可以多行
对于客户端来说,配置文件只写入密码即可
然后将该文件权限置为600
chmod 600 /etc/web.passwd
7.服务端需要关闭selinux服务,不然文件推不过来
暂时关闭selinux命令:
setenforce 0
文件推送时服务端不关闭selinux会报下列错误:
rsync -vzrtlopg --delete --progress --password-file=/etc/web.passwd /nasweb1/codebase/aa code@服务端IP::code
sending incremental file list
rsync: recv_generator: mkdir "/aa" (in code) failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
aa/
8.服务端需要修改/etc/hosts,增加对客户端机器的声明,不然文件推送时会出现以下错误:
name lookup failed for 客户端IP: Name or service not known ‘
需要修改/etc/hosts将客户端IP进行命名
格式: 客户端IP 名字
9.在服务端创建同步目录
本次例子配置文件中设置的同步目录是/nasweb1/codebase/bbs2020,因此创建该目录
10.至此rsync的客户端、服务端基本安装配置完毕,试着推送一下文件试试
可以先使用如下命令check要同步的文件(只需要增加参数:--dry-run),会打印要同步的文件,这一步很有必要!
rsync -vzrtlopg --dry-run --progress --password-file=/etc/web.passwd /nasweb1/codebase/bbs2020/ code@服务端IP::code
执行完上述命令,确保无误后再在客户端输入命令:
rsync -vzrtlopg --progress --password-file=/etc/web.passwd /nasweb1/codebase/aa code@服务端IP::code
注意:
(1)指明同步目录为 /nasweb1/codebase/aa 说明要同步的是aa目录及其内容,如果是/nasweb1/codebase/aa/ 则仅同步aa目录下的文件,aa目录会被忽略。
(2)code@服务端IP::code 含义:第一个code是指服务端配置的auth users,第二个code是指的module名为code。
(3)要同步到服务端的 /nasweb1/codebase/bbs2020 目录下,具体同步到哪个目录下需要根据服务端配置的rsyncd.conf
看一下服务端:
已看到被同步过来的aa目录
解释一下rsync命令参数
-a | 归档模式传输, 等于-tropgDl |
-v | 详细模式输出, 打印速率, 文件数量等 |
-z | 传输时进行压缩以提高效率 |
-r | 递归传输目录及子目录,即目录下得所有目录都同样传输 |
-t | 保持文件时间信息 |
-o | 保持文件属主信息 |
-p | 保持文件权限 |
-g | 保持文件属组信息 |
-l | 保留软连接 |
-P | 显示同步的过程及传输时的进度等信息 |
-D | 保持设备文件信息 |
-L | 保留软连接指向的目标文件 |
-e | 使用的信道协议,指定替代rsh的shell程序 |
--exclude=自己设置的PATTERN | 指定排除不需要传输的文件模式 |
--exclude-from=文件目录 | 文件名所在的目录文件 |
--bwlimit=100 | 限速传输 |
--partial | 断点续传 |
--delete | 让目标目录和源目录数据保持一致,不会保留不一致的目标数据,全部删除 谨慎使用 |
这里多解释一下软连接的同步问题
如果仅仅复制软链接符号,使用小写l参数即可,链接的目标文件将不被同步,服务端如果没有软链接所指向的目标文件,则同步过来的软链接符号会出现红色的闪烁表示软链接失效。比如下图这种
如果想要将软链接指向的目标文件也推送过来,则使用大写L参数
三、故障排查:
错误集合:
偷懒搬运其他博主总结的教训:
rsync的BT故障排查_lizilinux_51CTO博客
rsync常见问题及解决办法(亲测)_w849593893的博客-CSDN博客
rsync常见问题及解决办法收集_tianshuai369_51CTO博客
关于auth failed on module XXX 错误的可能原因分析:
rsync关于auth failed on module xxx的解决方法 - 邱明成 - 博客园
关于password-file 权限问题:
rsync 远程同步记录--解决password-file权限问题。_finalheart的博客-CSDN博客_passwordfile rsync
关于no route to host的错误:
需要调整服务端的防火墙策略,放行873端口(如果xinetd设置的监听端口是873)
#放行873端口
iptables -I INPUT -p tcp -m tcp --dport 873 -j ACCEPT
#保存到iptables表
service iptables save
#查看iptables表,确认更改成功
cat /etc/sysconfig/iptables
#重启防火墙
service iptables restart
防火墙相关知识可以参考我写的另一篇文章:iptables基础知识及使用规范
除此以外在上述安装部分博主也提到了自己遇到的一些故障和解决办法。
至此 rsync的基本用法介绍完毕,喜欢的小伙伴帮忙点个赞,如有问题可留言探讨哦!