现在的情况是数据库能主从相互同步 但是上传的资源文件并不能同步
(参考自:https://www.jianshu.com/p/95d4fbc5e9a1)
准备环境
主服务器 192.168.3.112
从服务器 192.168.3.118
指定要同步的文件夹 /usr/GRWebResources
配置步骤
安装Objective Caml compiler
主从服务器都要安装
yum install make gcc gcc-c++
cd /usr/local
wget http://caml.inria.fr/pub/distrib/ocaml-4.03/ocaml-4.03.0.tar.gz
tar -zxvf ocaml-4.03.0.tar.gz
cd ocaml-4.03.0
./configure
make world opt
make install
安装Unison
主从服务器都要安装
yum install ctags-etags
cd /usr/local
wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.4.tar.gz
mkdir unison-2.48.4 && cd unison-2.48.4
tar -zxvf /usr/local/unison-2.48.4.tar.gz
cd src
make UISTYLE=text THREADS=true
cp unison /usr/local/bin/
//有版本信息出现则安装成功
unison -version
安装inotify
主从服务器都要安装
mkdir /usr/local/inotify 创建文件夹
cd /usr/local/inotify 进入新建的文件夹
inotify-tools-3.14-8.el7.x86_64.rpm 下载该安装包
上传安装包到inotify目录
rpm -ivh inotify-tools-3.14-8.el7.x86_64.rpm 安装inotify
安装rsync
yum install rsync
配置双机SSH信任
在主服务器192.168.3.112配置
ssh-keygen -t rsa -C "root@服务器ip地址"
//连续按3次enter
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
//给权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
//需要输入一次密码
rsync -avz /root/.ssh/authorized_keys [email protected]:/root/.ssh/authorized_keys
在从服务器192.168.3.118配置
ssh-keygen
//连续按三次enter
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
//给权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
//需要输入一次密码
rsync -avz /root/.ssh/authorized_keys [email protected]:/root/.ssh/authorized_keys
查看双机SSH信任(登录不需要输入密码说明配置成功)
在主服务器上登录从服务器(登录完以后记得exit)
在从服务器上登录主服务器(登录完以后记得exit)
配置双机同步
在主服务器上配置
先进入 /usr/local/unison-2.48.4/src/ 目录
mkdir -p /root/.unison/ 创建文件夹
vim /root/.unison/default.prf 编辑配置文件
#Unison preferences file
//root是配置的两个目录本地和远程,注意远程IP地址后面是两个//
root = /usr/GRWebResources
root = ssh://[email protected]//usr/GRWebResources
batch = true
maxthreads = 300
owner = true
group = true
//使用ssh压缩传输方式
perms = -1
fastcheck = false
//true表示通过文件创建时间来比较两地文件,若为false比较文件的内容
rsync = false
//保持同步过来保持读写权限
sshargs = -C
xferbycopying = true
//默认值是true,表示当需要同步的两个目录一个为空时,unison将停止,这里设置为false,即便为空unison也不会停止运转
confirmbigdel = false
log = true
logfile = /root/.unison/unison.log
在从服务器上配置
先进入 /usr/local/unison-2.48.4/src/ 目录
mkdir -p /root/.unison/ 创建文件夹
vim /root/.unison/default.prf 编辑配置文件
#Unison preferences file
//root是配置的两个目录本地和远程,注意远程IP地址后面是两个//
root = /usr/GRWebResources
root = ssh://[email protected]//usr/GRWebResources
batch = true
maxthreads = 300
owner = true
group = true
//使用ssh压缩传输方式
perms = -1
fastcheck = false
//true表示通过文件创建时间来比较两地文件,若为false比较文件的内容
rsync = false
//保持同步过来保持读写权限
sshargs = -C
xferbycopying = true
//默认值是true,表示当需要同步的两个目录一个为空时,unison将停止,这里设置为false,即便为空unison也不会停止运转
confirmbigdel = false
log = true
logfile = /root/.unison/unison.log
创建脚本文件
两个服务器都要创建.sh脚本
//到usr目录下创建
cd /usr
vim unison.sh
内容如下:
#/bin/bash
src="/usr/GRWebResources/"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do
/usr/local/bin/unison
echo -n "$(date +%F-%T) $line" >> /var/log/inotify.log
done
//让脚本后台执行
#chmod +x unison.sh
#nohup ./unison.sh >/dev/null 2>&1 &
现在我们上传文件到主服务器的/usr/GRWebResources/文件夹 从服务器能自动同步
配置服务器重启后同步仍然能生效
主服务器配置
vim /etc/rc.d/rc.local 编辑开机自启动脚本文件
# 主服务器开始同步从服务器文件
echo "hello" > /usr/GRWebResources/readme
output=`cat /root/.unison/unison.log`
# 执行unison脚本
nohup /usr/unison.sh >/dev/null 2>&1 &
# 再次登录从服务器
ssh -p 22 192.168.15.252
# 在从服务器上也执行一下unison脚本
nohup /usr/unison.sh >/dev/null 2>&1 &
# 退出从服务器
exit
从服务器配置
vim /etc/rc.d/rc.local 编辑开机自启动脚本文件
# login master server
ssh -p 22 192.168.3.112
# clear master server file
echo "" > /root/.unison/ar6b5d1d840377b68d060bd24fc3d85ccf
# exit from master server
exit
# delete useless file
rm -rf /root/.unison/ar6b5d1d840377b68d060bd24fc3d85ccf
# exec backup server command
# clear file why ? https://unix.stackexchange.com/questions/176646/unison-end-of-file-exception
echo "" > /root/.unison/ard3a10332d3dc3e59c9d30404c085a968
# first delete always fail , so I use below method deal with it!!!!!!!!!
echo "hello" > /usr/GRWebResources/readme
经过以上配置 就算服务器重启 文件依然能够同步