因公司近期业务要求需要搭建一套服务具体要求如下图:

   rsync+inotify实时备份加nfs挂载实战_第1张图片                          

1、基本备份要求

已知 3 台服务器主机名分别为A(web01)B(backup) C(nfs01)

要求 每天晚上 0 00 点整在 b Web 服务器 A A 打包 备份系统配置文件、网站程序目录及访

问日志并通过 c rsync 命令推送备份服务器 B B 上备份保留(备份思路可以是先在本地按日期

打包,然后再推到备份服务器 B B 上)。

具体要求如下:

1)Web 服务器 A 和备份服务器 B 的备份目录必须都为/backup

2)要备份的系统配置文件包括但不限于:

a.定时任务服务的配置文件(/var/spool/cron/root)

b.开机自启动的配置文件(/etc/rc.local)

c.日常脚本的目录(/server/scripts)

d.防火墙 iptables 的配置文件(/etc/sysconfig/iptables)

e. 自己思考下还有什么需 要备份呢?

3)Web 服务器站点目录假定为(/var/html/www)

4)Web 服务器 A 访问日志路径假定为(/app/logs

5)Web 服务器保留打包后的 7 天的备份数据即可(本地留存不能多于 7 天,因为太多硬盘会满)

 

6) 备份服务器 B B , , 保留 每周一的所有数据副本,其它 要保留 6 6 个月 数据副本。

7)备份服务器 B 上要按照备份数据服务器的IP 为目录保存备份,备份的文件按照时间名字

保存。

特别提示:本题在工作中是网站生产环境全网备份项目方案的一个小型模拟,很有意义。

2、本项目的整个备份逻辑结构如下图:

特别说明:

1)工作中领导很可能不会告诉你如何去做,只会提需求,例如:小崔,WEB 服务器很重要,

请你把数据在别的服务器备份一份(定期的备份)。

2)逻辑架构图更不可能是领导给你画,而是你理解了领导的意思,然后自己想出备份的方

案,最后,在实施前你做的一个图纸而已。

3、需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果

信息发给系统管理员邮箱中。

(三)网站集群后端 NFS 共享存储搭建及优化解决方案

1、配置 NFS 服务:

要求:

1)在 NFS 服务端 C(nfs01)上共享/data/w_shared/data/r_shared 两个文件目录,允许从 NFS

客户端 A(web01)B(backup)上分别挂载共享目录后可实现从 A(web01)B(backup)上只读

/data/r_shared,可写/data/w_shared

2NFS 客户端 A(web01)上的挂载点为/data/b_w(写),/data/b_r(读),

NFS 客户端 B(backup)上的挂载点为/data/w_你的名字英文(写),/data/r_你名字英文

(读)。

3)从NFS客户端B(backup)上的NFS可写挂载点目录创建任意文件,从NFS客户端A(web01)

上可以删除这个创建的文件,反之也可以。

4)问答题:如何优化 NFS 服务?

2、本项目的整个备份逻辑结构如下图(红色虚线部分):

(四)解决网站集群后端 NFS 共享存储单点实现实时数据同步

1、实时数据同步要求:

当用户通过 web 服务器将数据写入到 NFS 服务器 C(nfs01)时,同时复制到备份服务器

B(backup)



做全网备份首先做rsync服务

服务端backup搭建命令

cat >/etc/rsyncd.conf <

#Rsync server

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 = 172.16.1.0/24

#hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

#####################################

[backup]

comment = by oldboy 28qi liangye

path = /backup

[nfsbackup]

Path = /nfsbackup

EOF

useradd-s /sbin/nologin -M rsync

mkdir/backup 

mkdir/nfsbackup

chown–R rsync.rsync /nfsbackup 

chown-R rsync.rsync /backup 

echo"rsync_backup:oldboy" >/etc/rsync.password 

chmod600 /etc/rsync.password 

rsync --daemon 

lsof-i:873 

echo"/usr/bin/rsync --daemon" >>/etc/rc.local

 

客服端nfs wed01 搭建命令

echo "oldboy">/etc/rsync.password 

chmod 600 /etc/rsync.password 

mkdir /backup

touch /backup/stu{1..5}

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

 

全网备份wed客服端脚本

cd / &&\

ip=`ifconfig eth1|awk -F "[: ]+"'NR==2{print $4}'`

mkdir /backup/$ip -p

tar zcfh /backup/$ip/bak_$(date+%F_%w).tar.gz var/www/html app/logs var/spool/cron/root etc/rc.local  etc/sysconfig/iptables  server/scripts &&\

find /backup/$ip -type f -name"*$(date +%F_%w).tar.gz"|xargs md5sum >/backup/$ip/flag_$(date+%F_%w).txt &&\

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

find /backup/$ip -type f -mtime +7 -name"*.tar.gz"|xargs rm –fr

全网备份服务端backup脚本

LANG=en

flag_num=/tmp/check_$(date +%F).txt

find /backup/ -type f -name"flag_$(date +%F_%w).txt"|xargs md5sum -c|grep FAILED&>$flag_num

if [ `cat $flag_num|wc -l` -gt 0 ];then

       mail -s "$(date +%F\ %T) backup is fail!!" [email protected]<$flag_num

else

       echo "backup is ok"|mail -s "$(date +%F\ %T) backup issuccessful" [email protected]

fi

#find /backup/172.16.1.31/  -type f -mtime -7 \! -name   "bak*_6.tar.gz"|xargs rm –fr

因为我们要受到服务端的邮件所以要在/etc/mail.rc 下面添加配置文件

set [email protected] smtp=smtp.163.comsmtp-auth-user=15855557337 smtp-auth-password=cai1234 smtp-auth=login

2.配置 NFS 服务

Nfs服务端搭建命令

yum install nfs-utils rpcbind –y

mkdir /data/w_share  -p 

mkdir /data/r_share  -p 

echo "/data/w_share172.16.1.0/24(rw,sync)">>/etc/exports 

echo "/data/r_share 172.16.1.0/24(ro,sync)">>/etc/exports

chown -R nfsnobody:nfsnobody /data&&\

chown -R nfsnobody:nfsnobody /data/r_share/

chown -R nfsnobody:nfsnobody /data/w_share

/etc/init.d/rpcbind restart

/etc/init.d/rpcbind restart 

/etc/init.d/nfs restart 

/etc/init.d/nfs restart

 

 

nfs挂载wed01客服端搭建命令

yum install nfs-utils rpcbind-y

/etc/init.d/rpcbind restart

/etc/init.d/rpcbind restart 

/etc/init.d/nfs restart 

/etc/init.d/nfs restart

showmount -e 172.16.1.31 

mkdir /data/w_caizhiliang –p

mkdir /data/r_caizhiliang –p 

mount -t nfs 172.16.1.31:/data/w_share /data/w_caizhiliang

mount -t nfs172.16.1.31:/data/r_share /data/r_caizhiliang

echo"/usr/bin/mount -t nfs  172.16.1.31:/data/r_share /data/r_caizhiliang” >> /etc/rc.loca 

echo"/usr/bin/mount -t nfs  172.16.1.31:/data/w_share /data/w_caizhiliang” >> /etc/rc.loca

 

nfsg挂载backup客服端搭建命令

yum install nfs-utils rpcbind -y

/etc/init.d/rpcbind restart 

/etc/init.d/rpcbind restart 

/etc/init.d/nfs restart 

/etc/init.d/nfs restart

showmount -e 172.16.1.31 

mkdir /data/d_w –p 

mkdir /data/d_r –p 

mount -t nfs 172.16.1.31:/data/w_share /data/d_w

mount -t nfs 172.16.1.31:/data/r_share /data/d_r

echo "/usr/bin/mount -t nfs  172.16.1.31: /data/r_share /data/d_r”>> /etc/rc.loca 

echo "/usr/bin/mount -t nfs  172.16.1.31: /data/w_share /data/d_w”>> /etc/rc.loca

 

实时备份inotify安装

NFS服务器上安装

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo&&\

yum install inotify-tools –y

实时备份脚本

#!/bin/bash
Path=/data
Ip=172.16.1.41
/usr/bin/inotifywait -mrq  --format '%w%f' -e close_write,delete $Path \
|while read file
  do
  if  [ -f $file ];then
   rsync -az $file --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password
  else
    cd $Path &&\
   rsync -az ./ --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password
  fi
done

实时备份开机自启命令

 

chkconfig --add syncd

chkconfig syncd on

vim /etc/init.d/syncd

vim /etc/init.d/rsyncd

[root@nfs01 scripts]# cat /etc/init.d/syncd 
#!/bin/bash
#chkconfig: 2345 38 46
################################################

. /etc/init.d/functions

if [ $# -ne 1 ];then
    usage: $0 {start|stop}
    exit 1
fi

case "$1" in
start)
    /bin/bash /server/scripts/shishibeifen.sh&
    echo $$ >/var/run/inotify.pid
    if [ `ps -ef|grep inotify|wc -l` -gt 2 ];then
       action "inotify service is started" /bin/true
    else
       action "inotif yservice is started" /bin/false
    fi
    ;;
stop)
    kill -9 `cat /var/run/inotify.pid` >/dev/null 2>&1
    pkill inotifywait
    sleep 2
    if [ `ps -ef|grep inotify|grep -v grep|wc -l` -eq 0 ];then
       action "inotify service is stopped" /bin/true
    else
       action "inotify service is stopped" /bin/false
    fi
   ;;
*)
    usage: $0 {start|stop}
    exit 1
esac