当系统要求高可靠、高性能时,一般采用分布式部署方案。应用服务器分布式部署比较成熟,应用中用到的文件(如文件、图片等上传下载)系统有如下几种方案:

1、存储在文件目录:传统处理方式。

2、存储到存储云上:按相关存储云的api开发即可,不涉及物理部署。

3、存储到数据库:该种方式让数据大小增长很快,通常不建议采用。

本文主要针对第一种方式,在应用服务器采用分布式部署时,采用本方案构建高可用的文件系统。方案图示如下:

nfs高可用 容灾 nfs server 高可用_nfs高可用 容灾

本图非完整系统部署图,仅仅只是关注文件系统部分。方案高可靠性体现在当主文件服务器down了后,系统自动使用从文件服务器,而不需做任何变化。

NFS:主要作用是使应用服务器访问文件服务器的文件就如访问本地文件一样。

Rsync+Sersync:Rsync用于两台文件服务器同步,Sersync监听变化的文件;两者配合才能高效同步

Keepalived:虚拟ip供应用服务器使用。正常状况下映射的主文件服务器,当主文件服务器异常时,自动切换到从文件服务器。

 下面是详细安装步骤(centos7.x),对照每个服务器需安装软件按步骤安装即可。

rsync安装

检查是否安装

rpm -qa|grep rsync

没有安装执行如下命令:

yum install -y rsync xinetd

配置rsync.conf

vi /etc/rsyncd.conf,插入如下内容:

uid = nobody  #设置rsync运行权限为root
gid = nobody  #设置rsync运行权限为root
UID = 0
GID = 0
use chroot = no
max connections = 100
timeout = 600
strict modes=yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
read only = no
list = no
hosts allow = 192.168.1.0/24   #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 0.0.0.0/32     #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
[files]
path = /data/files/
auth users = rsync_u
secrets file = /etc/rsyncd.pas

配置密码文件:

vi /etc/rsyncd.pas,插入如下内容:

rsync_u:201211222

改变密码文件属性:

chmod 600 /etc/rsyncd.pas

改变文件目录uid.gid属性:

chown root.root/data/files

授权nfs目录权限:

chmod 777 /data/files

防火墙设置

firewall-cmd --zone=public --add-port=873/tcp --permanent   # 开放873端口

firewall-cmd --reload   # 配置立即生效

启动

/usr/bin/rsync --daemon

验证

两台机子装好后,在目录/data/files下建立文件,用下面命令验证是否正确。

rsync -avzP /data/files/ rsync_u@192.168.1.222::files

注意:不要添加开机启动,通过keepalived启动

sersync安装

安装

把文件sersync2.5.4_64bit_binary_stable_final.tar.gz复制到tmp,执行如下命令:

tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz

mv GNU-Linux-x86/ /usr/local/sersync

ln -s /usr/local/sersync/sersync2 /usr/bin/sersync2

配置

cd /usr/local/sersync/

建立密码文件,如remote.pas,内容是要同步的目标服务器上用户的密码:

       201211222

备份:

cp confxml.xml confxml.xml.bak
vi confxml.xml ,修改如下部分内容(红色)
  <sersync>
        <localpath watch="/data/files">  #本地监控目录
            <remote ip="192.168.1.222" name="files"/>  #对端ip及rsync里面数据同步模块名
</localpath>
<rsync>
            <commonParams params="-artuz"/>
            <auth start="true" users="rsync_u" passwordfile="/usr/local/sersync/remote.pas"/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
<failLog path="/var/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> #脚本运行失败日志记录
        <crontab start="true" schedule="600"><!--600mins--> #设置为true,每隔600分钟执行一次全盘同步(可以设置为false)
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>

启动

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml

测试

在监控目录下建立文件及目录,看是否能同步到目标服务器的对应目录。

nfs服务端安装

查看系统是否已安装NFS

rpm -qa|grep nfs-utils

rpm -qa|grep portmap

安装NFS

yum -y install nfs-utils rpcbind

nfs配置

//创建默认访问用户(如果已存在则不用创建)

useradd -u 18000 -s /sbin/nologin -M nobody

建立应用目录:

cd /data/files
  mkdir ymt
  mkdir ymt/upload
  mkdir ymt/download
//改变目录权限(注意:该目录下所有文件和目录都需改变)
chown -R nobody /data/files
chgrp -R nobody /data/files
chmod -R 777  /data/files
vi /etc/exports   插入如下内容(按允许的机器配置也可以):
/data/files 192.168.1.0/24(insecure,rw,sync,all_squash,no_subtree_check,anonuid=99,anongid=99)

防火墙配置

编辑vi /etc/sysconfig/nfs,保证对应端口没有被占用

# TCP port rpc.lockd should listen on.  
LOCKD_TCPPORT=48001
# UDP port rpc.lockd should listen on.  
LOCKD_UDPPORT=48001
# Port rpc.mountd should listen on.  
MOUNTD_PORT=48002
# Port rpc.statd should listen on.  
STATD_PORT=48003
# Outgoing port statd should used. The default is port is random  
STATD_OUTGOING_PORT=48004
firewall-cmd --zone=public --add-port=111/tcp --permanent   
firewall-cmd --zone=public --add-port=111/udp --permanent   
firewall-cmd --zone=public --add-port=2049/tcp --permanent   
firewall-cmd --zone=public --add-port=2049/udp --permanent   
firewall-cmd --zone=public --add-port=48001/tcp --permanent   
firewall-cmd --zone=public --add-port=48001/udp --permanent   
firewall-cmd --zone=public --add-port=48002/tcp --permanent   
firewall-cmd --zone=public --add-port=48003/tcp --permanent   
firewall-cmd --zone=public --add-port=48004/tcp --permanent   
firewall-cmd --reload   # 配置立即生效

启动服务

systemctl start rpcbind

systemctl start nfs

查看共享目录是否成功

showmount -e

如果没有共享成功,可用exportfs -ar手工共享,看是否有出错信息

keepalived安装

安装keepalived

安装

yum install keepalived

systemctl enable keepalived.service

防火墙配置

-A INPUT -p vrrp -j ACCEPT

firewall-cmd --reload

关闭 SELinux

setenforce 0

永久关闭:

vi /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled

重启

systemctl restart keepalived

主配置

编写master脚本

vi /etc/keepalived/nfs_check.sh
#!/bin/bash
#nfs是否还存活
A=`ps -aux | grep '\[nfsd\]' | wc -l`
if [ $A -eq 0 ];then
exit 1
else
   exit 0
fi
vi /etc/keepalived/nfs_master.sh
#!/bin/bash
echo `date`:' nfs to master' >>/var/log/keepalived.log
systemctl start rpcbind
systemctl start nfs
#同时启动sersync服务
echo `date`:' start sersync2' >>/var/log/keepalived.log
/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml
vi /etc/keepalived/nfs_backup.sh
#!/bin/bash
echo `date`:' nfs to backup>>/var/log/keepalived.log
systemctl stop rpcbind
systemctl stop nfs
#同时停止sersync服务
echo `date`:' stop sersync2' >>/var/log/keepalived.log
PID=`ps -ef |grep $(echo sersync2 |awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
kill -9 $PID
chmod +x /etc/keepalived/nfs_*.sh

配置

vi /etc/keepalived/keepalived.conf

增加:

vrrp_script chk_nfs {
    script "/etc/keepalived/nfs_check.sh"
    interval 2
    timeout 1
    weight -20
    init_fail
}
vrrp_instance VI_nfs {
    state BACKUP #两台均为备用模式,按priority大的为主
    interface eth0  #网卡
    virtual_router_id 52  #分组标记,两台要在同一组
192.168.1.223
    unicast_peer {
192.168.1.222
    }
    priority 100 #越大优先级越高
advert_int 1  #心跳间隔检测
    authentication {
        auth_type PASS
        auth_pass 1111
}
promote_secondaries
    track_script {
        chk_nfs
    }
    virtual_ipaddress {  #虚拟的地址
192.168.1.228/24  dev eth0 label eth0:3
    }
    notify_master "/etc/keepalived/nfs_master.sh"
    notify_backup "/etc/keepalived/nfs_backup.sh"
}
重启:systemctl restart keepalived
从配置
同主配置一样,不同的是/etc/keepalived/keepalived.conf需要修改如下内容:
unmcast_src_ip 192.168.1.222
    unicast_peer {
192.168.1.223  
    }
    priority 90 #越大优先级越高

nfs客户端安装

安装nfs-utils

yum -y install nfs-utils

挂载共享目录

mount -t nfs -o nolock,nodev,noexec,nosuid,rw 192.168.1.228:/data/files /data/files

设置开机挂载

vi /etc/rc.local  把下列内容追加到文件末尾:

mount -t nfs -o nolock,nodev,noexec,nosuid,rw 192.168.1.228:/data/files /data/files