当系统要求高可靠、高性能时,一般采用分布式部署方案。应用服务器分布式部署比较成熟,应用中用到的文件(如文件、图片等上传下载)系统有如下几种方案:
1、存储在文件目录:传统处理方式。
2、存储到存储云上:按相关存储云的api开发即可,不涉及物理部署。
3、存储到数据库:该种方式让数据大小增长很快,通常不建议采用。
本文主要针对第一种方式,在应用服务器采用分布式部署时,采用本方案构建高可用的文件系统。方案图示如下:
本图非完整系统部署图,仅仅只是关注文件系统部分。方案高可靠性体现在当主文件服务器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