文件存储高可用

vsftp+rsync+notify+nginx

简介

vsftp 用作文件存储服务器

rsync+notify 用作文件实时同步工具,(rsync—文件同步工具,notify—监控文件变化)

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件

nginx用作灾备工具

使用backup功能:backup参数 ,backup不能和ip_hash一起使用,backup 参数是指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机

vsftp

安装
#yum install  vsftpd
#systemctl enable  vsftpd
#systemctl start  vsftpd

修改配置文件

#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO ###关闭匿名用户登录
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
max_clients=1000
max_per_ip=1000
use_localtime=YES
reverse_lookup_enable=NO

#需要代理转发ftp请求加入以下配置
pasv_enable=YES ###开启被动模式
pasv_min_port=10000 ###被动模式端口(起始端口)主备两台分别设置不同端口
pasv_max_port=10009 ###被动模式端口(末至端口)主备两台分别设置不同端口
pasv_address=192.168.12.8 ###proxy代理IP(nginx主机 IP)

添加本地用户用作 ftp 登录

指定 ftp-user 的uid 1009

#useradd -u 1009 -g root -d /filesec/ftp-user  ftp-user

修改用户密码

#echo "ftp-user:Hdlh@123"|chpasswd 
"ftp-user:Hdlh@123":"用户名:密码"
#echo"Hdlh@123"|passwd --stdin "ftp-user"
"Hdlh@123":密码
"ftp-user":用户名

rsync+notify

单向同步(rsync):主服务器启动rsyncd后台程序,由备份服务器执行同步命令

实时同步(rsync+inotify):备份服务器启动rsyncd后台程序,由主服务器执行inotify脚本实时检测本地目录,再执行同步命令。

双向同步:两台服务器都安装rsync+inotify;两台服务器创建认证文件(secrets file = /etc/rsyncd.passwd),两台备份服务器创建单独密码文件(--password-file=/hdfs/project/rsync/rsyncd.passwd)

rsync

安装
#yum install -y rsync

配置文件

配置文件不能包含 # 注释

(主文件端

#vim /etc/rsyncd.conf
uid = ftp-user #设置运行rsync 进程的用户
gid = root
use chroot = no #使用默认根目录
max connections = 200 #最大连接数
#pid file = /var/run/rsyncd.pid #CentOS7中yum安装不需指定pid file 否则报错
lock file = /hdfs/project/rsync/rsyncd.lock #指定支持 maxconnections 参数的锁文件
log file = /hdfs/project/rsync/rsyncd.log #此文件定义完成后 系统会自动创建
transfer logging = yes #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
timeout = 180 #通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。
ignore nonreadable = yes #同步时跳过没有权限的目录
dont compress = *.gz *.tgz*.zip *.z *.Z *.rpm *.deb *.bz2 #传输时不压缩的文件
[ftp] #此名字即客户端使用rsync来同步的路径
path = /hdfs/project/ftp #实际需要同步的路径
ignore errors = yes #指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题
read only = no #表示可以pull
#write only = no #表示不可以push
hosts allow = 192.168.2.102 #客户端同步的地址多个 , 隔开
hosts deny = * #指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。
list = false #该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。
#uid = ftp-user #获取文件的身份
#gid = root
auth users = ftp-user #客户端获取文件的身份此用户并不是本机中确实存在的用户
secrets file = /etc/rsyncd.passwd #用来认证客户端的秘钥文件 格式 USERNAME:PASSWD 此文件权限一定改为600,且属主必须与运行rsync的用户一致。(需自行创建)

创建认证用户及密码文件

(对应配置文件中的参数 secrets file)

#vim /etc/rsyncd.passwd
ftp-user:Hdlh@123
#chmod 600  /etc/rsyncd.passwd

启动并后台运行

#rsync --daemon
#systemctl start rsyncd
#systemctl enable rsyncd

备份服务器配置

安装
#yum install  rsync  -y
认证用户及密码文件

(用来认证主服务器主机密码)

(只需要补充密码字段即可)

#echo “${passwd}”  >> /hdfs/project/rsync/rsyncd.passwd
对应主服务器用户ftp-user的密码
修改权限
#chmod 600  /hdfs/project/rsync/rsyncd.passwd
文件传输
#rsync -avz --progress --password-file=/hdfs/project/rsync/rsyncd.passwdftp-user@192.168.2.122::ftp /rsync/

命令参数详解
  -v,–verbose 详细模式输出
  -z,–compress 对备份的文件在传输时进行压缩处理
  -r,–recursive 对子目录以递归模式处理
  -t,–times 保持文件时间信息
  -o,–owner 保持文件属主信息
  -p,–perms 保持文件权限
  -g,–group 保持文件属组信息
  –-progress显示传输进度
  --delete删除客户端多余文件
-- password-file=/etc/rsyncd.passwd ftp-user@192.168.2.122::test
password-file=/etc/rsyncd.passwd:用来登录主服务器主机密码
ftp-user:登录主机用户
192.168.2.122:主服务器主机IP
ftp:主服务器配置文件中的模块名称
/rsync/:备份服务器本地存储目录

notify

主服务器

查看服务器内核是否支持 inotify

#ll  /proc/sys/fs/inotify/
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量

Inotify 可以监视的文件系统事件包括:

access,即文件被访问

modify,文件被 write

attrib,文件属性被修改,如 chmod、chown、touch 等

close_write,可写文件被 close

close_nowrite,不可写文件被 close

open,文件被 open

moved_from,文件被移走,如mv

moved_to,文件被移来,如 mv、cp

create,创建新文件

delete,文件被删除,如 rm

delete_self,自删除,即一个可执行文件在执行时删除自己

move_self,自移动,即一个可执行文件在执行时移动自己

unmount,宿主文件系统被 umount

close,文件被关闭,等同于(IN_CLOSE_WRITE |IN_CLOSE_NOWRITE)

move,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

安装

安装包:https://pkgs.org/download/inotify-tools

#rpm -ivh inotify-tools-3.14-9.el7.x86_64.rpm

脚本

#mkdir /hdfs/project/rsync#vim /hdfs/project/rsync/inotify.sh
#vim /hdfs/project/rsync/inotify.sh
host=192.168.2.102                                  #备份服务器
src=/hdfs/project/ftp/                              #主文件端的目录,后面一定加上/ ,只同步目录下的所有递归,不加 / ,会同步整个目录,
des=ftp                                                      #主服务器rsyncd.conf配置参数
password=/etc/rsyncd.passwd                 #主服务器登录验证密码
user=ftp-user                                           #用户
inotifywait=/usr/bin/inotifywait               #命令
log=/hdfs/project/rsync/inotify.log         #日志文件
     
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib$src | while read files;do
    rsync -avzP --delete  --timeout=100 --password-file=${password}$src $user@$host::$des
        echo "${files}was rsynced" >> ${log} 2>&1
    done
--delete参数:表示rsync同步前,暴力删除目标目录中的所有文件,然后再执行同步操作。
--delete-before参数:表示rsync同步前,会先对目标目录进行一次扫描检索,删除目标目录中对比源目录多出来的文件,在执行同步

启动脚本

#nohup bash inotify.sh &
#nohupcommand & :后台运行,关掉终端程序不会停止,还会继续运行

设置开机自启

#vim /etc/rc.d/rc.local
nohup/bin/bash /hdfs/project/rsync/inotify.sh
#chmod +x /etc/rc.local

Nginx

依赖

#yum install  make zlib zlib-develgcc-c++ libtool  openssl openssl-develpcre
安装
#./configure --prefix=/hdfs/project/nginx--user=ftp-user --with-http_ssl_module --with-http_gzip_static_module--with-http_stub_status_module --with-http_realip_module --with-stream--with-stream_realip_module
#make && make install

配置文件

    user  ftp-user;
    worker_processes  1;
     
    error_log  logs/error.log;
    pid        nginx.pid;
     
    worker_rlimit_nofile  51200;
     
    events {
        use epoll;
        worker_connections  10240;
    }
    
    #http {
    #    include       mime.types;
    #    include       /hdfs/project/nginx/conf/conf.d/*.conf;
    #    default_type  application/octet-stream;
    #
    #    log_format  real_ip '$remote_addr - $remote_user [$time_local] "$request" '
    #                 '$status$body_bytes_sent "$http_referer" '
    #                 '"$http_user_agent""$http_x_forwarded_for"';
    #
    #    #access_log  logs/access.log  main;
    #
    #    server_tokens   off;
    #    sendfile        on;
    #    tcp_nopush     on;
    #    tcp_nodelay    on;
    #
    #    client_max_body_size  500M;
    #   client_header_buffer_size  128K;
    #   large_client_header_buffers 4  32k;
    #
    #    keepalive_timeout  300;
    #    send_timeout   60;
    #
    #    gzip  on;
    #}
     
     
    stream  {
     
        log_format proxy'$proxy_protocol_addr $remote_addr [$time_local] '
                     '$protocol$status $bytes_sent $bytes_received '
                    '$session_time "$upstream_addr" '
                    '"$upstream_bytes_sent" "$upstream_bytes_received""$upstream_connect_time"';
     
        upstream  vsftp{
            server  192.168.2.122:21 weight=99  max_fails=3 fail_timeout=30s;
    #        server  192.168.2.102:21 weight=99;
            server  192.168.2.102:21  backup;
        }
    #max_fails=3 fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒...以此循环,直到恢复
    #backup参数,backup 不能和ip_hash一起使用,backup 参数是指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机
     
        server {
            listen       21;
            access_log  logs/access-test.log proxy;
            proxy_pass  vsftp;
    #        proxy_protocol on;
        }
     
    #以下为被动模式端口的转发
    #注意端口的一一对应关系(vsftpd.conf配置)
     
        server {
            listen       192.168.12.8:10000;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10000;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10001;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10001;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10002;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10002;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10003;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10003;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10004;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10004;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10005;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10005;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10006;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10006;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10007;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10007;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10008;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10008;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10009;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.122:10009;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10010;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10010;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10011;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10011;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10012;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10012;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10013;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10013;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10014;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10014;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10015;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10015;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10016;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10016;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10017;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10017;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10018;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10018;
    #        proxy_protocol on;
        }
     
     
        server {
            listen       192.168.12.8:10019;
            access_log  logs/access-test.log proxy;
            proxy_pass  192.168.2.102:10019;
    #        proxy_protocol on;
        }
    }

环境变量

#vim /etc/profile.d/nginx.sh
export NGINX_HOME=/tools/nginx
export PATH=$NGINX_HOME/sbin:$PATH
#chmod +x /etc/profile.d/nginx.sh
#source /etc/profile.d/nginx.sh

启动

#nginx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值