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目录里面的备份数据没有访问权限,一定程度上保证了数据安全,
–
–
–
评论前必须登录!
注册