线上服务器数据同步与备份工具rsync的两种使用场景及示例
一.rsync
介绍
rsync
英文称为remote synchronizetion
。
它具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh
带的scp
命令,但是又优于scp
命令的功能,scp
每次都是全量拷贝,而rsync
可以增量拷贝。当然,rsync
还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp
命令。但是同样也优于cp
命令,cp
每次都是全量拷贝,而rsync
可以增量拷贝。
在同步数据的时候,默认情况下,rsync
通过其独特的quick check
算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可实现快速的同步备份数据。
它的优点是:
快速、高效,安全、可实现全量和增量的远程(和本地)文件及目录的同步与备份。
rsync
监听端口:873
rsync
运行模式:C/S
和C/C
通常用来作为线上服务器数据同步与备份。
二.C/S模式场景
C/S
即client/server
模式,它是在server
端启动一个服务端口873
,然后客户端来连接这个端口,进行数据的同步和传输。
这种模式采用守护进程的方式,定期将服务端指定目录的数据文件备份到客户端的硬盘中。
2.1环境准备与说明
现在有一台ORACLE的生产服务器,将其/data/oracle/oradata/orcl
文件定期备份到客户端/backup
目录下。
两台主机的主要信息如下:
类型 | 主机名 | IP 地址 | 操作系统 | 目录 |
---|---|---|---|---|
服务端S | oracledb |
192.168.250.172 | CentOS 7.3 |
/data/oracle/oradata/orcl |
客户端C | rsyncnew02 |
192.168.250.51 | CentOS 7.8 |
/mybackup |
2.2安装rsync
服务
rsync
服务需要在服务端和客户端主机上都要安装,下面分别安装:
先检查是否已经安装了该软件:
[root@oracledb ~]# rpm -qa | grep rsync
[root@oracledb ~]#
然后进行安装:
[root@oracledb ~]# yum install rsync
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
……
Running transaction
正在安装 : rsync-3.1.2-10.el7.x86_64 1/1
验证中 : rsync-3.1.2-10.el7.x86_64 1/1
已安装:
rsync.x86_64 0:3.1.2-10.el7 完毕!
[root@oracledb ~]#
主机rsyncnew02
的安装过程略。
2.3配置服务端文件
服务端配置文件目录为:/etc/rsyncd.conf
默认内容如下:
[root@oracledb ~]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# 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
[root@oracledb ~]#
先进行备份:
[root@oracledb ~]# cp /etc/rsyncd.conf /etc/rsyncd.conf.ori.20220803
[root@oracledb ~]# ls /etc/rsyncd.*
/etc/rsyncd.conf /etc/rsyncd.conf.ori.20220803
[root@oracledb ~]#
编辑配置文件:
[root@oracledb ~]# cat /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[myoracdb]
path = /data/oracle/oradata/orcl
comment = my oracle11g dba file
ignore errors
read only = true
list = false
uid = root
gid = root
auth users = backup
secrets file = /etc/server.pass
[root@oracledb ~]#
上面是编辑后的配置文件,其参数含义如下:
uid:指定当该模块传输文件时守护进程应该具有的用户ID,默认值是“nobody”。
gid:指定当该模块传输文件时守护进程应该具有的用户组ID。默认值为“nobody”。
use chroot = no:安全功能,是否锁定到备份目录。
max connections:指定模块的最大并发连接数量。默认值是0,没有限制。
pid file:指定rsync守护进程对应的PID文件路径。
lock file:指定支持max connections的锁文件,默认值是/var/run/rsyncd.lock。
log file:项指定了rsync的日志输出文件路径。
[myoracledb] :定义一个模块的开始,myoracledb就是对应的模块名称。
path:用来指定需要备份的文件或目录,必填,这里指定的目录为/data/oracle/oradata/orcl。
list:设定当客户请求可以使用的模块列表时,该模块是否被列出。默认值是true,如果需要建立隐藏的模块。可以设置为false。
auth users:用来定义可以连接该模块的用户名,多个用户用空格或逗号分隔开。需要注意的是这里的用户和Linux系统用户没有任何关系。这里指定的用户是backup。
secrets file:指定一个包含“用户名:密码”格式的文件,用户名就是“auth users”选项定义的用户,密码可以随便指定,只要和客户端的secrets file:只有在auth users被定义时,该文件才起作用。系统默认没有这个文件,自己手动创建一个即可。
2.4创建密码文件
还是在服务端接着创建密码文件:
[root@oracledb ~]# vim /etc/server.pass
[root@oracledb ~]# cat /etc/server.pass
backup:rsynctest123
[root@oracledb ~]#
2.5修改密码文件的访问权限
也就是只有root
用户有读写权限,将644
改为600
。
[root@oracledb ~]# ll /etc/server.pass
-rw-r--r-- 1 root root 20 8月 3 11:51 /etc/server.pass
[root@oracledb ~]# chmod 600 /etc/server.pass
[root@oracledb ~]# ll /etc/server.pass
-rw------- 1 root root 20 8月 3 11:51 /etc/server.pass
[root@oracledb ~]#
2.6设置启动相关
设置rsyncd
守护进程开机启动,并查看状态:
[root@oracledb ~]# systemctl start rsyncd
[root@oracledb ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
[root@oracledb ~]# systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2022-08-03 12:04:06 CST; 17s ago
Main PID: 20398 (rsync)
CGroup: /system.slice/rsyncd.service
└─20398 /usr/bin/rsync --daemon --no-detach
8月 03 12:04:06 oracledb systemd[1]: Started fast remote file copy program daemon.
8月 03 12:04:06 oracledb systemd[1]: Starting fast remote file copy program daemon...
[root@oracledb ~]#
2.7查看端口状态
启动成功后,查看一下服务端端口状态:
[root@oracledb ~]# netstat -antlp | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 20398/rsync
tcp6 0 0 :::873 :::* LISTEN 20398/rsync
[root@oracledb ~]#
端口为tcp
的873
。
2.8客户端部署
客户端安装rsync
服务软件后,主要操作如下:
1)创建备份目录
2)创建密码文件(这里只指定密码,不需要指定用户,否则报错1649
。
3)修改密码权限
[root@rsyncnew02 ~]# mkdir /mybackup
[root@rsyncnew02 ~]# echo "rsynctest123" > /etc/server.pass
[root@rsyncnew02 ~]# chmod 600 /etc/server.pass
[root@rsyncnew02 ~]#
2.9测试并排错
这里排错过程略过,请看近期公众号文章。
[root@rsyncnew02 ~]# /usr/local/bin/rsync -vzrtopg --delete --progress backup@192.168.250.172::myoracdb /mybackup --password-file=/etc/server.pass
receiving incremental file list
./
control01.ctl
9,748,480 100% 123.96MB/s 0:00:00 (xfr#1, to-chk=23/25)
nnc_data01.dbf
259,818,793 0% 49.39MB/s 0:11:14 ^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(638) [generator=3.1.2]
上面测试无错误,删除测试同步数据后,创建计划任务。
2.10创建计划任务
客户商创建计划任务,为了测试,下面设每隔2分钟
同步一次。
[root@rsyncnew02 ~]# crontab -l
no crontab for root
[root@rsyncnew02 ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@rsyncnew02 ~]# crontab -l
*/2 * * * * /usr/local/bin/rsync -vzrtopg --delete --progress backup@192.168.250.172::myoracdb /mybackup --password-file=/etc/server.pass
[root@rsyncnew02 ~]#
关于上面计划任务中:
/usr/local/bin/rsync -vzrtopg --delete --progress backup@192.168.250.172::myoracdb /mybackup --password-file=/etc/server.pass
这部分的含义解释如下:
-
-vzrtopg
:这是一个常用的组合。v是“-verbose”,即详细模式输出。
z表示“--compress” 即对备份的文件在传输时进行压缩处理。
r表示“--recursive”,也就是对子目录以递归模式处理。
t即“--times”,用来保持文件时间信息。
o即“--owner”用来保持文件属主信息。
p即“--perms”用来保持文件权限
g即“--group”用来保持文件的属组信息。
-
--delete
:指定以
rsync
服务端为基准进行数据镜像同步,也就是要保持rsync
服务端目录与客户端目录的完全一致性。 -
--progress
:用于显示数据镜像同步的过程。
-
backup@192.168.250.172::myoracdb
:表示对服务器192.168.250.172中的
myoracdb
模块进行备份,也就是指定备份的模块,backup
表示使用backup
这个用户对该模块进行备份。 -
/mybackup
:用于指定备份文件在客户端机器上的存放路径,也就是将备份的文件存放在备份机的
/mybackup
目录下。 -
--password-file=/etc/server.pass
:用来指定客户机上存放的密码文件位置,这样在客户端执行同步命令时就无需输入交互密码了,这个密码文件的名称和位置可以随意指定,但是在客户机上必须存在此文件,文件的内容仅仅为备份用户的密码,这里指的是backup的密码。
2.11计划任务检查
查看计划任务执行情况和同步数据:
[root@rsyncnew02 log]# tail -f cron
Aug 3 14:48:01 rsyncnew02 CROND[18149]: (root) CMD (/usr/local/bin/rsync -vzrtopg --delete --progress backup@192.168.250.172::myoracdb /mybackup --password-file=/etc/server.pass)
Aug 3 14:50:01 rsyncnew02 CROND[18179]: (root) CMD (/usr/local/bin/rsync -vzrtopg --delete --progress backup@192.168.250.172::myoracdb /mybackup --password-file=/etc/server.pass)
Aug 3 14:50:01 rsyncnew02 CROND[18178]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Aug 3 14:52:01 rsyncnew02 CROND[18221]: (root) CMD (/usr/local/bin/rsync -vzrtopg --delete --progress backup@192.168.250.172::myoracdb /mybackup --password-file=/etc/server.pass)
已成功同步数据:
[root@rsyncnew02 mybackup]# ls -alh
总用量 4.1G
drwxr-x---. 2 1001 1002 57 8月 3 14:54 .
dr-xr-xr-x. 18 root root 240 8月 3 14:00 ..
-rw-r-----. 1 1001 1002 9.3M 8月 3 14:53 control01.ctl
-rw-------. 1 root root 3.3G 8月 3 14:55 .nnc_data01.dbf.pGQVGy
[root@rsyncnew02 mybackup]#
上面这种场景是一种拉模式下的数据同步。
三.C/C模式场景
client/client
这种模式比较简单,不需要配置服务器。
默认情况下rsync
走的是ssh
协议的22
端口,如果ssh
是非默认的22
端口,那么可以添加-e
选项:
3.1环境说明
现有两台主机,服务端数据同步到客户端,主机信息如下:
类型 | 主机名 | IP 地址 | 操作系统 | 目录 |
---|---|---|---|---|
服务端S | rsyncnew01 |
192.168.250.50 | CentOS 7.8 |
/data |
客户端C | rsyncnew02 |
192.168.250.51 | CentOS 7.8 |
/mybackup |
3.2检查并安装rsync
服务
这个过程略,相关方法请参照本文前面的内容。
3.3推模式同步
这种模式在服务端执行命令,直接将文件推送到客户端指定目录下:
[root@rsyncnew01 /]# rsync -vzrtopg --delete --progress /data/extundelete-0.2.4.tar.bz2 root@192.168.250.51:/mybackup
The authenticity of host '192.168.250.51 (192.168.250.51)' can't be established.
ECDSA key fingerprint is SHA256:vThEoRhUOECeD5jhE+m8TZA2+6OoElIoNOQ3XqtopZw.
ECDSA key fingerprint is MD5:97:40:b2:35:6e:07:5a:61:1f:73:f1:b2:6e:54:5b:7d.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.250.51' (ECDSA) to the list of known hosts.
root@192.168.250.51's password:
sending incremental file list
extundelete-0.2.4.tar.bz2
108,472 100% 14.44MB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 108,599 bytes received 35 bytes 8,046.96 bytes/sec
total size is 108,472 speedup is 1.00
[root@rsyncnew01 /]#
然后在客户端``rsyncnew02`机子上查看同步成功:
[root@rsyncnew02 mybackup]# ll -sh
总用量 9.5M
9.3M -rw-r-----. 1 1001 1002 9.3M 8月 3 14:55 control01.ctl
108K -rw-r--r--. 1 root root 106K 8月 1 13:08 extundelete-0.2.4.tar.bz2
您在 /var/spool/mail/root 中有新邮件
[root@rsyncnew02 mybackup]#
3.4拉模式同步
拉模式和推模式相反,它是在客户端执行命令来同步服务端的数据,为了说明问题,我们再在rsyncnew01
主机上的/data
目录上传2个文件,然后执行同步目录:
同步之前,服务端rsyncnew01
主机上/data
目录下有3
个文件:
[root@rsyncnew01 data]# ll -h
总用量 2.9M
-rw-r--r--. 1 root root 106K 8月 1 13:08 extundelete-0.2.4.tar.bz2
-rw-r--r--. 1 root root 106K 8月 3 15:21 mytest.tar.gz
-rw-r--r--. 1 root root 2.7M 5月 11 14:19 nagios-plugins-2.3.3.tar.gz
[root@rsyncnew01 data]#
而客户端rsyncnew02
主机上有2
个文件,其中control01.ctl
在服务端是没有的,如下:
[root@rsyncnew02 mybackup]# ll -h
总用量 9.5M
-rw-r-----. 1 1001 1002 9.3M 8月 3 14:55 control01.ctl
-rw-r--r--. 1 root root 106K 8月 1 13:08 extundelete-0.2.4.tar.bz2
[root@rsyncnew02 mybackup]#
然后在rsyncnew02
主机上通过拉模式同步数据:
[root@rsyncnew02 /]# rsync -vzrtopg --delete --progress root@192.168.250.50:/data/ /mybackup/
The authenticity of host '192.168.250.50 (192.168.250.50)' can't be established.
ECDSA key fingerprint is SHA256:vThEoRhUOECeD5jhE+m8TZA2+6OoElIoNOQ3XqtopZw.
ECDSA key fingerprint is MD5:97:40:b2:35:6e:07:5a:61:1f:73:f1:b2:6e:54:5b:7d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.250.50' (ECDSA) to the list of known hosts.
root@192.168.250.50's password:
receiving incremental file list
deleting control01.ctl
./
mytest.tar.gz
108,472 100% 34.48MB/s 0:00:00 (xfr#1, to-chk=1/4)
nagios-plugins-2.3.3.tar.gz
2,782,610 100% 15.99MB/s 0:00:00 (xfr#2, to-chk=0/4)
sent 65 bytes received 2,889,406 bytes 214,034.89 bytes/sec
total size is 2,999,554 speedup is 1.04
[root@rsyncnew02 /]#
同步完成后,在rsyncnew02
主机/mybackup
目录下查看文件:
[root@rsyncnew02 /]# ll /mybackup -h
总用量 2.9M
-rw-r--r--. 1 root root 106K 8月 1 13:08 extundelete-0.2.4.tar.bz2
-rw-r--r--. 1 root root 106K 8月 3 15:21 mytest.tar.gz
-rw-r--r--. 1 root root 2.7M 5月 11 14:19 nagios-plugins-2.3.3.tar.gz
[root@rsyncnew02 /]#
发现和服务端文件完全一致,也就是一致性同步,之前的control01.ctl
文件自动消失。