Centos6.5部署Rsyslog+cron+rsync备份服务器
1、前言
rsync是一种快速且功能非常广泛的文件复制工具。它可以在本地复制,通过任何远程shell复制到/从另一个主机复制,也可以复制到/从远程rsync守护进程。它提供了大量的选项,可以控制其行为的各个方面,并允许非常灵活地指定文件集进行复制。它以其增量传输算法而闻名,它减少了通过网络发送的数据量。rsync仅发送源文件与目的地中现有文件之间的差异。rsync广泛用于备份和镜像,并作为改进的复制命令用于日常使用。
rsync查找需要使用“快速检查”算法(默认情况下)传输的文件,该算法查找在大小或上次修改时间内更改的文件。在快速检查表明不需要更新该文件的数据时,直接对目标文件执行By选项。
rsync的一些附加功能是:
- 支持复制链接、设备、所有者、组以及权限
- 排除和排除类似于gnu tar的选项
- cvs排除模式可以忽略CVS将忽略的相同文件
- 可以使用任何透明的远程外壳包括ssh,或者rsh
- 不需要文件传输的超级用户特权
- 管路式的文件传输,以尽量减少延迟成本。
- 支持匿名或经过身份验证的rsync守护进程(非常适合镜像)。
生产中,任何一台服务都不允许存在单点,此处我们生产中选择rsync作为备份方式。提到rsync就不得不提到inotify和sersync(二者都是监控数据变化的工具)。不过本文主要使用到的是rsync。
2、rsync介绍
[rsync实现网站的备份,文件的同步,不同系统的文件的同步,如果是windows的话,需要windows版本cwrsync]
优点:增量备份同步,支持socket(daemon),集中备份
缺点:大量小文件同步时比对时间较长,有时进程会停止。
解决:打包同步;使用DRBD(使用block方式同步文件系统)
同步大文件有时也会有问题,有时也会中断,未完整同步前是隐藏文件,同步完成后为正常文件
说明:
Linux 文件双向实时同步有很多种解决办法:现介绍两种
rsync + inotify
rsync + sersync
2.1、Linux下rsync+sersync(或inotify)实现数据实时同步
一、为什么要用Rsync+sersync架构?
1、sersync是基于Inotify开发的,类似于Inotify-tools的工具
2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。
二、Rsync+Inotify-tools与Rsync+sersync这两种架构的区别
1、Rsync+Inotify-tools【只知道变化,不知道是谁变了】
(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2):rsync在同步的时候,根据inotify给出的结果,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
2、Rsync+sersync【既知道变化又知道谁变了】
(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2):rsync在同步的时候,根据sersync给出的结果,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
2.2、rsync的多种工作模式
rsync 客户端
第一种模式:local
# rsync -avz /etc/hosts /tmp =====cp # rsync -avz --delete /null/ /tmp====rm (保持一致)
这次我们引入一个--delete 选项,表示客户端上的数据要与服务器端完全一致,如果 linuxsirhome目录中有服务器上不存在的文件,则删除。最终目的是让linuxsirhome目录上的数据完全与服务器上保持一致;
第二种模式:remote shell(远程的shell) 【-e 指定通道】
push: [root@server tmp]# rsync -avzP -e 'ssh -p 52113' /tmp/ root@192.168.233.135:/tmp/
(tmp后有/的话就不包含tmp本目录,要是没有的话,就连同tmp一起推过去。下同) pull:[root@server tmp]# rsync -avzP -e 'ssh -p 52113' root@192.168.233.135:/tmp/ /tmp/
第三种模式:daemon模式(类似起一种服务)
本文采用此种模式。
2.3、rsync客户端命令常用参数
man rsync
https://www.samba.org/ftp/rsync/rsync.html
3、用rsync-daemon模式备份rsyslog日志文件
环境:centos6.5
3.1、服务端
编辑配置文件
[root@pstation ~]# touch /etc/rsyncd.conf
[root@pstation ~]# vim /etc/rsyncd.conf
#Rsync Server #created by zhang 2016-09-30 ##rsyncd.conf start## uid = rsync#联系nfs的nfsnobody gid = rsync user chroot = no max connections = 2000 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors #忽略错误 read only = false #不只读 list = false #不能看服务端有啥 hosts allow = 192.168.233.0/24 hosts deny = 0.0.0.0/32 #不拒绝任何 auth users = rsync_backup #一个虚拟的用户 secrets file = /etc/rsync.password #存放账户密码的文件 ############################## [backup] #模块1 comment = backup server by zhang 14:18 2012-1-13#注释 path = /backup #Rsync 建立多目录模块的方法 ##只要把服务端配置文件里目录和路径复制出来增加在这里就可以了(记得新建的目录要chown rsync.rsync授权一下),如果还要达到不同目录对应不同密码就要写在模块里,因为写在模块前的password文件的为全局密码 [backup-1] #模块2 comment = backup server by zhang 14:18 2012-1-13#注释 path = /backup-1
创建rsync用户,建立共享目录/backup
[root@pstation ~]# useradd rsync -s /sbin/nologin -M [root@pstation ~]# id rsync uid=501(rsync) gid=501(rsync) groups=501(rsync) [root@pstation ~]# mkdir /backup [root@pstation ~]# chown -R rsync /backup
创建密码文件,并更改权限
[root@pstation ~]# echo "rsync_backup:zhang">/etc/rsync.password [root@pstation ~]# cat /etc/rsync rsync.password rsyncd.conf [root@pstation ~]# cat /etc/rsync.password rsync_backup:@dmin.coM890 [root@pstation ~]# chmod 600 /etc/rsync.password [root@pstation ~]#
启动
[root@pstation ~]# rsync --daemon [root@pstation ~]# netstat -lntup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 22243/rsync tcp 0 0 :::873 :::* LISTEN 22243/rsync
加入开机自启
[root@pstation ~]# echo "rsync --daemon">>/etc/rc.local [root@pstation ~]# cat /etc/rc.local
至此,服务端rsync配好。
记得打开防火墙
# vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
3.2、客户端
共2个动作
a、创建密码文件
echo "zhang">/etc/rsync.password
chmod 600 /etc/rsync.password
b、发送文件去备份
push : rsync –avz /tmp/ rsync_backup@192.168.233.138::backup --password-file=/etc/rsync.password
注:backup对应服务端配置文件中的模块 [backup],加密码文件是说你服务器要是要密码就来我这个密码文件来读
3.3、问题解决
关于这个auth失败的问题,有以下可能的情况:
1、密码输入错误:
请再次确认你登录用户的密码无误
2、secrets file格式错误:
secrets file的文件格式是 upload:123456
表示upload用户的rsync密码是123456
3、配置文件写错:
最坑爹的一个,看看自己模块配置下面的auth users、secrets file有没写错
4、secrets file权限问题
服务端的secrets file权限必须是600,
可以使用chmod 600 /home/user/test/rsync/etc/test.pass
5、secrets file文件拥有者与rsync运行者
服务端rsync服务是以什么用户运行,则必须保证secrets file文件拥有者必须是同一个
假设root运行rsync --daemon,则secrets file的owner也必须是root
6、如果是以--password-file=file的方式附带密码
确保客户端密码文件格式无误,与服务端的密码文件不同,
客户端的不用加上用户名,即直接是 123456
7、可以尝试使用本地存在的用户名作为auth users
这个是在网上看到的,没实践过,不过如果都没办法,可尝试一下,
密码不要跟本地用户的系统密码一样就行了。
-----------------------------
最后如果还搞不清是什么问题,可以尝试从下面的思路去摸索:
1、在rsync模块的配置文件里,把strict modes设置为no,禁用文件mode检验
2、ssh、telnet登录rsync服务端,查看服务器端的rsync日志,这个通常会比客户端的信息多
3.4、结合rsync和定时任务实现数据定时备份
[root@log log]# tar -zcf province_$(date +%F).tar.gz province/*
[root@log log]# ll
[root@log log]# cp *_$(date +%F).tar.gz /backup/
[root@log backup]# ll
total 1040
-rw-r--r--. 1 root root 323650 May 8 13:04 province_2018-05-08.tar.gz
[root@log backup]# rsync -avz /backup/ rsync_backup@10.225.11.206::backup --password-file=/etc/rsync.password
[root@pstation backup]# ll
total 1040
-rw-r--r--. 1 rsync rsync 323650 May 8 13:04 province_2018-05-08.tar.gz
3.5、脚本
先备份
#!/bin/sh
Path="/var/log"
tar -zcf $Path/province_$(date +%F).tar.gz $Path/province/*
cp $Path/*_$(date +%F).tar.gz /backup/
rsync -avz /backup/ rsync_backup@192.168.233.206::backup --password-file=/etc/rsync.password
客户端保存7天
#del tar&backup file find /backup -type f -name "*.tar.gz" -mtime 7|xargs rm -f find $Path/ -type f -name "*.tar.gz" -mtime 1|xargs rm -f #del source file find $Path/province/ -type f -name "SDXS-HXJF*" -mtime 1|xargs rm -f
大家在使用find命令中的mtime参数时候,会看到官方的解释如下:
-mtime n File's data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times.
但是在各种参考的使用方式中有用+号,-号,不带符号的用法,那么这里又有什么区别呢?
注意这里的n,如果n为带有+号的值,意思为删除n天前所有的文件。
比如n=+1且今天是15号,那么删除14号以前的数据,不包括14号,如果是负号(n=-1)则为删除一天内的文件
比如今天15号,那么删除15号的数据,如果是(n=-2)则代表删除一天前到今天的所有数据,比如今天15号,那么从14号开始删除。
如果不带有符号,那么则删除指定前n天中这一天的数据
比如(n=1)且今天是15号,则删除14号这一天所有数据。
注意这里的一天是指当前系统时间算起的,也就是说这里的一天其实就是24小时。
如:
[root@pstation province]# ll total 1008 -rw-------. 1 root root 3520 May 9 15:14 HXJF-NE40EX8-01_log.2018-05-09 -rw-------. 1 root root 893147 May 8 16:54 HXJF-NE40EX8-02_log.2018-05-08 [root@pstation province]# date Wed May 9 16:54:29 CST 2018 [root@pstation province]# find . -type f -name "HXJF*" -mtime 1|xargs rm -f [root@pstation province]# ll total 132 -rw-------. 1 root root 3520 May 9 15:14 HXJF-NE40EX8-01_log.2018-05-09
服务端保存6个月
[root@pstation scripts]# cat delte_log.sh #!/bin/sh /bin/find /backup -type f -name "*.tar.gz" -mtime 180|xargs rm -f
3.6、定时任务
客户端
每天零点备份,两点删除前一天的。
[root@log scripts]# crontab -l */10 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1 00 00 * * * /bin/sh /server/scripts/beifen.sh &>/dev/null 00 2 * * * /bin/sh /server/scripts/delte_log.sh &>/dev/null
服务端
[root@pstation backup]# crontab -l #*/10 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1 00 00 * * * /bin/sh /server/scripts/del.sh &>/dev/null