数据同步rsync
Rsync本地模式和远程模式
1.安装
yum install -y rsync
2.命令语法
- 本地模式
rsync 参数 src dest
1.对文件同步
[root@backup yum.repos.d]# rsync -avzP /var/log/messages /tmp/
sending incremental file list
messages
3,311,285 100% 84.50MB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 343,213 bytes received 35 bytes 686,496.00 bytes/sec
total size is 3,311,285 speedup is 9.65
2.对目录同步
拷贝整个目录
[root@backup yum.repos.d]# rsync -avzP /opt/sh /tmp/
sending incremental file list
sh/
sh/1.sh
1 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6)
sh/backup.sh
628 100% 613.28kB/s 0:00:00 (xfr#2, to-chk=3/6)
sh/cp.sh
624 100% 609.38kB/s 0:00:00 (xfr#3, to-chk=2/6)
sh/ping.sh
347 100% 338.87kB/s 0:00:00 (xfr#4, to-chk=1/6)
sh/tips.sh
472 100% 460.94kB/s 0:00:00 (xfr#5, to-chk=0/6)
sent 1,795 bytes received 115 bytes 3,820.00 bytes/sec
total size is 2,072 speedup is 1.08
[root@backup yum.repos.d]# ls /tmp/
messages sh
拷贝目录下文件
[root@backup yum.repos.d]# rsync -avzP /opt/sh/ /tmp/
sending incremental file list
./
1.sh
1 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6)
backup.sh
628 100% 613.28kB/s 0:00:00 (xfr#2, to-chk=3/6)
cp.sh
624 100% 609.38kB/s 0:00:00 (xfr#3, to-chk=2/6)
ping.sh
347 100% 338.87kB/s 0:00:00 (xfr#4, to-chk=1/6)
tips.sh
472 100% 460.94kB/s 0:00:00 (xfr#5, to-chk=0/6)
sent 1,780 bytes received 114 bytes 3,788.00 bytes/sec
total size is 2,072 speedup is 1.09
[root@backup yum.repos.d]# ls /tmp/
1.sh backup.sh cp.sh messages ping.sh sh tips.sh
- 远程模式
rsync 参数 src user@ip:dest
#推送模式
[root@backup ~]# ls /root/
1.txt Desktop Documents Downloads Music Pictures Public Templates Videos
[root@backup ~]# rsync -avzP /root/ root@web01:/tmp/
[root@web01 ~]# ls /tmp/
1.txt Desktop Documents Downloads Music Pictures Public Templates Videos
#拉取模式
[root@web01 ~]# ls /tmp/
[root@web01 ~]#
[root@backup ~]# rsync -az --delete root@web01:/tmp/ /tmp/
[root@backup ~]# ls /tmp/
[root@backup ~]#
-a 保持文件原有属性
-z 对传输数据压缩
-P 显示文件传输进度
-v 显示传输细节情况
--bwlimit 传输时限速
--delete 无差异化拷贝,保证目标和源目录一致,将目标中和源目录中不一样的s
rsync服务端
为什么需要服务模式
Rsync借助ssh协议同步数据存在的缺陷
1.使用系统用户(不安全)
2.使用普通用户(权限不足)
3.守护进程传输方式(不使用系统用户,更安全)
简化配置:通过守护进程模式,可以更容易地设置和管理多个用户和模块,适合需要定期备份或同步的场景。
性能优化:rsync通过增量传输的方式,只同步变化的数据,能够有效减少带宽使用和传输时间。
灵活的访问控制:可以在配置文件中设置不同模块的访问权限,允许或限制特定用户对特定数据的访问。
易于使用:客户端可以直接连接到rsync服务端,不需要每次都输入SSH凭证,适合自动化任务或脚本。
支持多种传输方式:可以配置使用TCP/IP进行传输,而不是依赖于SSH,适合一些特定的网络环境。
适合大规模部署:在大型网络或企业环境中,rsync服务端能够集中管理数据同步,方便多台机器的备份和更新。
rsync服务端部署
1.安装rsync
yum install -y rsync
2.修改配置文件
cat > /etc/rsyncd.conf <<EOF
uid = www
gid = www
port = 873 #监听端口
fake super = yes #无需让rsync以root身份运行,允许接受文件的完整属性
use chroot = no #禁锢推送的数据到某个目录,不允许跳出该目录
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup #定义虚拟用户,作为链接认证用户
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
-----
[backup] #定义模块信息
comment = 123 #定义注释信息
path = /backup #定义接受备份数据目录
3.创建用户
useradd -u 1100 -M -s /sbin/nologin www -M 没有家目录
4.创建backup文件夹
mkdir /backup
chown -R www:www /backup
5.创建rsync专用账户密码
echo rsync_backup:111> /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
6.用systemctl管理rsync服务
创建一个配置文件
[root@localhost conf]# vi /etc/sysconfig/rsyncd
OPTIONS=""
这个文件用于设置环境变量。OPTIONS 变量可以用来定义启动 rsync 守护进程时的额外参数。这里初始为空,意味着没有额外参数。
创建service文件
[root@localhost conf]# vi /lib/systemd/system/rsyncd.service
[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf
[Service]
EnvironmentFile=/etc/sysconfig/rsyncd
ExecStart=/usr/bin/rsync --daemon --no-detach "$OPTIONS"
[Install]
WantedBy=multi-user.target
[Unit]
Description: 这行描述了服务的作用,这里是“快速远程文件复制程序守护进程”。
ConditionPathExists: 这个条件检查 /etc/rsyncd.conf 文件是否存在,如果不存在,服务不会启动。
[Service]
EnvironmentFile: 指定一个环境文件,这里是 /etc/sysconfig/rsyncd,会加载里面定义的环境变量。
ExecStart: 定义了服务启动时执行的命令。这里是调用 rsync 以守护进程模式运行,并且使用 --no-detach 选项保持在前台运行。"$OPTIONS" 是从环境文件中读取的选项。
[Install]
WantedBy: 指定该服务应该在什么目标下启动,这里是 multi-user.target,意味着在多用户模式下启动。
脚本部署
#!/bin/bash
# 环境检查
echo "开始进行初始环境检查..."
# 检查rsync是否安装
if ! command -v rsync &>/dev/null; then
echo "rsync未安装,正在安装..."
# 在CentOS系统上安装rsync
yum install -y rsync
else
echo "rsync已安装"
fi
# 检查防火墙是否开启
if systemctl is-active --quiet firewalld; then
echo "防火墙已开启,正在配置开放端口..."
# 配置防火墙开放rsync端口(873)
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reload
else
echo "防火墙未开启或未使用firewalld,跳过防火墙配置"
fi
# 检查SELinux是否关闭
selinux_status=$(sestatus | grep "SELinux status" | awk '{print $3}')
if [ "$selinux_status" != "disabled" ]; then
echo "SELinux未关闭,正在禁用SELinux..."
# 临时关闭SELinux(重启后需要再次禁用)
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
else
echo "SELinux已关闭"
fi
# 生成rsync服务端配置文件
echo "生成rsyncd.conf配置文件..."
cat > /etc/rsyncd.conf <<EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
-----
[backup]
comment = 123
path = /backup
EOF
# 创建rsync服务专用用户
echo "创建rsync服务专用用户..."
useradd -u 1100 -M -s /sbin/nologin www
# 创建备份目录并设置权限
echo "创建/backup目录并设置权限..."
mkdir -p /backup
chown -R www:www /backup
# 创建rsync密码文件
echo "创建rsync服务密码文件..."
echo "rsync_backup:111" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
# 配置日志目录
mkdir -p /var/log
touch /var/log/rsyncd.log
chown www:www /var/log/rsyncd.log
# 启用并启动rsync服务
echo "启用并启动rsync服务..."
# CentOS通常使用`rsyncd`作为服务名
systemctl enable rsyncd
systemctl start rsyncd
# 打印服务状态
echo "rsync服务状态:"
systemctl status rsyncd
echo "rsync服务部署完成!"
rsync客户端
安装rsync
yum install -y rsync
推送模式
[root@web01 yum.repos.d]# rsync -avzP /root/ [email protected]::backup
Password: 这里需要输入密码
sending incremental file list
./
非交互式密码的两种操作
1.生成密码文件
[root@web01 yum.repos.d]# echo 111 > /etc/rsync.pwd
[root@web01 yum.repos.d]# chmod 600 /etc/rsync.pwd
[root@web01 yum.repos.d]# rsync -avzP --password-file=/etc/rsync.pwd /root/ [email protected]::backup
sending incremental file list
./
1.txt
81,659 100% 46.63MB/s 0:00:00 (xfr#1, to-chk=19/30)
anaconda-ks.cfg
1,190 100% 1.13MB/s 0:00:00 (xfr#2, to-chk=18/30)
initial-setup-ks.cfg
1,574 100% 1.50MB/s 0:00:00 (xfr#3, to-chk=17/30)
logs_20241031103922_backupd_storaged_1730342418.tar
58,852,864 100% 40.67MB/s 0:00:01 (xfr#4, to-chk=16/30)
sent 39,137,738 bytes received 112 bytes 26,091,900.00 bytes/sec
total size is 60,255,520 speedup is 1.54
2.环境变量
export RSYNC_PASSWORD='111'
[root@web01 yum.repos.d]# export RSYNC_PASSWORD='111'
[root@web01 yum.repos.d]# rsync -avzP /root/ [email protected]::backup
sending incremental file list
./
1.txt
81,659 100% 46.63MB/s 0:00:00 (xfr#1, to-chk=19/30)
anaconda-ks.cfg
1,190 100% 1.13MB/s 0:00:00 (xfr#2, to-chk=18/30)
initial-setup-ks.cfg
1,574 100% 768.55kB/s 0:00:00 (xfr#3, to-chk=17/30)
logs_20241031103922_backupd_storaged_1730342418.tar
58,852,864 100% 39.53MB/s 0:00:01 (xfr#4, to-chk=16/30)
sent 39,137,738 bytes received 112 bytes 15,655,140.00 bytes/sec
total size is 60,255,520 speedup is 1.54
下载模式
[root@web01 yum.repos.d]# rsync -avzP [email protected]::backup /tmp/
skipping directory .
sent 8 bytes received 38 bytes 92.00 bytes/sec
total size is 0 speedup is 0.00
[root@web01 yum.repos.d]# ls /tmp
1.txt anaconda-ks.cfg initial-setup-ks.cfg logs_20241031103922_backupd_storaged_1730342418.tar
inotify-tools +rsync
1.配置epel源
2.安装inotify-tools
[root@backup ~]# yum install -y inotify-tools
[root@backup ~]# ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r--. 1 root root 0 Nov 2 09:02 max_queued_events
-rw-r--r--. 1 root root 0 Nov 2 09:02 max_user_instances
-rw-r--r--. 1 root root 0 Nov 2 09:02 max_user_watches
能看到三个文件就代表内核支持inotify机制
3.如何使用
inotifywait 是一个常用的命令行工具,可以用于监视文件和目录的变化。
-m 或 --monitor: 持续监视指定的文件或目录,直到手动停止。
-e 或 --event: 指定要监视的事件类型,可以指定多个事件。常见的事件包括:
access (IN_ACCESS)
modify (IN_MODIFY)
attrib (IN_ATTRIB)
close_write (IN_CLOSE_WRITE)
close_nowrite (IN_CLOSE_NOWRITE)
open (IN_OPEN)
moved_to (IN_MOVED_TO)
moved_from (IN_MOVED_FROM)
create (IN_CREATE)
delete (IN_DELETE)
delete_self (IN_DELETE_SELF)
move_self (IN_MOVE_SELF)
unmount (IN_UNMOUNT)
-r 或 --recursive: 递归监视指定目录中的所有子目录。
-q 或 --quiet: 仅显示事件,不输出额外的提示信息。
--format: 自定义输出格式。例如,可以指定只输出文件名或事件类型
[root@backup ~]# inotifywait -mqr --timefmt '%T' --format "%T %w %f: %e" /backup
09:13:26 /backup/ 1: DELETE
09:13:26 /backup/ 1.txt: DELETE
09:13:26 /backup/ anaconda-ks.cfg: DELETE
09:13:26 /backup/ initial-setup-ks.cfg: DELETE
09:13:26 /backup/ logs_20241031103922_backupd_storaged_1730342418.tar: DELETE
--timefmt '%T': 设置时间格式,用于输出事件发生的时间。
--format "%T %w %f: %e": 自定义输出格式。具体来说:
%T:事件发生的时间(根据 --timefmt 设置)。
%w:监视的目录路径。
%f:发生变化的文件名。
%e:事件类型(如创建、修改、删除等)。
/backup: 指定要监视的目录路径。
lsyncd
一般lsyncd部署在rsync客户端
关闭selinxu
1.安装lsyncd
[root@backup ~]# yum install -y lsyncd
2.修改配置文件
(只监测一个目录)
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/run/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8
}
sync {
default.rsync,
source = "/tmp",
target = "rsync_backup@backup:backup",
delete = true,
exclude = {".*"},
delay = 1,
rsync = {
binary = "usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsync.pwd",
_extra = {"--bwlimit=200"}
}
}
logfile: 指定 lsyncd 的日志文件路径,所有日志信息将记录在此文件中。
statusFile: 指定状态文件的路径,用于存储 lsyncd 的运行状态信息。
inotifyMode: 设置 inotify 的模式为 CloseWrite,这意味着只有在文件关闭后写入时才触发事件。这可以减少频繁写入时的不必要触发。
MaxProcesses: 设置允许的最大并发进程数。这里设为 8,意味着可以同时处理最多 8 个文件同步进程。
default.rsync: 指定使用 rsync 作为同步方式。
source: 定义要监视和同步的源目录路径。
target: 定义目标路径,通常是一个远程服务器的目录,使用 SSH 进行连接。
delete: 设置为 true,表示在目标中删除源目录中不存在的文件,以保持同步的一致性。
exclude: 这是一个排除模式,定义要排除的文件或目录。在这里,".*" 表示排除所有以点开头的文件(通常是隐藏文件)。
delay: 设置在检测到文件变化后,实际执行同步的延迟时间(以秒为单位)。这里设为 1 秒,意味着在事件发生后的 1 秒内不会进行同步。
binary: 指定 rsync 的可执行文件路径。在这里的路径应为 /usr/bin/rsync(请注意可能缺少前导 /)。
archive: 设置为 true,表示使用归档模式,这会保持文件的权限、时间戳等属性。
compress: 设置为 true,在同步过程中压缩数据以节省带宽。
verbose: 设置为 true,表示输出详细的同步过程信息。
password_file: 指定一个文件路径,该文件包含用于 SSH 连接的 rsync 密码。确保该文件的权限设置为安全,以防止未授权访问。
_extra: 传递给 rsync 的额外参数,这里使用 --delete 来确保目标中不在源中的文件被删除。
标签:rsync,同步,backup,--,数据,00,sh,root
From: https://www.cnblogs.com/cloudwangsa/p/18563746