对于任何一个互联网公司来说,数据的备份都是很重要的。
原创博文来自:www.51niux.com 博主:忙碌的柴少
我们的生产环境是这样的,我们有数百台的服务器,然后在云主机机房有几台实体服务器,空间大小都是10T,云主机当然一般硬盘空间都较小不适合做备份服务器,这时候我就打起了实体机的注意,当然也只能打他们的主意了。
在把数据传输到实体机硬盘的情况下我们罗列一下我们的数据传输策略:
第一个方案:scp方案
个人认为,如果是单独的文件,比如像传输数据库的全备压缩包这种文件的话,每台要传输的服务器把自己的公钥发送给实体机就可以了。
但是我们是数百台服务器,除了每天要备份数据库的压缩文件以外,还有log日志,还有配置文件目录,还有每天更新的代码程序,每天程序去网上抓取的各种资源,一想就很庞大,显然很多东西就不能全备份了。
第二个方案:nfs方案
我们搞一个空间比较大的存储盘做成共享存储,nfs挂载到各个服务器上面。有人会说了,服务器都要有写权限啊,那你其他服务器把备份放到NFS服务器上面,岂不是也会被其他服务器读取和写入了嘛。我们可以nfs服务器以服务器主机名称搞一群分目录挂载过去,比如说你是10.1.15.96服务器,我就给你在我的NFS服务器总目录/data下面创建一个10.1.15.96的分目录挂载过去,这样问题解决了。但是问题又来了,你要想增量备份还是需要rsync,而且如果服务器少的话还可以分目录,那如果有100多台服务器呢,你是不要整一百台个分目录。
第三个方案:rsync服务器
由于我们的现实环境,我们有数百台服务器,我们就直接搭建rsync服务器,采取数据库压缩包全量传输,bin-log二进制等文件增量备份(对于mysql而言还可以采取主从复制的形式做数据备份),其他配置目录增量备份的形式。
既然通过层层排除觉得采取这个方案,那就要好好规划一下:
1. rsync服务器开启防火墙,只允许跳板机可以通过22端口访问过来,只对某个网段开放873端口,设置成禁止root远程访问,只允许key登录。这样我们从外部层面对rsync服务器进行了安全加固。
2. rsync服务器在配置的时候设置多个目录模块对应着各个服务器并做限定,只允许某个服务器对此目录进行rsync传输,这时候可能会问你岂不是也要建立很多个分目录,其实这个要跟实际需求来的,很多服务器上面的数据是不怎么变化的,很多服务器上面的数据可能不重要只要有几个全备就可以了,只对那些关键数据进行单个目录模块设置,可以再做一些共享目录模块,设置好允许那些ip来访问。
3. 数据的多点备份,如果我们有一台服务器被攻破了,如10.1.15.99这台服务器,每天都会执行rsync把数据增量放到自己独立的目录中去,这时候这台服务器被攻破了执行了个rsync -avz -delete /tmp/ ,坏了你辛辛苦苦备份的东西直接就给你清了。我感觉你可以把监控跟rsync运用起来,比如再搞一个存储每天晚上增量从rsync服务器上面往下拷贝数据,写一个脚本,设置一个阀值,去判断要拷贝的那个目录大小,如果小于某个阀值,就不做rsync -delete操作了,这样我们服务器除了自己备份数据以外,还有另外两台存储备份数据。当然细节方面还可以根据实际条件调节。
说多了,干什么还是根据实际情况来,具体环境考虑什么方案。
下面是rsync服务器以及客户端的搭建过程:
环境:操作系统 Centos 5.8 Rsync服务器:10.1.15.96 rsync客户端:10.1.15.97和10.1.15.238
1). 搭建rsync服务器
第一步:检查本机是否有rsync服务,一般装系统都自带
[[email protected] ~]# rpm -qa|grep rsync #如果没有请yum下载。
rsync-3.0.6-4.el5_7.1
第二步,生成相关文件
[[email protected] rsyncd]# mkdir /etc/rsyncd #用来存放密码文件的目录以及密码用的目录
[[email protected] rsyncd]# vi /etc/rsyncd.conf
port = 873 #设置监听端口
uid = root #制定传输文件的用户名
gid = root #制定传输文件的密码
use chroot = ture #若为 true,则 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件。
read only = no #可以写,yes是只能读
hosts allow = 10.124.0.0/24 #允许那些ip网段访问
hosts deny = * #拒绝剩下的所有ip
pid file = /var/run/rsyncd.pid #指定rsyncd服务器的pid文件
secrets file = /etc/rsyncd/rsyncd.passwd #指定rsyncd.passwd的密码文件
log file = /etc/rsyncd/rsync.log #制定rsync.log的传输日志,建议每天生成新的文件定时清理
transfer logging = yes #使 rsync 服务器将传输操作记录到传输日志文件,你人false
log format = %t %a %m %f %b #定义指定传输日志文件的字段。
timeout = 300 #定义超时时间300秒
[10.1.15.238]
path = /data2/10.1.15.238
list = no #不列出文件列表
ignore errors #忽略io错误
auth users = admin
hosts allow = 10.1.15.238
hosts deny = *
secrets file = /etc/rsyncd/10.1.15.238/rsyncd.passwd
[10.1.15.97]
path = /data2/10.1.15.97
list = no
ignore errors
auth users = admin
hosts allow = 10.1.15.97
hosts deny = *
secrets file = /etc/rsyncd/10.1.15.97/rsyncd.passwd
第三步:按照配置文件的目录生成目录和文件
[[email protected] rsyncd]# ls -l /data2/
total 24
drwxr-xr-x 5 root root 4096 Mar 25 17:51 10.124.19.97
drwxr-xr-x 3 root root 4096 Mar 25 17:48 10.124.32.238
[[email protected] rsyncd]# ls -l /etc/rsyncd
total 24512
drwxr-xr-x 2 root root 4096 Mar 25 17:43 10.1.15.97
drwxr-xr-x 2 root root 4096 Mar 25 17:19 10.1.15.228
[[email protected] rsyncd]# cat /etc/rsyncd/10.1.15.97/rsyncd.passwd #文件内容是用户名:密码
admin:123456 #密码要复杂点
chmod 600 rsyncd.passwd #必须600授权不然成功不了
第四步,启动rsync服务
[[email protected] rsyncd]# /usr/bin/rsync --daemon &
下面是我存储的空间结构:
第五步:添加防火墙规则
[[email protected] rsyncd]# cat /etc/sysconfig/iptables|grep 873
-A RH-Firewall-1-INPUT -s 10.1.15.0/24 -p tcp -m tcp --dport 873 -j ACCEPT
[[email protected] rsyncd]# /etc/init.d/iptables restart
2).rsync客户端的配置
[[email protected] .ssh]# cat /etc/rsyncd.passwd #生成只有密码的配置文件
123456
[[email protected] backup]# chmod 600 /etc/rsyncd.passwd
客户端防火墙不用添加规则:
[[email protected] .ssh]# cat /etc/sysconfig/iptables|grep 873
[[email protected] .ssh]#
rsync -avz --delete
/data/backup [email protected]::10.1.15.97 --password-file=/etc/rsyncd.passwd #真实IP地址能给大家看哈不好意思
#这表示成功了哈,没有error报错。
那么我们试试看往另一个模块里面传输文件试试:
[[email protected] .ssh]# rsync -avz /data/backup [email protected]::10.1.15.238 --password-file=/etc/rsyncd.passwd #这是我们设置的另一个模块
@ERROR: Unknown module ‘10.1.15.238‘ #报错失败了
rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]
我们切换到10.1.15.238上面传输一下试试,看看是服务器端的问题还是我们设置成功了:
[[email protected]@uusee ~]$ ssh 10.1.15.238
Last login: Wed Mar 25 17:57:15 2015 from
[[email protected]_238 backup]# rsync -avz xhrdb_2015-03-26-00.sql.gz [email protected]::10.1.15.238 --password-file=/etc/rsyncd.passwd
sending incremental file list
xhrdb_2015-03-26-00.sql.gz
sent 331654361 bytes received 27 bytes 3267530.92 bytes/sec #这状态是成功的
最后一步:添加定时任务
[[email protected]_218 backup]# cat /var/spool/cron/root |grep rsync
#mysql_rsync
0 1 * * * rsync -avz /data/backup/ [email protected]::10.1.15.238/mysql_backup/ --password-file=/etc/rsyncd.passwd
剩下的就按照自己的思路部署线上环境吧,有点乱哈!
原创博文来自:www.51niux.com 博主:忙碌的柴少
链接:http://www.cnblogs.com/mchina/p/2829944.html讲的很详细