Linux服务器和客户端之间的数据同步(备份)

最近实验室总是停电,电脑今天系统出现了点问题,所以需要对数据进行备份,以防硬盘发生突然损坏。目前用到的方法是通过rysnc和inotify协同数据同步,数据可以实时更新。另外,对于经常改变且比较大的数据,实时更新不是那么可能,所以可以通过Linux操作系统自带的crond服务,定时让系统自动更新数据。通过这两种方法可以达到同步数据的目的。下面详细介绍具体操作。

具体的结构如下图,我们就是想将存储服务器的文件推送到rsync服务器上:

Linux服务器和客户端之间的数据同步(备份)_第1张图片

 

系统环境说明
主机 IP 操作系统
Smaba 10.1.2.102 Centos 7.1
Backup 10.1.2.104 Centos 7.1

其中 Smaba 服务器为共享文件服务器,其中 Backup 为备份服务器。本次目地:监控 Smaba 服务器下的 /data 目录下文件的实时变化,并实时备份至 Backup 服务器的 /data/SambaBackup 目录。

1、使用 inotifywait 工具监控文件变化情况,使用 rsync 工具做同步

介绍

Rsync(remote synchronize)是一个远程文件同步工具;Rsync使用“Rsync算法”来同步文件,该算法只传送两个文件的不同部分,因此速度相当快;Rsync是替代rcp的一个工具,目前由rsync.samba.org维护,因而rsync.conf文件的格式类似于samba的主配置文件;Rsync可通过rsh或ssh使用,也能以daemon模式运行,以daemon方式运行时,Rsync Server会打开一个873端口等待客户端连接.连接时,Rsync Server会检查口令是否相符,若口令相符,则进行文件传输.第一次会把整份文件传输一次,以后则为增量传输。

 Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。是一个非常好的辅助性工具软件,后期本博客还会有更加多与inotify嵌合的功能发布!

安装

以下在 Backup 机器上操作安装配置。这里我先配置备份服务器,方便后续说明。

分别在服务器端Backup安装rsync,在客户端Smaba安装rsync、inotify-tools,如下所示:

[root@Backup ~]# yum install -y rsync
[root@Samba~]#yum install inotify-tools

配置

1、在服务器端配置 rsync --daemon 模式运行,默认使用 /etc/rsyncd.conf 主配置文件:

[root@Backup ~]# cat /etc/rsyncd.conf
port = 873
uid = root   
gid = root
use chroot = no
max connections = 2
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
lock file = /var/run/rsyncd.lock
[SambaBackup]   ##模块名
path = /data/SambaBackup  ##文件复制的路径
read only = no
auth users = rsync  #这个名字不一定是用户名
# 虚拟账号配置文件,格式:username:password 
secrets file = /etc/rsyncd.secrets  #密码文件

上述密码文件配置

# 设置虚拟账密信息
[root@Backup ~]# echo "rsync:123456" > /etc/rsyncd.secrets
# 权限务必设为 600 权限
[root@Backup ~]# chmod -R 600 /etc/rsyncd.secrets
# 创建模块目录
[root@Backup ~]# mkdir -p /data/SambaBackup
# 启动
[root@Backup ~]# rsync --daemon

详细安装参见:https://www.jianshu.com/p/0df0633613d8

2、客户端配置

客户端的配置文件只需做简单的修改,设置log file和pid file路径即可,然后启动rsync即可。

[root@Samba ~]# cat /etc/rsyncd.conf 
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# 配置密码文件及密码
[root@Samba ~]# echo '123456' > /etc/rsyncd.secrets
[root@Samba ~]# chmod -R 600 /etc/rsyncd.secrets ##这里的密码是上面服务器中创建的密码文件中的密码
# 启动
[root@Samba ~]# rsync --daemon

3、创建监控脚本--inotifywait.sh

#!/bin/bash
# 配置监控目录
path='/data/'
/usr/bin/inotifywait --exclude '\.(part|swp|swx)' -mrq --format '%T %e : %w%f' --timefmt '%Y-%m-%d %H:%M:%S' -e create,delete,move,close_write ${path} | while read file;
do
    # 执行同步
    # /usr/bin/rsync -auvrtzopgP --delete ${path} [email protected]:/data/SamabaBackup/
    # 使用 rsync 的守护模式同步
    /usr/bin/rsync -vazu --delete --password-file=/etc/rsyncd.secrets /data [email protected]::SambaBackup
 ##这里的密码文件直接写入上述服务器端配置的密码文件的密码即可
done

做以下说明:
#同步文件夹到远程
$ rsync -avI dir_name remote_ip:dir_name
#同步文件夹到远程,传输时进行压缩
$ rsync -avzI dir_name remote_ip:dir_name
#同步文件夹到远程(保持严格同步,即本地删除,远程也同步删除)
$ rsync -avzI –-delete dir_name remote_ip:dir_name
#排除指定的文件或目录,可多次使用,支持通配符(比如.svn、.git等目录)
$ rsync -avzI --exclude=/a/b/*.svn --exclude=/a/b/*.git dir_name remote_ip:dir_name
#当排除的文件较多时,可将文件写到某文件中,同时使用 --exclude-from 指定该文件即可。
$ rsync -avzI --exclude-from=/a/exclude_file_list.txt dir_name remote_ip:dir_name
以上使用的选项说明如下:
-a, --archive 归档模式,等于-rlptgoD;
-r, --recursive 递归模式;
-l 保持符号连接;
-p 保持文件原有权限;
-t 保持文件原有修改时间;
-g 保持文件原有用户组;
-o 保持文件原有属主;
-D -devices -specials,保持块设备文件和特殊文件;
-I 强制扫描,放弃“quick check”策略(quick check策略,通过查看文件的时间戳和文件大小,先排除一批认为相同的文件[rsync不会对文件夹本身做“quick check”]);
-z, --compress 压缩,默认的压缩算法和gzip一样;
-v, --verbose 显示进度详细信息;
-q, --quiet 精简输出模式;
-R, --relative 保持全路径;
--progress  显示传输进度(百分百);
--delete 本地删除某一文件,远程也同步的删除该文件,保持严格的一致(不加该参数,则表示只增不减);
--exclude="*.tmp" 排除某些文件;
--exclude-from=FILE 排除FILE中指定模式的文件;
--port=PORT 指定其他的rsync服务端口;

注意:

就路径格式而言,如果源路径末尾使用/,则rsync会将源路径尾端目录中的所有内容复制到目的端;如果没有使用/,rsync会将源路径尾端目录本身复制到目的端。
$ rsync -av /home/test/ /home/backup; #将test目录中的内容备份;
$ rsync -av /home/test /home/backup; #将test目录本身备份;
如果目的路径末尾使用/,则rsync会将来自源端的内容复制到目的端的目录中;如果没有使用/,则rsync会在目的端路径尾部创建一个和目的端尾部目录同名的目录,并将源端内容复制到该目录中。
$ rsync -av /home/test /home/backup/; #将源端内容复制到backup目录中;
$ rsync -av /home/test /home/backup; #在/home/backup创建下级目录backup,并将源端内容复制到/home/backup/backup目录中;

上述操作完成后就可以实时同步了。

最后运行以下命令

# 不挂断的放后台运行
nohup sh /root/inotifywait.sh > /dev/null 2>&1 &

2、使用 crontab 配合rsync定时同步

介绍

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond status //查看服务当前状态
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:

在/etc/rc.d/rc.local这个脚本的末尾加上:/sbin/service crond start

现在cron这个服务已经在进程里面了,我们就可以用这个服务了.

同时cron服务提供以下几种接口供大家使用:

1.直接用crontab命令编辑

cron服务提供crontab命令来设定cron服务,以下是这个命令的一些参数与说明:

$> crontab -u zhangsan -l

$> crontab -u zhangsan -e

$> crontab -u zhangsan -r

-u //指定用户,一般root用户在执行这个命令的时候需要此参数(如省略,则默认为当前登录用户)

-l //列出cron服务

-r //删除cron服务

-e //编辑cron服务

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件不可以直接编辑,只可用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

2.编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/      //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

以上cron命令格式为:* * * * * [root run-parts] command

前面五个*号代表时间,用数字,数字的取值范围和含义如下:

第一个*:分钟 (0-59)[整数]

第二个*:小時(0-23)[整数]

第三个*:日期(1-31)[整数(必须是指定月份的有效日期)]

第四个*:月份(1-12)[整数(或如Jan或Feb简写的月份)]

第五个*:星期(0-7)[0或7用来描述周日(或用Sun或Mon简写来表示)]

command:需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)

root:以root用户身份来执行

run-parts:表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本

注意"run-parts"这个参数,如果去掉这个参数,后面就可以写要运行的某个脚本名,而不是文件夹名。

以下举几个例子说明问题:

0 6 * * * echo "Good morning." >> /tmp/test.txt   #每天早上6点
0 */2 * * * echo "Have a break now." >> /tmp/test.txt  #每两个小时
0 11 4 * 1-3 command line  #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 1 * command line  #1月1日早上4点

如果一个cron任务需要定期而不是按小时,天,周,月来执行,则需要添加/etc/cron.d目录。这个目录下的所有文件和文件/etc/crontab语法相同。cron服务会每分钟检查一次/etc/crontab、/etc/cron.d/、/var/spool/cron/下的变更。如果发现变化,就会下载到存储器中。因此,即使 crontab文件改变了,程序也不需要重新启动。推荐自定义的任务使用crontab -e命令添加,退出后用/etc/init.d/crond restart命令重启crond进程,官方文件说不用重启进程,但我遇到不重启无法运行任务的情况。

3、具体使用

1、添加定时任务

$> crontab -e

*/10 * * * * sh /opt/app/tomcat/test/monitorbamboo.sh

2、重启 crond 服务

$> service crond restart

如此,ok 了。

对于rsync的配置都是服务器和客户端的模式,与第一种方法的配置是完全相同的,只是在上述第一步中将rsync的同步命令加入到定时任务表中即可,这样就可以让系统自动定时备份了。

常见问题可参见:

https://blog.csdn.net/l821133235/article/details/79568167

https://www.cnblogs.com/fawaikuangtu123/p/8185312.html

https://www.cnblogs.com/wang-xd/p/6551402.html

http://blog.sina.com.cn/s/blog_4ac726fe0102xy47.html

参考文献

https://www.linuxidc.com/Linux/2017-12/149355.htm

https://linux.cn/article-6032-1.html

https://www.chenghuajie.cn/1302.html (强烈推荐)

https://www.cnblogs.com/hackerer/p/5243639.html

https://www.jianshu.com/p/f387b45f0f1d

https://blog.csdn.net/wangjunjun2008/article/details/38755959

https://blog.csdn.net/wangjunjun2008/article/details/38658539

https://blog.csdn.net/wangjunjun2008/article/details/19497803

http://ju.outofmemory.cn/entry/327439

https://yq.aliyun.com/articles/372019

http://blog.chinaunix.net/uid-29099879-id-5818553.html

你可能感兴趣的:(编程,系统,linux操作系统,计算机及操作系统)