Centos 5.8 搭建rsync服务器
对于任何一个互联网公司来说,数据的备份都是很重要的。
我们的生产环境是这样的,我们有数百台的服务器,然后在云主机机房有几台实体服务器,空间大小都是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服务,一般装系统都自带
[root@localhost ~]# rpm -qa|grep rsync #如果没有请yum下载。
rsync-3.0.6-4.el5_7.1
第二步,生成相关文件
[root@localhost rsyncd]# mkdir /etc/rsyncd #用来存放密码文件的目录以及密码用的目录
[root@localhost 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
第三步:按照配置文件的目录生成目录和文件
[root@localhost 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
[root@localhost 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
[root@localhost rsyncd]# cat /etc/rsyncd/10.1.15.97/rsyncd.passwd #文件内容是用户名:密码
admin:123456 #密码要复杂点
chmod 600 rsyncd.passwd #必须600授权不然成功不了
第四步,启动rsync服务
[root@localhost rsyncd]# /usr/bin/rsync --daemon &
下面是我存储的空间结构:
第五步:添加防火墙规则
[root@localhost 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
[root@localhost rsyncd]# /etc/init.d/iptables restart
2).rsync客户端的配置
[root@localhost .ssh]# cat /etc/rsyncd.passwd #生成只有密码的配置文件
123456
[root@huawei backup]# chmod 600 /etc/rsyncd.passwd
客户端防火墙不用添加规则:
[root@localhost .ssh]# cat /etc/sysconfig/iptables|grep 873
[root@localhost .ssh]#
rsync -avz --delete
/data/backup admin@10.1.15.96::10.1.15.97 --password-file=/etc/rsyncd.passwd #真实IP地址能给大家看哈不好意思
#这表示成功了哈,没有error报错。
那么我们试试看往另一个模块里面传输文件试试:
[root@localhost .ssh]# rsync -avz /data/backup admin@10.1.15.96::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上面传输一下试试,看看是服务器端的问题还是我们设置成功了:
[yunwei@cacti1@uusee ~]$ ssh 10.1.15.238
Last login: Wed Mar 25 17:57:15 2015 from
[root@huawei_238 backup]# rsync -avz xhrdb_2015-03-26-00.sql.gz admin@10.1.15.96::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 #这状态是成功的
最后一步:添加定时任务
[root@huawei_218 backup]# cat /var/spool/cron/root |grep rsync
#mysql_rsync
0 1 * * * rsync -avz /data/backup/ admin@10.1.15.96::10.1.15.238/mysql_backup/ --password-file=/etc/rsyncd.passwd
剩下的就按照自己的思路部署线上环境吧,有点乱哈!
链接:http://www.cnblogs.com/mchina/p/2829944.html讲的很详细,下面是摘抄做个备份。
全局参数
在文件中 [module] 之外的所有配置行都是全局参数。当然也可以在全局参数部分定义模块参数,这时该参数的值就是所有模块的默认值。
参数 | 说明 | 默认值 |
---|---|---|
address | 在独立运行时,用于指定的服务器运行的 IP 地址。由 xinetd 运行时将忽略此参数,使用命令行上的 –address 选项替代。 | 本地所有IP |
port | 指定 rsync 守护进程监听的端口号。 由 xinetd 运行时将忽略此参数,使用命令行上的–port 选项替代。 | 873 |
motd file | 指定一个消息文件,当客户连接服务器时该文件的内容显示给客户。 | 无 |
pid file | rsync 的守护进程将其 PID 写入指定的文件。 | 无 |
log file | 指定 rsync 守护进程的日志文件,而不将日志发送给 syslog。 | 无 |
syslog facility | 指定 rsync 发送日志消息给 syslog 时的消息级别。 | daemon |
socket options | 指定自定义 TCP 选项。 | 无 |
模块参数
模块参数主要用于定义 rsync 服务器哪个目录要被同步。模块声明的格式必须为 [module] 形式,这个名字就是在 rsync 客户端看到的名字,类似于 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:
a. 基本模块参数
参数 | 说明 | 默认值 |
---|---|---|
path | 指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的。 | 无 |
comment | 给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。 | 无 |
b. 模块控制参数
参数 | 说明 | 默认值 |
---|---|---|
use chroot | 若为 true,则 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件。 | true |
uid | 指定该模块以指定的 UID 传输文件。 | nobody |
gid | 指定该模块以指定的 GID 传输文件。 | nobody |
max connections | 指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。 | 0(没有限制) |
lock file | 指定支持 max connections 参数的锁文件。 | /var/run/rsyncd.lock |
list | 指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为 false,可以创建隐藏的模块。 | true |
read only | 指定是否允许客户上传文件。若为 true 则不允许上传;若为 false 并且服务器目录也具有读写权限则允许上传。 | true |
write only | 指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。 | false |
ignore errors | 指定在 rsync 服务器上运行 delete 操作时是否忽略 I/O 错误。一般来说 rsync 在出现 I/O 错误时将将跳过 –delete 操作,以防止因为暂时的资源不足或其它 I/O 错误导致的严重问题。 | true |
ignore nonreadable | 指定 rysnc 服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些不应该被备份者获得的文件时是有意义的。 | false |
timeout | 该选项可以覆盖客户指定的 IP 超时时间。从而确保 rsync 服务器不会永远等待一个崩溃的客户端。对于匿名 rsync 服务器来说,理想的数字是 600(单位为秒)。 | 0 (未限制) |
dont compress | 用来指定那些在传输之前不进行压缩处理的文件。该选项可以定义一些不允许客户对该模块使用的命令选项列表。必须使用选 项全名,而不能是简称。当发生拒绝某个选项的情况时,服务器将报告错误信息然后退出。例如,要防止使用压缩,应该是:”dont compress = *”。 | *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz |
c. 模块文件筛选参数
参数 | 说明 | 默认值 |
---|---|---|
exclude | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式。 | 空 |
exclude from | 指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义。 | 空 |
include | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式 。 | 空 |
include from | 指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义。 | 空 |
一个模块只能指定一个exclude 参数、一个include 参数。
结合 include 和 exclude 可以定义复杂的exclude/include 规则 。
这几个参数分别与相应的rsync 客户命令选项等价,唯一不同的是它们作用在服务器端。
关于如何书写规则文件的内容请参考http://www.howtocn.org/rsync:use_rsync。
d. 模块用户认证参数
参数 | 说明 | 默认值 |
---|---|---|
auth users | 指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。 | (匿名方式) |
secrets file | 指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。 | 空 |
strict modes | 指定是否监测口令文件的权限。若为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。 | true |
rsync 认证口令文件的权限一定是 600,否则客户端将不能连接服务器。
rsync 认证口令文件中每一行指定一个 用户名:口令 对,格式为:
username:passwd
一般来说口令最好不要超过8个字符。若您只配置匿名访问的 rsync 服务器,则无需设置上述参数。
e. 模块访问控制参数
参数 | 说明 | 默认值 |
---|---|---|
hosts allow | 用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。 | * |
hosts deny | 用一个主机列表指定哪些主机客户不允许连接该模块。 | 空 |
客户主机列表定义可以是以下形式:
单个IP地址。例如:192.168.0.1
整个网段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
可解析的单个主机名。例如:centos,centos.bsmart.cn
域内的所有主机。例如:*.bsmart.cn
“*”则表示所有。
多个列表项要用空格间隔。
f. 模块日志参数
参数 | 说明 | 默认值 |
---|---|---|
transfer logging | 使 rsync 服务器将传输操作记录到传输日志文件。 | false |
log format | 指定传输日志文件的字段。 | ”%o %h [%a] %m (%u) %f %l” |
<p style="border: 0px; font-family: Roboto, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-weight: normal;