linux服务器文件实时同步

1 背景说明

在做系统集群部署时,涉及到两个或多个服务器之间文件同步.在软件层面linux服务环境找到以下两种同步方式

  • 利用linux NFS功能将网络共享文件挂载成本地目录
  • 采用文件监听,实时推送

服务器资源如下

  • 服务器1 10.2.4.51 ,作为主服务器
  • 服务器2 10.2.4.52 ,作为从服务器

2 NFS网络共享配置

2.1 主服务器

2.1.1 安装应用包
bash 复制代码
yum install -y nfs-utils rpcbind #nfs安装命令 author: herbert qq:464884492
systemctl enable nfs #将nfs设置开机启动
systemctl enable rpcbind #将rpcbind设置开机启动
2.1.2 共享配置

主服务建立需要共享的文件夹

bash 复制代码
mkdir /home/nfs_data # 主服务需要共享的目录 

配置从服务可以访问主服务器

bash 复制代码
vi /etc/exports #author: herbert qq:464884492

设置内容为

bash 复制代码
/home/nfs_data/ 10.2.4.52(rw,sync,no_root_squash)

重启服务,注意一定要先启动 rpcbind

bash 复制代码
systemctl stop nfs 
systemctl stop rpcbind
systemctl start rpcbind 
systemctl start nfs
showmount -e # 可以检查NFS配置是否生效
# 配置正确后,会有一下提示信息
Export list for hk51:
/home/nfs_data 10.2.4.52
2.1.3 防火墙配置

如果服务器需要开启防火墙,需要在防火墙添加服务,可以通过firewall-cmd --state 防火墙开启状态

bash 复制代码
firewall-cmd --add-service=nfs --permanent --zone=public
firewall-cmd --add-service=mountd --permanent --zone=public
firewall-cmd --add-service=rpc-bind --permanent --zone=public
firewall-cmd --reload #重新载入配置,使其生效

2.2 从服务器

2.2.1 应用包安装
bash 复制代码
yum -y install nfs-utils 
2.2.2 挂载配置

在相同的路径建立同样的目录

bash 复制代码
mkdir /home/nfs_data # 从服务需要共享的目录

挂载目录

bash 复制代码
mount -t nfs -o sync,noac 10.2.4.51:/home/nfs_data /home/nfs_data #目录挂载

检查挂载

bash 复制代码
 df -h #查看挂载

配置开机启动挂载

bash 复制代码
vi /etc/fstab #追加内容 10.2.4.51:/home/nfs_data /home/nfs_data/ nfs sync,noac 0 0

3 文件实时监听同步

3.1 SSH互信配置

主服务器和从服务分别生成自己的公钥,命令如下

bash 复制代码
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa  # 生成证书
cd ~/.ssh/ #切换目录
touch authorized_keys #生成认证文件
cat id_rsa.pub >>authorized_keys #复制公钥到认证文件
scp authorized_keys 10.2.4.52:/root/.ssh #远程复制自己公钥到对方服务器
service sshd restart #重启SSH服务

主服务器和从服务器 authorized_keys 文件,保存所有需要免密登录 服务器的公钥信息即id_rsa.pub文件中的值

3.2 同步软件安装

主服务器和从服务器同时安装应用包

bash 复制代码
yum -y install inotify-tools 
yum -y install unison #author: herbert qq:464884492

主服务器从服务器在相同路径建立需要实时共享的目录

bash 复制代码
mkdir /home/sync_data

3.3 同步脚本编写

主服务器(10.2.4.51)监听同步脚本,文件名 /home/runfilesync.sh

bash 复制代码
#/bin/bash
dstIp="10.2.4.52"
    src="/home/sync_data"
dst="/home/sync_data"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do
/usr/bin/unison -batch $src ssh://$dstIp/$dst
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done   

从服务器(10.2.4.52)监听同步脚本,文件名 /home/runfilesync.sh

bash 复制代码
#/bin/bash
dstIp="10.2.4.51"
src="/home/sync_data"
dst="/home/sync_data"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do
/usr/bin/unison -batch $src ssh://$dstIp/$dst
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done  

3.4 运行脚本,开机自起

脚本需要后台运行,启动命令如下

bash 复制代码
nohup sh /home/runfilesync.sh & 
ps -aux | grep runfilesync #检查脚本是否在运行
#设置开机启动 author: herbert qq:464884492
crontab -e #追加内容  @reboot  /home/runfilesync.sh

4 效果测试

  1. 在主服务器 /home/nfs_data 和 /home/sync_data 两个文件夹中分别添加touch 地心侠士.txt,然后ssh到从服务,可以在从服务器这两个文件夹中找到地心侠士.text
  2. 在从服务器 /home/nfs_data 和 /home/sync_data 两个文件夹中分别添加touch 小院不小.txt,然后ssh到主服务,可以在主服务器这两个文件夹中找到小院不小.text

5 总结

通过软件或者协议实现实时同步,以上两种方法各有优劣.采用NFS网络共享协议,必须指定一个网络主节点.采用inotify+unison方式,有点分布式的感觉,无需指定主节点,但同步效果方面和稳定性方面会差一些 文件监听同步软件inotifyunison 安装需要编译环境,安装时比较麻烦.我这里提供了rpm安装包以及对应依赖包(安装命令rpm -ivh xxx.rpm).如果需要请关注微信公众号[小院不小 ],回复sync获取下载连接,或者添加QQ:464884492,获取

闲暇之余,做了一款有趣耐玩的消除类微信小游戏地心侠士,有兴趣可到微信搜索地心侠士玩玩,感谢支持

相关推荐
wypywyp1 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
Doro再努力1 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene1 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
忧郁的橙子.1 小时前
02-本地部署Ollama、Python
linux·运维·服务器
醇氧1 小时前
【linux】查看发行版信息
linux·运维·服务器
No8g攻城狮2 小时前
【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤
linux·运维·ubuntu
XiaoFan0122 小时前
免密批量抓取日志并集中输出
java·linux·服务器
souyuanzhanvip3 小时前
ServerBox v1.0.1316 跨平台 Linux 服务器管理工具
linux·运维·服务器
HalvmånEver4 小时前
Linux:线程互斥
java·linux·运维
番茄灭世神4 小时前
Linux应用编程介绍
linux·嵌入式