博客园  :: 首页  :: 新随笔  :: 管理

rsync与sersync开启实时同步

Posted on 2024-01-15 00:50  hxsap  阅读(431)  评论(0)    收藏  举报

特点与优点

​ (1)可以镜像保存整个目录树和文件系统
​ (2)可以很容易做到保持原来文件的属性、权限、时间、软硬链接等等
​ (3)无须特殊权限即可安装
​ (4)快速:第一次同步时 rsync 复制全部内容,但在下一次只传输修改过的文件
​ (5)压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽
​ (6)安全性:可以使用 scp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接。选择性保持:符号连接,硬链接,文件属性,权限,时间等。

原理

​ 采用 C/S 模式(客户端/服务器模式)[ 实际上是一个点到点的传输,直接使用 rsync 命令即可完成 ]

默认端口:873

数据同步方式

​ push(推):一台主机负责把数据传送给其他主机
​ pull (拉):所有主机定时去找一台主机拉数据

常见选项

-a , --archive(存档) 归档模式,表示以递归的方式传输文件,并且保持文件属性,等同于加了参数-rlptgoD
-v:显示 rsync 过程中详细信息。
-r , --recursive 对子目录以递归模式处理
-l , --links 表示拷贝链接文件
-p , --perms 表示保持文件原有权限
-t , --times 表示保持文件原有时间
-g , --group 表示保持文件原有属用户组
-o , --owner 表示保持文件原有属主
-D , --devices 表示块设备文件信息
-z , --compress 表示压缩传输
-H:表示保留硬连接文件
-A:保留 ACL 属性信息
-P:显示传输进度
--delete 删除那些目标位置有而原始位置没有的文件

示例演示

示例一:

服务器/数据源:rsync-source (10.0.0.11)
客户端/备份端:rsync-backup(10.0.0.12)

# (1) 数据源/备份端,创建(数据传输用户)rget1
	useradd rget1 && echo "123456" |passwd --stdin rget1

# (2) 数据源:确定数据目录(并授权 rget1 用户权限)
	mkdir /var/www/html/ -p
# ACL权限
	setfacl -R -m user:rget1:rwx /var/www/html/
# 创建测试数据
	cp -r /boot/* /var/www/html/

# (3) 备份端:确定备份目录(并授权 rget1 用户权限)
	mkdir /web-backup
	chown rget1:rget1 -R /web-backup/

# (4) 数据源:切换用户 rget1 并创建与备份端之间的免密关联
	su - rget1
	ssh-keygen
	ssh-copy-id 10.0.0.12

# (5) 数据源:使用 rsync 命令向 备份端同步数据
	rsync -avz /var/www/html/ rget1@10.0.0.12:/web-backup/

# (6) 数据源/备份端 测试两边文件大小
	du -sh

示例二:

使用 push(推) 与 pull(拉) 单个文件进行数据同步,触发动作均在【数据源】上操作,区别在于发起动作的对象不同 push(推) 由 数据源主动将数据推向备份端进行数据同步,pull(拉)由备份端【可以多个】从数据源上拉取数据进行数据同步。

# (1) 备份端创建或修改配置文件[ /etc/rsyncd.conf],内容如下:
uid = root
gid = root
hosts allow =10.0.0.0/24
use chroot = yes
max connections = 100
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file =/var/log/rsyncd.log
motd file =/etc/rsyncd.motd
[wwwroot]
path = /web-backup/
comment = used for web-data root
read only = false
list = yes
auth users = huangxin
secrets file =/etc/huangxin.txt

选项解释说明:

uid					# 运行进程的身份
gid					# 运行进程的组
hosts allow			# 允许同步客户端的 IP 地址,可以是网段,或者用*表示所有 
use chroot			# 是否囚牢,锁定家目录,rsync 被黑之后,黑客无法再 rsync运行的家目录之外创建文件,选项设置为 yes
max connections		# 最大连接数
pid file			# 进程 PID,自动生成
lock file			# 指 max connectios 参数的锁文件
log file			# 日志文件位置
motd file			# 客户端登陆之后弹出的消息,需要创建
[wwwroot]			# 共享模块名称
path				# 备份数据存储路径
comment				# 描述
read only 			# 只读权限为假
list				# 是否允许查看模块信息
auth users			# 备份的用户,和系统用户无关
secrets file		# 存放用户的密码文件,格式是 用户名:密码
# (2) 创建客户端登陆之后弹出的消息 /etc/rsyncd.motd 
	echo "Welcome to Backup Server" > /etc/rsyncd.motd

# (3) 创建存放用户的密码文件 /etc/huangxin.txt 并授权
	echo "huangxin:123456" > /etc/huangxin.txt
	chmod 600 /etc/huangxin.txt
	
	systemctl restart rsyncd.service

# (4) 数据源创建登录客户端密码文件 /etc/rsync-password 并授权
	echo "123456" > /etc/rsync-password
	chmod 600 /etc/rsync-password

# (5) push(推) 进行数据同步
# 语法:rsync 选项 用户名@备份源服务器 IP::共享模块名 目标目录
rsync -avz /var/www/html/ huangxin@10.0.0.12::wwwroot --password-file=/etc/rsync-password

同步前:

同步后:

# (6) pull(拉取) 进行数据同步
rsync -azP huangxin@10.0.0.12::wwwroot /opt --password-file=/etc/rsync-password

示例三:

rsync+sersync 实现数据实时同步

# (1) 数据源上传 sersync 安装包 或 通过网络下载
cd /opt && wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
# (2) 解压并重名
tar xzf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 sersync

# (3) 备份源 confxml.xml 文件,并优化文件
cp -a confxml.xml confxml.xml.bak
vim confxml.xml
# 修改如下内容(23-35行)
 23     <sersync>
 24         <localpath watch="/var/www/html">
 25             <remote ip="10.0.0.12" name="wwwroot"/>
 26             <!--<remote ip="192.168.8.39" name="tongbu"/>-->
 27             <!--<remote ip="192.168.8.40" name="tongbu"/>-->
 28         </localpath>
 29         <rsync>
 30             <commonParams params="-artuz"/>
 31             <auth start="false" users="huangxin" passwordfile="/etc/rsync-password"/>
 32             <userDefinedPort start="false" port="874"/><!-- port=874 -->
 33             <timeout start="false" time="100"/><!-- timeout=100 -->
 34             <ssh start="false"/>
 35         </rsync>

# (4) 开启 sersync 进行同步守护
		/opt/sersync/sersync2 -d -r -o /opt/sersync/confxml.xml
# (5) 备份端注意排查 rsyncd 服务是否启动
		systemctl status rsyncd.service
		systemctl start rsyncd.service
		systemctl enable rsyncd.service
# (6) 备份端 监控数据同步状态:
 		watch -n 0.1 ls -l

常见错误总结

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
# 问题原因(CentOS偶然性):数据目录ACL权限先与目录中数据创建,为完全生效当前锁定用户的ACL权限。
# 解决方法:再一次执行授权数据目录ACL权限
	setfacl -R -m user:rget1:rwx /var/www/html/

拓展知识:

​ 公司有 200T 数据没有用了,现在需要删除一下。 现在磁盘使用情况如下:

使用 rm -rf ./* 删除提示如下:

问题分析:
如果用 rm 命令删除文件的时候,因为文件数量太多,导致参数列表太长,无法删除。
解决方法:

​ 用 rsync 来删除,rsync 就不会统计文件信息。使用 rsync 中--delete 参数,将一个空目录同步给被删除的目录。可以删除。如下:

mkdir /root/test # 创建一个空目录
rsync -azP --delete /root/test/ /需要删除的目录/