rsync+nfs构建高可用文件系统详细步骤

2023-11-14

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

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  #分组标记,两台要在同一组

    unmcast_src_ip 192.168.1.223 #本机ip

    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 #本机ip

    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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rsync+nfs构建高可用文件系统详细步骤 的相关文章

随机推荐

  • C++实现通讯录管理系统(完整代码)课设或实验

    好久没写文章了 终于结束了满课的前三周以及烦人的考试 可以有多余的时间来自己学习 今天学习了利用C 实现通讯录管理系统 自己手敲了一遍 可以用来当实验题的答案或课设哦 具体的解释在代码注释当中 include
  • Qt中的d指针和q指针

    概述 如果程序从一个以前版本的库动态链接到新版本的库之后 能够继续正常运行 而不需要重新编译 那么我们就说这个库是二进制兼容的 如果一个程序需要重新编译来运行一个新版本的库 但是不需要对程序的源代码进一步的修改 这个库就是源代码兼容的 如果
  • 为什么做弱网测试?怎么做

    为什么要做弱网测试 弱网测试 属于健壮性测试的内容 为什么要做呢 尤其是现在的人们更习惯在地铁里 公交上 甚至是电梯 车库等等的场景里去关注一些新闻 看看小说 直播 玩游戏等等 在这个时候 我们就需要针对这些场景 去关注一下应用的运行状态
  • 尚硅谷-尚品汇项目开发总结(第三天)

    4 Home静态组件的拆分与postman测试接口是否可用 4 1 Home组件的拆分 注意点 HTML CSS 图片 4 2 postman测试接口 5 axios二次封装与配置代理服务器 nprogress进度条插件的使用 5 1 ax
  • 反转链表的四种方法

    目录 1 第一种方法 原地反转 2 第二种方法 利用头插法进行反转链表 3 第三种方法 利用迭代法进行反转链表 4 第四种方法 利用递归法进行反转链表 5 应用 当我们学习链表之后 就要学习一些链表的操作 而反转链表是我们必备技能 这里总结
  • SQL注入详解

    一 sql基础 1 sql注入原理 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法 破坏原有SQL结构 达到编写程序意料之外结果的攻击行为 其成因可归结为以下两个原理叠加造成 1 程序编写者在处理程序和数据库交互时 使用字
  • stm32 OV7670/摄像头模块颜色区域定位(腐蚀中心算法)

    前两天用到的摄像头模块ov7670 想在摄像头做一个色块识别 查阅了部分资料和教程 发现有用的文章挺多 于是下载了几个demo 学习了一下 感谢一些博主的分享 今天整理一下分享给大家 实现原理 将摄像头的数据读出写入tft屏 读取tft屏幕
  • Qt设置不规则窗体(Mask)

    创建新项目testMask 继承QWidget 添加Qt Resource file文件 添加图片资源 往ui界面中拖入一个label标签部件 标签文字内容设置为空白 widget h ifndef WIDGET H define WIDG
  • openGauss学习笔记-26 openGauss 高级数据管理-约束

    文章目录 openGauss学习笔记 26 openGauss 高级数据管理 约束 26 1 NOT NULL约束 26 2 UNIQUE约束 26 3 PRIMARY KEY 26 4 FOREIGN KEY 26 5 CHECK约束 o
  • js校验数据,是否填写(可校验全部文件是否上传),或者同名的name

    核心代码 var ff document getElementsByTagName input for var i 0 i lt ff length i if ff i type file ff i name uploadfile aler
  • 多元回归预测

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 多元回归预测 Matlab生成对抗网络 GAN 数据回归预测 GAN回归预测 多输入单输出模型 部分源码
  • LeetCode 25. K 个一组翻转链表

    题目链接 https leetcode cn com problems reverse nodes in k group 首先判断后面的节点够不够一组 k个节点 然后进行组内 k个节点 翻转 最后修改组头节点和组尾节点的指向 struct
  • SLIP、PPP、PPPoE、L2TP以及PPTP协议

    SLIP协议 全称Serial Line Internet Protocol 串行线路网际协议 该协议是Windows远程访问的一种旧工业标准 主要在Unix远程访问服务器中使用 因为SLIP协议是面向低速串行线路的 可以用于专用线路 也可
  • threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率

    先来个效果图 之前写的那个稍微有点问题 帧率只有30 参照官方代码修改后 帧率可以达到50了 在不全屏的状态下 帧率60 1 首先需要导入库 用于模型边缘高亮 import EffectComposer from three example
  • 2023第十四届蓝桥杯国赛 C/C++ 大学 B 组

    省赛还水了个省一 国赛原型毕露了 参考文献 13条消息 2023第十四届蓝桥杯国赛 C C 大学 B 组 旧林墨烟的博客 CSDN博客 13条消息 2023第十四届蓝桥杯国赛 C C 大学 B 组 赛后记录 Zero的博客 CSDN博客 A
  • Python3:我低调的只用一行代码,就导入Python所有库!

    一行代码导入python所有库 1 引言 2 Pyforest 2 1 Pyforest 介绍 2 2 Pyforest 安装与使用 2 2 1 安装 2 2 2 使用 3 总结 1 引言 今天我们来分享一个懒人库 Pyforest 小屌丝
  • 数据分析:pandas

    pandas 常用数据类型 Series创建 Series切片和索引 DataFrame 读取外部数据 dataframe创建 dataframe基本属性查询 排序 取行列 布尔索引 字符串方法 缺失数据处理 数据合并 join merge
  • Week2 Git 入门1: Advanced git interaction

    通过cd 命令 进入一个git repository的目录 执行 atom psript py 用atom 打开当前repo里的psript py文件 改写sript py文件 可以直接使用git commit a m 命令提交并保存本次修
  • 谷粒商城项目总结--Elasticsearch

    Elasticsearch 一 基本概念 二 安装 三 初步检索 1 cat 2 索引一个文档 保存 3 查询文档 4 更新文档 5 删除文档 索引 6 bulk 批量 API 7 样本测试数据 四 进阶检索 1 检索信息 2 Query
  • rsync+nfs构建高可用文件系统详细步骤

    当系统要求高可靠 高性能时 一般采用分布式部署方案 应用服务器分布式部署比较成熟 应用中用到的文件 如文件 图片等上传下载 系统有如下几种方案 1 存储在文件目录 传统处理方式 2 存储到存储云上 按相关存储云的api开发即可 不涉及物理部