实际生产中,数据的备份非常重要,市场上提供很多商用软件的解决方案,功能和性能的优势明显,但是都需要付费,我们在本文中介绍如何利用LInux下自带的rsync软件实现目录的定周期同步,进而实现数据备份。基本思路:在生产服务器和备份服务器之间实现SSH免密登录,两台服务器的操作系统CentOS8.4内核中都集成了rsync-3.1.3,利用rsync自身的同步功能实现数据同步,再结合crontab定时任务完成固定周期内的两个目录的定时同步。

1. 架构及主机

目录同步实战案例(一):用rsync+crontab实现www目录定时同步_定时同步

两台服务器
1 生产服务器 :
主机名:DataServer-IP08
CentOS 8.4
IP: 192.168.250.8
rsync-3.1.3-12.el8.src.rpm

2 备份服务器 :
主机名: BackupServer-IP18
CentOS 8.4
IP: 192.168.250.18
rsync-3.1.3-12.el8.src.rpm

2. 服务器环境准备及实现手工命令行同步

基本任务及过程:在生产服务器上准备好WWW目录(实际生产中这个WWW目录可以是存放网站的目录或者重要的数据文件等),并在这个目录内组织一批用于测试的文件和目录;再在备份服务器上准备好备份目录,并通过手工输入 rsync -av 命令方式,实现生产服务器上的/data/www目录和备份服务器/data/www-backup的数据同步。

2.1 配置生产服务器

# 服务器关闭防火墙和SELinux、时间同步、服务器改名
[root@CentOS84 ]#hostnamectl set-hostname DataServer-IP08
[root@CentOS84 ]#exit
[root@DataServer-IP08 ]#systemctl enable --now chronyd.service


# 准备www目录及目录下的文件,便于后面的同步演示
[root@DataServer-IP08 ]#ll /data/
total 0
[root@DataServer-IP08 ]#mkdir /data/www
[root@DataServer-IP08 ]#cp /etc/fstab /data/www/IP08-data-www-DIR-f1.txt
[root@DataServer-IP08 ]#cp /etc/fstab /data/www/IP08-data-www-DIR-f2.txt
[root@DataServer-IP08 ]#cp /etc/fstab /data/www/IP08-data-www-DIR-f3.txt
[root@DataServer-IP08 ]#mkdir /data/www/test-DIR1
[root@DataServer-IP08 ]#mkdir /data/www/test-DIR2
[root@DataServer-IP08 ]#mkdir /data/www/test-DIR3
[root@DataServer-IP08 ]#cp /etc/passwd /data/www/IP08-data-www-DIR-f4.txt
[root@DataServer-IP08 ]#cp /etc/passwd /data/www/IP08-data-www-DIR-f5.txt
[root@DataServer-IP08 ]#cp /etc/passwd /data/www/IP08-data-www-DIR-f6.txt
[root@DataServer-IP08 ]#tree /data/
/data/
└── www
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 6 files

2.2 配置备份服务器

# 服务器关闭防火墙和SELinux、时间同步、服务器改名
[root@CentOS84 ]#hostnamectl set-hostname BackupServer-IP18
[root@CentOS84 ]#exit
logout
[root@BackupServer-IP18 ]#systemctl enable --now chronyd.service

# 查看并创建备份目录
[root@BackupServer-IP18 ]#ll /data/
total 0
[root@BackupServer-IP18 ]#mkdir /data/www-backup
[root@BackupServer-IP18 ]#ll /data/
total 0
drwxr-xr-x 2 root root 6 Mar 20 09:04 www-backup

# 手工输入同步复制命令
[root@BackupServer-IP18 ]#rsync -av 192.168.250.8:/data/www/ /data/www-backup
The authenticity of host '192.168.250.8 (192.168.250.8)' can't be established.
ECDSA key fingerprint is SHA256:WGibMK0eLfGqzsaTJEHUwYyD+RwjH6hlC0ZBURwn7ns.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.250.8' (ECDSA) to the list of known hosts.
root@192.168.250.8's password: #输入生产服务器的密码
receiving incremental file list
created directory /data/www-backup
./
IP08-data-www-DIR-f1.txt
IP08-data-www-DIR-f2.txt
IP08-data-www-DIR-f3.txt
IP08-data-www-DIR-f4.txt
IP08-data-www-DIR-f5.txt
IP08-data-www-DIR-f6.txt
test-DIR1/
test-DIR2/
test-DIR3/

sent 157 bytes received 10,478 bytes 545.38 bytes/sec
total size is 9,918 speedup is 0.93

# 验证复制的数据
[root@BackupServer-IP18 ]#tree /data/
/data/
└── www-backup
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3


4 directories, 6 files
[root@BackupServer-IP18 ]#
# 至此完成了手工复制

3. 生产及备份服务器之间实现免密同步

基本任务和过程:在备份服务器上完成基于key的ssh连接生产服务器的免密认证;测试免密认证成功,并再次手工输入 rsync -av 命令同步命令(不再交互输入密码)测试数据同步成功。

## 在备份服务器上完成基于key的ssh连接生产服务器的免密认证;
# 生成基于key的密钥
[root@BackupServer-IP18 ]#ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FcC/ojy5nWxvCj08Knix84pDQ8e2E8STFMHIg27exYY root@BackupServer-IP18
The key's randomart image is:
+---[RSA 3072]----+
| o =++ .... |
|. + * . . |
|. +o. .. |
| o.E=+ .. |
|o..ooo S . |
| .o.+ o. . |
| . o =.o=. |
| o.= ==.+. |
| .o.=++=+. |
+----[SHA256]-----+
# 拷贝密码证书到生成服务器
[root@BackupServer-IP18 ]#ssh-copy-id 192.168.250.8
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.250.8's password: # 输入生产服务器的密码

Number of key(s) added: 1

Now try logging into the machine, with: "ssh '192.168.250.8'"
and check to make sure that only the key(s) you wanted were added.

# 测试ssh免密登录生产服务器
[root@BackupServer-IP18 ]#ssh 192.168.250.8
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sun Mar 20 16:33:50 2022 from 192.168.250.254
[root@DataServer-IP08 ]#
# 显示免密登录成功

## 在生成服务器的www目录生成一个大文件,再在备份服务器上输入同步复制命令,验证同步效果
# 生成大文件
[root@DataServer-IP08 ]#dd if=/dev/zero of=/data/www/bigfile bs=1M count=111
111+0 records in
111+0 records out
116391936 bytes (116 MB, 111 MiB) copied, 0.186134 s, 625 MB/s

# 查看目录结构
[root@DataServer-IP08 ]#tree /data/
/data/
└── www
├── bigfile
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 7 files

# 在备份服务器上键入同步命令,不需要再人工交互输入密码等动作,自动完成数据同步,并查看同步数据信息
[root@BackupServer-IP18 ]#rsync -av 192.168.250.8:/data/www/ /data/www-backup
receiving incremental file list

sent 23 bytes received 286 bytes 618.00 bytes/sec
total size is 9,918 speedup is 32.10
[root@BackupServer-IP18 ]#tree /data/
/data/
└── www-backup
├── bigfile
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 7 files
[root@BackupServer-IP18 ]

# 至此在生产和备份服务器之间实现了免密数据同步功能。

4. 利用crontab实现生产及备份服务器之间定时数据自动同步

基本任务及过程:在备份服务器上 crontab -e 定义一条定时任务;再在生产服务器上创建几个大文件,测试数据同步效果。

4.1 目的文件夹不删除源文件已经删除的文件

# 定义条每隔一分钟同步数据一次的定时任务;下面这个命令实现的效果是生产服务器上数据删除不会在备份服务器上删除掉,这个在实际生产上用的比较多。 &> /dev/null 是将输出信息丢弃
[root@BackupServer-IP18 ]#crontab -e
* * * * * rsync -av 192.168.250.8:/data/www/ /data/www-backup &> /dev/null
[root@BackupServer-IP18 ]#crontab -l
* * * * * rsync -av 192.168.250.8:/data/www/ /data/www-backup &> /dev/null

# 在生产服务器上生成两个大文件bigfile和bigfile2
[root@DataServer-IP08 ]#dd if=/dev/zero of=/data/www/bigfile bs=1M count=111
111+0 records in
111+0 records out
116391936 bytes (116 MB, 111 MiB) copied, 0.186134 s, 625 MB/s
[root@DataServer-IP08 ]#dd if=/dev/zero of=/data/www/bigfile2 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.201719 s, 520 MB/s
[root@DataServer-IP08 ]#tree /data/
/data/
└── www
├── bigfile
├── bigfile2
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 8 files

# 等待一分钟后在备份服务器上看同步情况
[root@BackupServer-IP18 ]#tree /data/
/data/
└── www-backup
├── bigfile
├── bigfile2
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 8 files

4.2 源和目的文件夹完全同步

# 定义条每隔一分钟同步数据一次的定时任务;下面这个命令实现的效果是生产服务器上数据删除也会在备份服务器上同时删除掉,实现源和目的备份的目录文件完全一致。
[root@BackupServer-IP18 ]#crontab -e
* * * * * rsync -av --delete 192.168.250.8:/data/www/ /data/www-backup &> /dev/null
[root@BackupServer-IP18 ]#crontab -l
* * * * * rsync -av --delete 192.168.250.8:/data/www/ /data/www-backup &> /dev/null

# 在生产服务器上生成两个大文件bigfile2和bigfile3,删除bigfile
[root@DataServer-IP08 ]#dd if=/dev/zero of=/data/www/bigfile3 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.148424 s, 706 MB/s
[root@DataServer-IP08 ]#rm -rf /data/www/bigfile
[root@DataServer-IP08 ]#tree /data/
/data/
└── www
├── bigfile2
├── bigfile3
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 8 files

# 等待一分钟后在备份服务器上看同步情况
[root@BackupServer-IP18 ]#tree /data/
/data/
└── www-backup
├── bigfile2
├── bigfile3
├── IP08-data-www-DIR-f1.txt
├── IP08-data-www-DIR-f2.txt
├── IP08-data-www-DIR-f3.txt
├── IP08-data-www-DIR-f4.txt
├── IP08-data-www-DIR-f5.txt
├── IP08-data-www-DIR-f6.txt
├── test-DIR1
├── test-DIR2
└── test-DIR3

4 directories, 8 files

至此整个文件夹的定时同步全部完成,这个实验过程可以被用户中小企业的内部Linux的数据备份,当然时间间隔建议定义成一天一次。