定时任务和数据同步备份

1 定时任务

1.1 linux定时任务调度分为两种

1、系统自动执行的任务工作

2、用户执行的任务工作

crontab  适合周期性的执行任务

at 适合仅执行一次就结束的任务调度命令  对应的服务是atd,一般没用,关闭

[root@localhost logrotate.d]# chkconfig --list atd

atd             0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

anacron    以天为周期或者在系统每次开机后执行的任务工作,没什么用

1.2 linux定时任务crond服务

[root@localhost ~]# chkconfig --list crond

crond           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

PScrond服务是运行的程序,crontab命令用来管理crond服务的。crond是非常重要的

crond  守护进程  一直运行着

crontab  设置命令 -l  list  -e  edit编辑

crontab -e ==vi /var/spool/cron/root<=======crond对应的配置文件

crontab -l ==cat /var/spool/cron/root

1.3 crond的配置参数详解

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name command to be executed

定时任务中*所对应的时间参数  如上图所示

*              *  19  *  *  *          每天19

- 范围 17-19     *  17-19  *  *  *       每天1719

, 分隔时段       *  17,18,19  *  *  *    每天171819

/n 每单位时间,n数字  */10 *  *  *  *    10分钟

例如:30 3,12 * * * /bin/sh /scripts/test.sh  每天上午3点半和中午12点半执行此脚本任务

      30 */6 * * * /bin/sh /scripts/test.sh   每隔6个小时的半点时刻

      30 8-18/2 * * * /bin/sh /scripts/test.sh 每天8点到18点之间每隔2个小时的半点时刻

强调:周和日尽量不要同时用,否则可能达不到想要的结果

案例:

编写一个定时任务追加字符到指定文件

* * * * * echo "wangxian">>/server/log/wangxian.txt
[root@localhost ~]# mkdir -p /server/log/
[root@localhost ~]# echo "wangxian">>/server/log/wangxian.txt
[root@localhost ~]# tail -f /server/log/wangxian.txt
wangxian
wangxian
wangxian

1.4 定时任务总结

解答小结:

1、定时任务要加注释

2、结尾不要有>/dev/null 2>&1    只针对上题

3/server/log/必须存在

4、定时任务中的路径一定要绝对路径

5crond服务必须开启

6、脚本习惯   /bin/sh  /server/scripts/test.sh  习惯用/bin/sh  不用考虑脚本文件的执行权限

7、生产任务程序不要随意打印输出信息

8、定时任务执行的脚本要规范路径,配置定时任务要规范操作过程,防止出错。

     1)首先在命令行测试,然后复制到脚本 

     2)然后测试脚本,成功后复制脚本的规范路径到定时任务配置里

     3)先在测试环境下测试,然后正式环境部署

9、生产环境的脚本结尾要考虑加>/dev/null 2>&1 因为脚本执行会发邮件到临时邮件目录增加小文件导致inode被占用

/var/spool/postfix/maildrop/   C6邮件临时目录

10、定时任务命令或程序最好写到脚本里执行

定时任务打包总结:

1、到目标内容的上级目录打包

2、打包的频率是分钟,包名必须精确到分

3、确保命令行执行正确,然后写到脚本(复制)

4、定时任务命令或程序最好写到脚本里执行

5、测试脚本正确性(定时任务怎么写,命令行就怎么测试)

6、脚本测试好了,命令行的命令也要复制

7、定时任务,不要在屏幕输出,可以打印到一个日志文件里

例:*/2 * * * * /bin/sh /server/scripts/test1.sh >/tmp/test1.log 2>&1

通过crond定时任务服务日志调试定时任务(/var/log/cron

tail -f /var/log/cron

1.5 定时任务生产应用问题

1、环境变量的问题

2、定时任务要用绝对路径

3、脚本权限问题加/bin/sh

4、时间变量问题用反斜线\转义,最好用脚本(不需要转义)

5>/dev/null 2>&1问题

6、定时任务规则之前加注释

7、避免不必要的程序及命令输出

8、使用脚本程序代替命令行做定时任务

9、切换到目标目录的上一级打包目标

2 数据同步备份(rsync+inotify

2.1 rsync简介

Rsync全称为remote synchronization,具有使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,它可以增量拷贝。利用Rsync还可以实现删除文件和目录的功能,总之,一个rsync相当于scpcprm,但是还优于他们每一个命令。

Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。

2.2 rsync常用参数说明

-v--verbose 详细模式输出,传输时的进度等信息

-z--compress 传输时进行压缩以提高传输效率

--compress-level=NUM 可按级别压缩

-a--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,

-a = -rtopgD1

  -r--recursive 对子目录以递归模式传输

  -t--times    保持文件时间信息

  -o--owner   保持文件属主信息

  -p--perms   保持文件权限

  -g--group    保持文件属组信息

  -P--progress  显示同步的过程及传输时的进度等信息

  -D--devices  保持设备文件信息

   -l--links    保留软链接

2.3 rsync工作模式

第一种工作模式:本地 local

rsync -avz /etc/hosts /tmp<======cp

rsync -avz --delete /null/ /tmp/ <======rm

第二种工作模式:remote  shell

pull   远端==》本地   rsync -avzP -e 'ssh -p 22' [email protected]:/opt/ /tmp/

push   本地==》远端   rsync -avzP -e 'ssh -p 22' /tmp/ [email protected]:/opt/

参数说明

1-avz,表示同步时文件和目录属性不变

2-P    显示同步的过程,可以用--progress替换

3-e 'ssh -p 22'  表示通过ssh的通道传输数据,-p 22可以省略

4 [email protected]:/opt/  远程主机用户地址路径

5/tmp/ 本地目录

第三种工作模式:daemon

启动服务

rsync --daemon

检查服务启动情况  873端口

[

root@backup ~]# ps -ef|grep rsync
root       1845      1  0 22:00 ?        00:00:00 rsync --daemon
root       1852   1815  0 22:00 pts/0    00:00:00 grep rsync
[root@backup ~]# netstat -lntup|grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      1845/rsync         
tcp        0      0 :::873                      :::*                        LISTEN      1845/rsync         
[root@backup ~]# ss -lntup|grep rsync      
tcp    LISTEN     0      5                     :::873                  :::*      users:(("rsync",1845,5))
tcp    LISTEN     0      5                      *:873                   *:*      users:(("rsync",1845,3))
[root@backup ~]# lsof -i :873
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   1845 root    3u  IPv4  12538      0t0  TCP *:rsync (LISTEN)
rsync   1845 root    5u  IPv6  12539      0t0  TCP *:rsync (LISTEN)

增加傀儡用户,改变权限

[root@backup ~]# useradd rsync -s /sbin/nologin
[root@backup ~]# id rsync
uid=505(rsync) gid=505(rsync) 组=505(rsync)
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync /backup/
[root@backup ~]# ls -ld /backup/
drwxr-xr-x 2 rsync root 4096 6月  10 22:06 /backup/

创建密码文件,并设置密码,修改密码文件的权限,让其他用户不可读

[root@backup ~]# echo "rsync_backup:wangxin" >/etc/rsync.password
[root@backup ~]# cat /etc/rsync.password
rsync_backup:wangxin
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# ll /etc/rsync.password
-rw------- 1 root root 20 6月  10 22:10 /etc/rsync.password

2.4 rsync配置步骤总结

Rsync server

1vi /etc/rsyncd.conf  加入一堆配置

2、创建rsync用户,及共享目录/backup

useradd rsync -s /sbin/nologin -M

3、创建密码文件

4rsync --daemon 启动服务

5echo "rsync --daemon" >>/etc/rc.local 加入开机启动

Rsync客户端

1、创建密码文件

echo "wangxin" >/etc/rsync.password  只需要密码

chmod 600 /etc/rsync.password

2push

rsync -avz /tmp/ [email protected]::backup --password-file=/etc/rsync.password

   pull

rsync -avz [email protected]::backup /tmp/ --password-file=/etc/rsync.password

::后面指的是模块[backup]

2.5指定rsync服务的监听地址

[

root@backup ~]# rsync --daemon --address=192.168.4.123
[root@backup ~]# netstat -lntup|grep rsync
tcp        0      0 192.168.4.123:873           0.0.0.0:*                   LISTEN

cat /var/log/rsyncd.log 看日志排错

2.6 rsync各项总结

rsync优点

1、增量备份同步,支持socketdaemon),集中备份

rsync缺点

1、大量小文件同步的时候,比对时间比较长,有的时候,rsync进程停止

解决:1)打包同步   2drbd(文件系统同步,复制block

2、同步大文件,10G以上的大文件有时也会有问题,中断。未完整同步前,是隐藏文件;同步完改名为正常文件

rsync无差异同步 

不建议使用,会造成本地或远端文件被删除

rsync -avz --delete [email protected]::backup /tmp/ --password-file=/etc/rsync.password

如果是推,本地有,远端就有;删除本地,远端消失;删除远端,本地无影响 

如果是拉,远端有,本地就有;删除远端,本地消失;删除本地,远端无影响

排除参数exclude

客户端排除参数

 --exclude=文件名   排除单个文件

               --exclude={a,b,c}  排除多个文件

服务端排除参数

/etc/rsyncd.conf里加--exclude=文件名

2.7 rsync排错思路

服务端:1.查看rsync服务配置文件路径是否正确,/etc/rsyncd.conf

2.查看配置文件里host allow,host deny,是否允许了客户端访问的IP网段

3.查看配置文件中path参数里的路径是否存在,权限是否正确

4.查看rsync服务是否启动ps –ef|grep rsync,端口是否存在netstat –lntup|grep 873

5.查看iptables防火墙和selinux是否开启允许rsync服务通过

6.查看服务端rsync配置的密码文件是否为600权限,密码文件格式是否正确

7.如果是推送数据,查看配置rsyncd.conf中用户是否对模块下目录有可读写权限

客户端:1.查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,注意:需要有密码,并且和服务端的密码一致

2.telnet连接rsync服务器ip地址873端口,查看服务是否启动

3.客户端执行命令时,命令细节记清楚,双冒号后面为模块名称

2.8 rsyncd.conf配置参数

[root@backup ~]# cat /etc/rsyncd.conf
#Rsync server
#created by wangxian 2017-06-10
##rsyncd.conf start##
uid = rsync
gid = rsync
use 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.4.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#########################################
[backup]
comment = backup server by wangxian 21:34 2017-06-10
path = /backup

2.9 inotify

inotify安装步骤

下载:

[root@nfs-server tools]#wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@nfs-server tools]# ls -l /proc/sys/fs/inotify/   查看当前系统是否支持inotify
总用量 0
-rw-r--r-- 1 root root 0 6月  11 13:22 max_queued_events
-rw-r--r-- 1 root root 0 6月  11 13:22 max_user_instances
-rw-r--r-- 1 root root 0 6月  11 13:22 max_user_watches

解压

[root@nfs-server tools]# tar zxf inotify-tools-3.14.tar.gz
root@nfs-server tools]# ls
inotify-tools-3.14  inotify-tools-3.14.tar.gz

开始安装

[root@nfs-server tools]# cd inotify-tools-3.14
[root@nfs-server inotify-tools-3.14]#./configure --prefix=/usr/local/inotify-tools-3.14

检查是否有错

[root@nfs-server inotify-tools-3.14]# echo $?     
0
[root@nfs-server inotify-tools-3.14]# make && make install

检查是否有错

[root@nfs-server inotify-tools-3.14]# echo $?            
0

做个软链接使命令更短,又可以保留他的版本号

[root@nfs-server inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify-tools
[root@nfs-server local]# cd /usr/local/inotify-tools
[root@nfs-server inotify-tools]# ll

总用量 16

drwxr-xr-x 2 root root 4096 6月  11 13:27 bin
drwxr-xr-x 3 root root 4096 6月  11 13:27 include
drwxr-xr-x 2 root root 4096 6月  11 13:27 lib
drwxr-xr-x 4 root root 4096 6月  11 13:27 share

inotifywaitinotifywatch

[root@nfs-server inotify-tools]# ll bin

总用量 88

-rwxr-xr-x 1 root root 44287 6  11 13:27 inotifywait  <=======重点

-rwxr-xr-x 1 root root 41409 6  11 13:27 inotifywatch <=======重点

inotifywait:监控目录变化的工具,执行后处于阻塞状态,适合在shell脚本中使用

inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计

inotifywait常用参数   inotifywait --help

-r recursive  递归查询目录

-q  quiet      打印的信息很少,仅仅打印监控事件的信息

-m  monitor    始终保持事件监听状态

-e  event      事件(删,增,改)

监控实例

[root@nfs-server inotify-tools]# /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,close_write,delete /data
14/06/17 22:25 /data/test.txt
14/06/17 22:25 /data/test.txt

限制inotify的三个参数

/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制

max_user_watches:    设置inotifywaitinotifywatch命令可以监视的文件数量(单进程)

max_user_instances:  设置每个用户可以运行的inotifywaitinotifywatch命令的进程数

max_queued_events:   设置inotify实例事件event队列可容纳的事件数量

echo "50000000" >/proc/sys/fs/inotify/max_user_watches

echo "50000000" >/proc/sys/fs/inotify/max_queued_events

inotify总结

inotify优点:

可以配合rsync实现实时数据同步

inotify缺点:

并发如果大于200-300个文件,同步就会有延迟。

监控到事件后,调用rsync同步是单进程的

运用inotify+rsync实现NFSbackup实时同步

/server/scripts/inotify_rsync.sh   编写实时同步脚本

/bin/sh /server/scripts/inotify_rsync.sh &   把脚本的命令放进rc.local

3 数据同步备份(sersync

3.1 sersync配置步骤详解

创建sersync目录结构

# mkdir /usr/local/sersync
# mkdir /usr/local/sersync/conf
# mkdir /usr/local/sersync/bin
# mkdir /usr/local/sersync/log
# tar zxvf sersync2.5_32bit_binary_stable_final.tar.gz
# cd GNU-Linux-x86/
# cp confxml.xml /usr/local/sersync/conf
# cp sersync2 /usr/local/sersync/bin


配置sersync

1.首先创建连接rsyncd的密码文件
# echo "123456" >/etc/rsync.pas
# chmod 600 /etc/rsync.pas
2.配置confxml.xml
# cd /usr/local/sersync/conf
# vi confxml.xml
按照注释进行修改
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
   # 设置本地IP和端口
   <host hostip="localhost" port="8008"></host>
   # 开启DUBUG模式  
   <debug start="false"/>
   # 开启xfs文件系统
   <fileSystem xfs="false"/>
   # 同步时忽略推送的文件(正则表达式),默认关闭
   <filter start="false">
       <exclude expression="(.*)\.svn"></exclude>
       <exclude expression="(.*)\.gz"></exclude>
       <exclude expression="^info/*"></exclude>
       <exclude expression="^static/*"></exclude>
   </filter>
   <inotify>
   # 设置要监控的事件
       <delete start="true"/>
       <createFolder start="true"/>
       <createFile start="true"/>
       <closeWrite start="true"/>
       <moveFrom start="true"/>
       <moveTo start="true"/>
       <attrib start="true"/>
       <modify start="true"/>
</inotify>
   <sersync>
   # 本地同步的目录路径
       <localpath watch="/data">
   # 远程IP和rsync模块名  
           <remote ip="192.168.100.29" name="data"/>  
           <!--<remote ip="192.168.8.39" name="tongbu"/>-->
           <!--<remote ip="192.168.8.40" name="tongbu"/>-->
       </localpath>
       <rsync>
   # rsync指令参数
           <commonParams params="-auvzP"/>
   # rsync同步认证
           <auth start="true" users="user" passwordfile="/etc/rsync.pas"/>
   # 设置rsync远程服务端口,远程非默认端口则需打开自定义
           <userDefinedPort start="false" port="874"/><!-- port=874 -->
   # 设置超时时间
           <timeout start="true" time="100"/><!-- timeout=100 -->
   # 设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书
           <ssh start="false"/>
       </rsync>
    # sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。
       <failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    # 设置rsync+crontab定时传输,默认关闭
       <crontab start="false" schedule="600"><!--600mins-->
           <crontabfilter start="false">
               <exclude expression="*.PHP"></exclude>
               <exclude expression="info/*"></exclude>
           </crontabfilter>
       </crontab>
   # 设置sersync传输后调用name指定的插件脚本,默认关闭
       <plugin start="false" name="command"/>
   </sersync>
   # 插件脚本范例
   <plugin name="command">
       <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
       <filter start="false">
           <include expression="(.*)\.php"/>
           <include expression="(.*)\.sh"/>
       </filter>
   </plugin>
   # 插件脚本范例
   <plugin name="socket">
       <localpath watch="/opt/tongbu">
           <deshost ip="192.168.138.20" port="8009"/>
       </localpath>
   </plugin>
   <plugin name="refreshCDN">
       <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
           <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
           <sendurl base="http://pic.xoyo.com/cms"/>
           <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
       </localpath>
   </plugin>
</head>
3.创建推送端sersync同步目录
# mkdir /data
4.设置环境变量:
# echo "export PATH=$PATH:/usr/local/sersync/bin/" >> /etc/profile
# source /etc/profile
5.启动sersync
# sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
注:重启操作如下:
# killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
6.设置开机启动
# echo "sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml" >> /etc/rc.local
验证:
(推送端)
# cd /data
# touch 1 2 3 4 5
# echo "test sersync" > 1
(接收端)
# cd /data
# ls
--------------------
1  2  3  4  5
--------------------
# cat 1
--------------------
test sersync
--------------------

注:如果接收端服务器本地创建或修改/data同步目录下的文件,当服务端进行目录同步时则不会对接收端服务器本地创建或修改的文件产生影响。

7. 添加脚本监控sersync是否正常运行

先创建/opt/check_sersync.sh文件
vi  /opt/check_sersync.sh  #编辑,添加以下代码
-----------------------------------代码开始-----------------------------------------------
#!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi

:wq!  #保存退出

chmod -R 777 /opt/check_sersync.sh #添加脚本执行权限

vi /etc/crontab #编辑,在最后添加下面一行

*/5 * * * * root /home/crontab/check_sersync.sh > /dev/null 2>&1  #每隔5分钟执行一次脚本

service crond reload  #重新加载服务


8.测试sersync实时触发rsync同步脚本是否正常运行
在源服务器增加文件,查看目标服务器是否同步

如果以上测试都通过,说明inotify实时触发rsync同步脚本运行正常

4 高并发数据实时同步方案小结

1inotify+rsync sersync  文件级别

2drbd  文件系统级别

3、第三方软件的同步功能:mysql同步。oraclemongodb

4、业务上,程序实现双写

5、业务逻辑解决


猜你喜欢

转载自blog.51cto.com/zaizheni/2325936