路漫漫其修远兮
吾将上下而求索

服务器文件备份策略

1、当前存在的问题

服务器数量很多,每台服务器上面都有数据要备份

每台服务器备份的文件内容不同,都需要考虑到

有的服务器是私网地址,要能将私网地址的服务器文件也备份掉,尽可能简单

最好每天都备份,并且尽可能的节省带宽,做到高效

保证数据的安全,即使某一台服务器宕机,或者磁盘故障,也不会影响数据的安全,可以有效的还原数据

2、经过规划后的备份策略

        这里有两个角色:备份服务器:master,统一管理很多主机的备份文件。普通服务器:slave1,slave2,以主机名+ip来区分

        每台普通主机slave的备份数据有两份,一份打包后存放到本主机上面,一份通过远程同步的方式备份到远程主机master上面,

        本主机slave备份为每天一次(根据重要性),备份存放的时间为最近30天,远程主机master主机存放每台普通主机的备份文件时间为最近60天,确保数据安全。过期数据会在脚本中被自动删除。

        备份服务器master,这台服务器必须有公网ip,普通主机slave不管有无公网ip都可以,每天凌晨3点(在访问量最少的情况下),slave通过本机的备份脚本备份本机上面(配置的待备份的)文件,备份完成后,将备份的目录通过rsync命令的ssh方式同步到远程的备份服务器master上。因为是待备份的服务器主动推送上去的,不管待备份的服务器是否有公网ip都可以,并且本机不用设置防火墙和端口映射等一系列操作,当同步数据完成后会在远端的备份服务器master上面创建一个文件,表明这次备份是成功的,因为备份服务器master不知道这次备份是否是执行到了一半还是完全的。

        普通主机slave在远端服务器创建文件完成后,会将本地的备份目录打包为以日期为命名的文件存放,并将备份数据目录删除

        备份服务器master会在凌晨4点开始根据主机名逐个检查是否有备份完成标志,如果有,将此目录复制打包为日期+主机名+ip的压缩包存放,如果没有备份完成标志,则不做任何处理

        最后备份服务器master会将当前的所有情况汇总下(总共多少文件,成功多少,这一天的文件大小),通过邮件发送给相关人员来检查是否有问题。

        当第二天开始同步数据的时候,待备份的服务器和以前一样,进行复制备份,但是和远程服务器进行同步的时候,这次因为远程服务器上面已经有昨天的数据了,这次只需要同步和昨天的差异数据,会比较快

        普通服务器不管是内网机器还是外网机器,只要备份服务器是外网机器,有固定ip或者域名(内网也可以,只要能连接上),就可以正常工作,普通服务器也不用额外设置防火墙,nat之类的,修改密码等操作都对备份没有影响

        有新增的机器,添加定制备份也很简单

        可能说的不太清楚,看代码

3、测试环境和准备

主机:192.168.175.11(master):备份服务器,主机名:local-11

主机:192.168.175.12(slave1):普通服务器,主机名:local-12

主机:192.168.175.13(slave2):普通服务器,主机名:local-13

系统:centos6.8

每台服务器都要装rsync命令,zip命令,unzip命令,tar命令等,并且同步时间

备份服务器:local-11要使用raid10来保证物理安全,普通主机只能通过rsync用户来登录备份服务器:local-11,来确保系统安全

所有服务器状况

主机:192.168.175.11(master):主机名:local-11
[root@local-11 ~]#ip a
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:3f:ac:4d brd ff:ff:ff:ff:ff:ff
    inet 192.168.175.11/24 brd 192.168.175.255 scope global eth0
    inet6 fe80::250:56ff:fe3f:ac4d/64 scope link 
       valid_lft forever preferred_lft forever
[root@local-11 ~]#hostname
local-11

主机:192.168.175.12(slave1):主机名:local-12
[root@local-12 ~]#ip a
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:39:87:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.175.12/24 brd 192.168.175.255 scope global eth0
    inet6 fe80::250:56ff:fe39:877f/64 scope link 
       valid_lft forever preferred_lft forever
[root@local-12 ~]#hostname
local-12

主机:192.168.175.13(slave2):主机名:local-13
[root@local-13 ~]#ip a
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:2a:10:83 brd ff:ff:ff:ff:ff:ff
    inet 192.168.175.13/24 brd 192.168.175.255 scope global eth0
    inet6 fe80::250:56ff:fe2a:1083/64 scope link 
       valid_lft forever preferred_lft forever
[root@local-13 ~]#hostname
local-13

备份服务器操作:创建用户,密码,备份目录权限等,这个目录要放在空间比较大的分区,要存放所有主机的备份。最好是独立的磁盘上面

主机:192.168.175.11(master):主机名:local-11
[root@local-11 ~]#useradd -r --create-home rsync
[root@local-11 ~]#id rsync
uid=493(rsync) gid=489(rsync) groups=489(rsync)

[root@local-11 ~]#passwd rsync
Changing password for user rsync.
New password: 234567


下面的这个创建目录必须要提前完成,不然同步没有权限,都是以rsync用户身份运行的,
[root@local-11 ~]#mkdir -p /data/backup/current    #这个目录要对rsync有写权限
[root@local-11 ~]#mkdir -p /data/backup/flag    #这个目录也要对rsync有写权限

[root@local-11 ~]#chown -R rsync /data/backup/current/
[root@local-11 ~]#chown -R rsync /data/backup/flag/

[root@local-11 ~]#chmod 700 /data/backup/current/    #最小化权限,其他用户访问不了
[root@local-11 ~]#chmod 700 /data/backup/flag/   #最小化权限,其他用户访问不了

[root@local-11 ~]# ll /data/backup/
total 8
drwx------ 2 rsync root 4096 Jun 29 09:42 current
drwx------ 2 rsync root 4096 Jun 29 09:42 flag

普通服务器操作,创建公钥,将公钥添加到备份服务器的rsync用户下面

主机:192.168.175.12(slave1):主机名:local-12
[root@local-12 ~]#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:
82:29:4b:4f:60:01:1e:7b:ee:2e:e3:09:da:f9:cb:35 root@local-12
The key's randomart image is:
+--[ RSA 2048]----+
|.o.              |
|. o.             |
| oo.             |
| .o. o           |
|  o.+ . S        |
| ..=   .         |
|. ... E          |
|o+oo . .         |
|oo=o+.           |
+-----------------+
[root@local-12 ~]#ssh-copy-id rsync@192.168.175.11


主机:192.168.175.13(slave2):主机名:local-13
[root@local-13 ~]#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:
d3:53:29:21:43:1f:52:88:b8:a2:20:2a:32:67:27:5d root@local-13
The key's randomart image is:
+--[ RSA 2048]----+
|     . o=o+      |
|    . . .= o .   |
|     .    o o    |
|o . . E  . o     |
|+. o .  S o      |
|* + o    . .     |
|o+ o             |
|                 |
|                 |
+-----------------+
[root@local-13 ~]#ssh-copy-id rsync@192.168.175.11

然后就可以在备份服务器上面的rsync用户下面看到上面两个主机的公钥了

[root@local-11 ~]#su - rsync
[rsync@local-11 ~]$ls
[rsync@local-11 ~]$cd .ssh/
[rsync@local-11 ~/.ssh]$ls
authorized_keys
[rsync@local-11 ~/.ssh]$cat authorized_keys     #太长截取了一部分
ssh-rsa AAAAB3NzaC1yc2EAAAlaLnjY1akCoFBtA4ttUNiGqNJ8LPJTaesFmj1OicVmK8vRcv0iDamxFy1oL9L6i2NhHTeT+qTvjIQ== root@local-12
ssh-rsa AAAAB3NzaC1yc2EAAArH6pzijfL53p18vbVoRuGWohUSsCoJuoOKP/CiPs/yGrp9rwb8sZMgwwqZ38HHw13kRzf2sD3vRFQ== root@local-13

到这里,普通服务器就可以使用root用户通过ssh免密码登录备份服务器的rsync用户,推送数据到备份服务器的:/data/backup目录了,

普通服务器上的备份脚本文件,根据需求自行修改,将要备份的文件添加到下面的位置即可,这里的备份必须以root权限来执行,因为有些文件只有root有访问权限,比如iptables配置文件

主机:192.168.175.12(slave1):主机名:local-12
[root@local-12 ~]#mkdir -p /data/script
[root@local-12 ~]#cd /data/script

[root@local-12 /data/script]#cat backup_file.sh 
具体查看gitlab

[root@local-12 /data/script]#chmod +x backup_file.sh 
[root@local-12 /data/script]#ll
total 4
-rwxr-xr-x 1 root root 1759 Jun 28 16:22 backup_file.sh

[root@local-12 /data/script]#cat /etc/crontab    #添加到定时任务中
  0  3  *  *  *  root  /bin/bash /data/script/backup_file.sh

普通服务器13的也一样,这里同步刚下载的nginx包,代码省略

当上面的程序在定时任务中执行成功以后

普通服务器12,成功备份,并将备份过程记录到日志文件中,便于以后查看

[root@local-12 /data/backup]#ll
total 508
-rw-r--r-- 1 root root   4259 Jun 28 16:26 backup.log
-rw-r--r-- 1 root root 509012 Jun 28 16:26 local-12_192.168.175.12_2017-06-28.tar.gz

[root@local-12 /data/backup]#cat backup.log 
2017-06-28_16:26:01 ##########start backup
####1.mkdir ok
sending incremental file list
local-12_192.168.175.12/
local-12_192.168.175.12/crontab
local-12_192.168.175.12/iptables
local-12_192.168.175.12/log/
local-12_192.168.175.12/log/Xorg.0.log
local-12_192.168.175.12/log/Xorg.0.log.old
local-12_192.168.175.12/log/Xorg.9.log
......
local-12_192.168.175.12/log/vmware-caf/pme/ma-log4cpp_rolling.log

sent 4441233 bytes  received 1558 bytes  683506.31 bytes/sec
total size is 4435161  speedup is 1.00
####2.rsync ok
####3.mkdir ok
####4.touch ok
####tar ok
####rm ok
2017-06-28_16:26:24 ##########stop backup

[root@local-12 /data/backup]#ls
backup.log  local-12_192.168.175.12_2017-06-28.tar.gz

[root@local-12 /data/backup]#tar xf local-12_192.168.175.12_2017-06-28.tar.gz 
[root@local-12 /data/backup]#ls
backup.log  local-12_192.168.175.12_2017-06-28  local-12_192.168.175.12_2017-06-28.tar.gz

[root@local-12 /data/backup]#cd local-12_192.168.175.12_2017-06-28
[root@local-12 /data/backup/local-12_192.168.175.12_2017-06-28]#ls
crontab  iptables  log

备份服务器11,显示12和13都备份成功,目录同步到这里了,并且flag里面有成功标志,表明可以将其备份了,

[rsync@local-11 /data/backup]$tree -L 3
.
├── current
│   ├── local-12_192.168.175.12
│   │   ├── crontab
│   │   ├── iptables
│   │   └── log
│   └── local-13_192.168.175.13
│       ├── crontab
│       └── nginx-1.12.0
└── flag
    ├── local-12_192.168.175.12_20170628_ok
    └── local-13_192.168.175.13_20170628_ok

6 directories, 5 files

备份主机脚本

备份服务器的备份脚本文件,在备份服务器上面,执行的脚本以root用户身份运行,要比上面的脚本运行要晚一些,最好隔一个小时。将同步成功的目录复制备份到以日期命名的目录中,并将目录设置为700,最小化权限,rsync用户对这个目录没有访问权限,确保普通主机通过rsync用户登录到备份主机,不会对important目录进行查看或删除,确保文件安全

需修改下面的发送邮件的地址和密码

[root@local-11 /data/script]#cat backup_srv.sh 
具体查看gitlab

[root@local-11 /data/script]#chmod +x backup_srv.sh 

[root@local-11 /data/script]#cat /etc/crontab
  0  4  *  *  * root /bin/bash /data/script/backup_srv.sh

后面将最后的统计结果发送给管理员查看

备份服务器备份完成后的目录结构

[rsync@local-11 /data/backup]$ls
20170628  current  flag

[rsync@local-11 /data/backup]$tree -L 3 .
.
└── important
        ├── 20170628
        │   ├── backup.log
        │   ├── local-12_192.168.175.12_20170628.tar.gz
        │   └── local-13_192.168.175.13_20170628.tar.gz
├── current
│   ├── local-12_192.168.175.12
│   │   ├── crontab
│   │   ├── iptables
│   │   └── log
│   └── local-13_192.168.175.13
│       ├── crontab
│       └── nginx-1.12.0
└── flag
    ├── local-12_192.168.175.12_20170628_ok
    └── local-13_192.168.175.13_20170628_ok

7 directories, 8 files

此策略:普通主机都通过ssh以rsync用户的身份登录备份服务器,看到备份服务器备份的其他服务器的所有文件,如果不想其他服务器看到内容,需要单独在普通服务器上面对文件进行加密,然后同步到备份服务器上面

如果新的主机需要添加备份,只需要将普通主机的备份脚本复制到该主机,修改脚本中的本机ip,和要备份的文件,并将本机的公钥添加到备份服务器的rsync用户下面就可以成功备份

虽然普通主机可以通过rsync用户访问current里面所有主机的备份数据,但是对important目录里面的备份数据没有访问权限,一定程度上保证了数据安全,

未经允许不得转载:江哥架构师笔记 » 服务器文件备份策略

分享到:更多 ()

评论 抢沙发

评论前必须登录!