nfs高可用部署
nfs高可用部署(lsyncd两主机双向同步)
nfs高可用部署(lsyncd三主机三向同步)
1. 工具简介
1.1. rsync
rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。rsync 通过比较两边文件是否相同,不相同才进行更新。
但是rsync无法知道“什么时候同步”,因为rsync只有执行同步命令的时候,才会去扫描文件判断哪些文件被修改了,只能建立一个定时任务,每隔一定的时间(比如5分钟,10分钟等等)去执行一次同步,这样虽然能同步,但却“不实时”。
1.2. lsyncd
lsyncd实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 -通过时间延迟或累计触发事件次数实现。
1.3. nfs
NFS(Network File System,网络文件系统)是众多文件共享协议之一,最初是由 Sun Microsystems 公司于 1984 年开发出来的。
由于 NFS 使用起来非常方便,因此在 UNIX 操作系统中被广泛使用。现在,许多非 UNIX 或非类 UNIX 操作系统也对 NFS 提供了支持。
NFS 的配置和使用其实都非常简单,但是它的工作原理和其他的文件共享协议又有所不同,我们有必要了解一下。
2. 环境准备
虚拟ip | 主机 | IP | 同步目录 | 同步账号 | 功能 |
---|---|---|---|---|---|
192.168.56.120 | node1 | 192.168.56.100 | /home/nfs | root/123456100 | nfs1 |
node2 | 192.168.56.101 | /home/nfs | root/123456101 | nfs2 | |
node3 | 192.168.56.102 | /home/nfs | root/123456102 | nfs3 | |
node4 | 192.168.56.103 | /mnt | 客户端测试 |
可以用passwd进行密码修改(方便区分下面的配置文件)
设置主机名 hostnamectl set-hostname node3 && bash
2.1 node1,node2,node3 部署rsync和lsyncd 做三向同步
2.2 node1,node2,node3 部署nfs提供服务
2.3 node1,node2,node3 部署keepalive做虚拟ip
3. 部署lsyncd rsync 做双向同步
3.1. 安装
在所有节点 开放防火墙(具体的ip不细究,当前4台互通即可):
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux
#刷新配置,立即生效
setenforce 0
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" accept"
firewall-cmd --reload
firewall-cmd --list-all
node1,node2,node3 创建目录
mkdir -p /home/nfs && cd /home/nfs
方式一(在线)后续步骤以此为基础:
yum install -y epel-release
#安装
yum install -y rsync lsyncd
#yum install --downloadonly --downloaddir=/root/rsyncLsyncd rsync lsyncd
#rpm -Uvh ./*
systemctl start rsyncd
systemctl start lsyncd
systemctl enable lsyncd
systemctl enable rsyncd
#验证是否启动
ps -aux |grep rsync
#root 2470 0.0 0.0 114748 1028 ? Ss 08:45 0:00 /usr/bin/rsync --daemon --no-detach
#查看监听端口状态
netstat -an |grep 873
#tcp4 0 0 *.873 *.* LISTEN
3.2. 修改配置
#默认lsyncd配置文件路径
/etc/lsyncd.conf
#默认lsyncd日志路径,使用yum安装会自动配置日志截断,不须要额外干预
/var/log/lsyncd/lsyncd.log
#默认的rsync路径
/etc/rsyncd.conf
#默认的rsync日志路径
/var/log/messages
复制代码
创建账号
# node1执行
#认证文件,连接的账号密码 中的配置/etc/rsyncNode1.conf
echo 'root:123456100' > /etc/rsyncNode1.password
#查看配置是否成功
cat /etc/rsyncNode1.password
# node2执行
#认证文件,连接的账号密码 中的配置/etc/rsyncNode2.conf
echo 'root:123456101' > /etc/rsyncNode2.password
#查看配置是否成功
cat /etc/rsyncNode2.password
# node3执行
#认证文件,连接的账号密码 中的配置/etc/rsyncNode3.conf
echo 'root:123456102' > /etc/rsyncNode3.password
#查看配置是否成功
cat /etc/rsyncNode3.password
修改 rsyncd.conf
#需要互相监听的ip
cp /etc/rsyncd.conf /etc/rsyncd.confbak
IP='192.168.56.100 192.168.56.101 192.168.56.102'
#IPPassword='/etc/rsyncNode1.password'
#IPPassword='/etc/rsyncNode2.password'
IPPassword='/etc/rsyncNode3.password'
cat > /etc/rsyncd.conf << EOF
#日志路径
log file = /var/log/rsyncd.log
pidfile = /run/rsyncd.pid
lock file = /run/rsync.lock
#模块名称,有多个源服务端时就在下面复制整个模块
[backup]
#存储接收数据的路径
path = /home/nfs/
comment = sync etc from client
# 其他账号注意这个
uid = root
# 其他账号注意这个
gid = root
port = 873
ignore errors
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
#认证用户,同认证文件里的
# 其他账号注意这个
auth users = root
# 其他账号注意这个
#认证文件,连接的账号密码(当前主机的账号密码)
secrets file = ${IPPassword}
#允许链接的ip
hosts allow = ${IP}
#hosts deny = x.x.x.x #不允许的ip
EOF
cat /etc/rsyncd.conf
node1
node2
node3
修改 lsyncd.conf
node1(100)机器监听node2(101)
node1(100)机器监听node3(102)
node2(101)机器监听node1(100)
node2(101)机器监听node3(102)
node3(102)机器监听node1(100)
node3(102)机器监听node2(101)
cp /etc/lsyncd.conf /etc/lsyncd.conf bak
# 100使用101的目标ip
IP1='192.168.56.100'
IP1Password='/etc/rsyncdNode1.password'
# 100使用102的目标ip
IP2='192.168.56.101'
IP2Password='/etc/rsyncdNode2.password'
cat > /etc/lsyncd.conf << EOF
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
--
-- 具体参数含义可自行百度
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
-- 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
-- maxDelays = 5,
nodaemon = false,
}
-- 如果有多台服务器需要同步,依次往下配置多个sync即可
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP1}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP1Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP2}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP2Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
EOF
cat /etc/lsyncd.conf
node1
node2
node3
3.3. 创建备份目录
mkdir -p /home/nfs/
3.4. 创建账号密码
#三台都可以执行
#指定密码,密码注意和上面的密码一致,用户可在命令中设置 /etc/lsyncd.conf中的设置
echo "123456100" > /etc/rsyncdNode1.password
cat /etc/rsyncdNode1.password
echo "123456101" > /etc/rsyncdNode2.password
cat /etc/rsyncdNode2.password
echo "123456102" > /etc/rsyncdNode3.password
cat /etc/rsyncdNode3.password
3.5. 设置文件权限
chmod 600 /etc/rsync*
ll /etc/rsync*
## -rw-------. 1 root root 880 Aug 13 14:54 /etc/rsyncd.conf
## -rw-------. 1 root root 10 Aug 13 14:55 /etc/rsync.password
3.6. 重启服务
systemctl restart rsyncd #启动服务
systemctl restart lsyncd #启动服务
systemctl status lsyncd #查看服务状态
systemctl status rsyncd #查看服务状态
cat /var/log/rsyncd.log
3.7. 测试
分别/home/nfs 目录在node1 新增或者删除文件 查看node2,node3是否同步
在node2 新增或者删除文件查看node1,node3是否同步
在node3 新增或者删除文件查看node1,node2是否同步
4. 部署nfs提供服务
4.1. nfs实现的原理
本地文件操作方式
1.当用户执行mkdir命令,BashShell无法完成该命令操作,会将其翻译给内核。
2.Kernel内核解析完成后会驱动对应的磁盘设备,完成创建目录的操作。
NFS实现原理(需要先了解[程序|进程|线程])
1.NFS客户端执行增、删等操作,客户端会使用不同的函数对该操作进行封装。
2.NFS客户端会通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩。
7.最后NFS服务端会将客户端的函数转换为本地能执行的命令,然后将命令传递至内核,由内核驱动硬件。
注意: rpc是一个远程过程调用,那么使用nfs必须有rpc服务
4.2 安装、配置、nfs服务
yum install nfs-utils -y
#yum install --downloadonly --downloaddir=/root/nfs nfs-utils
#rpm -Uvh ./*
# 配置
# 1.要共享什么 /home/nfs
# 2.共享给谁 172.16.1.0/24 网段
# 3.共享的权限
# id root 查询root的id
cat > /etc/exports << EOF
/home/nfs 192.168.56.100(rw,sync,all_squash,anonuid=0,anongid=0)
/home/nfs 192.168.56.101(rw,sync,all_squash,anonuid=0,anongid=0)
/home/nfs 192.168.56.102(rw,sync,all_squash,anonuid=0,anongid=0)
/home/nfs 192.168.56.103(rw,sync,all_squash,anonuid=0,anongid=0)
EOF
cat /etc/exports
# 启动
systemctl start nfs
systemctl enable nfs
4.3 客户端测试
# 客户端测试
yum install nfs-utils -y
showmount -e 192.168.56.100
# Export list for 192.168.56.100:
# /home/nfs 192.168.56.103,192.168.56.102,192.168.56.101,192.168.56.100
mount -t nfs 192.168.56.100:/home/nfs /mnt
4.4 nfs 参数
rw* 读写权限
ro 只读权限
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
no_all_squash 无论NFS客户端使用什么账户访问,都不进行压缩 (云计算)
sync* 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
anonuid* 配置all_squash使用,指定NFS的用户UID,必须存在系统 id root
anongid* 配置all_squash使用,指定NFS的用户UID,必须存在系统 id root
4.5.实现开机自动挂载
cat /etc/fstab
192.168.56.100:/home/nfs /mnt nfs defaults 0 0
mount -a
df -h
#文件系统 容量 已用 可用 已用% 挂载点
#192.168.56.100:/home/nfs 100G 1.8G 99G 2% /mnt
NFS存储优点
- NFS简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
- NFS的数据都在文件系统之上,所有数据都是能看得见。
NFS存储局限
- 存在单点故障, 如果构建高可用维护麻烦web->nfs()->backupglusterfs
- NFS数据都是明文, 并不对数据做任何校验,也没有密码验证(强烈建议内网使用)。
NFS应用建议
- 生产场景应将静态数据(jpg\png\mp4\avi\css\js)尽可能放置CDN场景进行环境, 以此来减少后端存储压力
- 如果没有缓存或架构、代码等,本身历史遗留问题太大,在多存储也没意义存储不能带来性能上的提升
5. 部署keepalive做虚拟ip
5.1. 安装依赖
yum install -y openssl openssl-devel
离线 下载安装包
yum install --downloadonly --downloaddir=/root/opensslPackage openssl openssl-devel
安装
rpm -Uvh /root/opensslPackage/*
安装keepalive
mkdir -p /home/pxc/keepalived
curl -o /home/pxc/keepalived/keepalived-2.2.4.tar.gz https://keepalived.org/software/keepalived-2.2.4.tar.gz
tar -zxf /home/pxc/keepalived/keepalived-2.2.4.tar.gz -C /home/pxc/keepalived/
cd /home/pxc/keepalived/keepalived-2.2.4
./configure --sysconf=/etc --prefix=/usr/local make && make install
5.2. 增加检查脚本
mkdir -p /home/nfs/package/installKeepalived
cat > /home/nfs/package/installKeepalived/check-nfs.sh << EOF
#!/bin/bash
count=`netstat -apn | grep 873 | wc -l`
if [ $count -gt 0 ]; then
/usr/bin/systemctl status nfs &>/dev/null
if[ $? -ne 0]
then
/usr/bin/systemctl restart nfs
/usr/bin/systemctl status nfs &>/dev/null
if[ $? -ne 0]
then
exit 1
fi
exit 0
fi
exit 0
else
exit 1
fi
EOF
5.3 修改 keepalive配置
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.confbak
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
router_id LVS_2
script_user root # 脚本执行用户
enable_script_security # 开启脚本安全权限
}
vrrp_script checkNfs
{
script "/home/nfs/installKeepalived/check-nfs.sh" # 这个地址写的事容器内脚本路径
interval 2
weight -30
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
nopreempt
virtual_ipaddress {
# 需要修改成对应的虚拟ip
192.168.56.120
}
authentication {
auth_type PASS
auth_pass password
}
track_script {
checkNfs
}
}
EOF
5.4 启动
service keepalived start
5.5 设置开机自启
chkconfig keepalived on
systemctl list-unit-files | grep keepalived
systemctl status keepalived
查看日志
tail -f /var/log/messages
可以通过连接192.168.56.120 进行挂载了
6.测试(node3)
# 客户端测试
yum install nfs-utils -y
showmount -e 192.168.56.120
#Export list for 192.168.56.120:
#/home/nfs 192.168.56.103,192.168.56.102,192.168.56.101,192.168.56.100
mount -t nfs 192.168.56.120:/home/nfs /mnt
cd /mnt
-
node4上/mnt新增文件2.txt 在node1 node2 node3的/home/nfs上都有文件(代表成功)
-
node1或者node2或者node3新增文件,node4查看是否存在
-
node1挂掉,在node4新增文件,查看node2,node1是否新增
-
node1重启,看node1是否恢复步骤3的数据
-
node2挂掉,在node4新增文件,查看node1,node3是否新增
-
node1新增文件,查看node4,node3是否新增文件
-
node2重启,看node2是否恢复步骤5的数据
精简
链接:https://pan.baidu.com/s/1zXQ2k1xNXx1RwEMGik_o8g?pwd=zbr4
虚拟ip | 主机 | IP | 同步目录 | 同步账号 | 功能 |
---|---|---|---|---|---|
192.168.56.120 | node1 | 192.168.56.100 | /home/nfs | root/123456100 | nfs1 |
node2 | 192.168.56.101 | /home/nfs | root/123456101 | nfs2 | |
node3 | 192.168.56.102 | /home/nfs | root/123456102 | nfs3 | |
node4 | 192.168.56.103 | /mnt | 客户端测试 |
可以用passwd进行密码修改(方便区分下面的配置文件)
设置主机名 hostnamectl set-hostname node3 && bash
1.在node1,node2,node3 开放防火墙:
sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux
#刷新配置,立即生效
setenforce 0
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.103" accept"
firewall-cmd --reload
firewall-cmd --list-all
2.node1执行下面的操作
创建目录
mkdir -p /home/nfs && cd /home/nfs
将nfs3Package.zip拷贝到/home/nfs 进行解压
注意备份的目录 /home/nfs
cd /home/nfs/installRsyncLsyncd && bash installRsyncLsyncd.sh
# 修改/etc/rsyncd.conf
cp /etc/rsyncd.conf /etc/rsyncd.confbak
#需要互相监听的ip
IP='192.168.56.100 192.168.56.101 192.168.56.102'
IPPassword='/etc/rsyncNode1.password'
cat > /etc/rsyncd.conf << EOF
#日志路径
log file = /var/log/rsyncd.log
pidfile = /run/rsyncd.pid
lock file = /run/rsync.lock
#模块名称,有多个源服务端时就在下面复制整个模块
[backup]
#存储接收数据的路径
path = /home/nfs/
comment = sync etc from client
# 其他账号注意这个
uid = root
# 其他账号注意这个
gid = root
port = 873
ignore errors
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
#认证用户,同认证文件里的
# 其他账号注意这个
auth users = root
# 其他账号注意这个
#认证文件,连接的账号密码(当前主机的账号密码)
secrets file = ${IPPassword}
#允许链接的ip
hosts allow = ${IP}
#hosts deny = x.x.x.x #不允许的ip
EOF
cat /etc/rsyncd.conf
#认证文件,连接的账号密码 中的配置/etc/rsyncNode1.conf
echo 'root:123456100' > /etc/rsyncNode1.password
#查看配置是否成功
cat /etc/rsyncNode1.password
#指定密码,密码注意和上面的密码一致,用户可在命令中设置 /etc/lsyncd.conf中的设置
echo "123456100" > /etc/rsyncdNode1.password
cat /etc/rsyncdNode1.password
echo "123456101" > /etc/rsyncdNode2.password
cat /etc/rsyncdNode2.password
echo "123456102" > /etc/rsyncdNode3.password
cat /etc/rsyncdNode3.password
# 设置文件权限
chmod 600 /etc/rsync*
ll /etc/rsync*
## -rw-------. 1 root root 880 Aug 13 14:54 /etc/rsyncd.conf
## -rw-------. 1 root root 10 Aug 13 14:55 /etc/rsync.password
# 修改/etc/lsyncd.conf
cp /etc/lsyncd.conf /etc/lsyncd.confbak
# 100使用101的目标ip
IP1='192.168.56.101'
IP1Password='/etc/rsyncdNode2.password'
# 100使用102的目标ip
IP2='192.168.56.102'
IP2Password='/etc/rsyncdNode3.password'
cat > /etc/lsyncd.conf << EOF
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
--
-- 具体参数含义可自行百度
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
-- 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
-- maxDelays = 5,
nodaemon = false,
}
-- 如果有多台服务器需要同步,依次往下配置多个sync即可
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP1}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP1Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP2}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP2Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
EOF
cat /etc/lsyncd.conf
3.node2执行下面的操作
创建目录
mkdir -p /home/nfs && cd /home/nfs
将nfs3Package.zip拷贝到/home/nfs 进行解压
注意备份的目录 /home/nfs
cd /home/nfs/installRsyncLsyncd && bash installRsyncLsyncd.sh
# 修改/etc/rsyncd.conf
cp /etc/rsyncd.conf /etc/rsyncd.confbak
#需要互相监听的ip
IP='192.168.56.100 192.168.56.101 192.168.56.102'
IPPassword='/etc/rsyncNode2.password'
cat > /etc/rsyncd.conf << EOF
#日志路径
log file = /var/log/rsyncd.log
pidfile = /run/rsyncd.pid
lock file = /run/rsync.lock
#模块名称,有多个源服务端时就在下面复制整个模块
[backup]
#存储接收数据的路径
path = /home/nfs/
comment = sync etc from client
# 其他账号注意这个
uid = root
# 其他账号注意这个
gid = root
port = 873
ignore errors
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
#认证用户,同认证文件里的
# 其他账号注意这个
auth users = root
# 其他账号注意这个
#认证文件,连接的账号密码(当前主机的账号密码)
secrets file = ${IPPassword}
#允许链接的ip
hosts allow = ${IP}
#hosts deny = x.x.x.x #不允许的ip
EOF
cat /etc/rsyncd.conf
#认证文件,连接的账号密码 中的配置/etc/rsyncNode1.conf
echo 'root:123456101' > /etc/rsyncNode2.password
#查看配置是否成功
cat /etc/rsyncNode2.password
#指定密码,密码注意和上面的密码一致,用户可在命令中设置 /etc/lsyncd.conf中的设置
echo "123456100" > /etc/rsyncdNode1.password
cat /etc/rsyncdNode1.password
echo "123456101" > /etc/rsyncdNode2.password
cat /etc/rsyncdNode2.password
echo "123456102" > /etc/rsyncdNode3.password
cat /etc/rsyncdNode3.password
# 设置文件权限
chmod 600 /etc/rsync*
ll /etc/rsync*
## -rw-------. 1 root root 880 Aug 13 14:54 /etc/rsyncd.conf
## -rw-------. 1 root root 10 Aug 13 14:55 /etc/rsync.password
# 修改/etc/lsyncd.conf
cp /etc/lsyncd.conf /etc/lsyncd.confbak
# 100使用101的目标ip
IP1='192.168.56.100'
IP1Password='/etc/rsyncdNode1.password'
# 100使用102的目标ip
IP2='192.168.56.102'
IP2Password='/etc/rsyncdNode3.password'
cat > /etc/lsyncd.conf << EOF
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
--
-- 具体参数含义可自行百度
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
-- 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
-- maxDelays = 5,
nodaemon = false,
}
-- 如果有多台服务器需要同步,依次往下配置多个sync即可
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP1}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP1Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP2}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP2Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
EOF
cat /etc/lsyncd.conf
4.node3执行下面的操作
创建目录
mkdir -p /home/nfs && cd /home/nfs
将nfs3Package.zip拷贝到/home/nfs 进行解压
注意备份的目录 /home/nfs
cd /home/nfs/installRsyncLsyncd && bash installRsyncLsyncd.sh
# 修改/etc/rsyncd.conf
cp /etc/rsyncd.conf /etc/rsyncd.confbak
#需要互相监听的ip
IP='192.168.56.100 192.168.56.101 192.168.56.102'
IPPassword='/etc/rsyncNode3.password'
cat > /etc/rsyncd.conf << EOF
#日志路径
log file = /var/log/rsyncd.log
pidfile = /run/rsyncd.pid
lock file = /run/rsync.lock
#模块名称,有多个源服务端时就在下面复制整个模块
[backup]
#存储接收数据的路径
path = /home/nfs/
comment = sync etc from client
# 其他账号注意这个
uid = root
# 其他账号注意这个
gid = root
port = 873
ignore errors
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
#认证用户,同认证文件里的
# 其他账号注意这个
auth users = root
# 其他账号注意这个
#认证文件,连接的账号密码(当前主机的账号密码)
secrets file = ${IPPassword}
#允许链接的ip
hosts allow = ${IP}
#hosts deny = x.x.x.x #不允许的ip
EOF
cat /etc/rsyncd.conf
#认证文件,连接的账号密码 中的配置/etc/rsyncNode1.conf
echo 'root:123456102' > /etc/rsyncNode3.password
#查看配置是否成功
cat /etc/rsyncNode3.password
#指定密码,密码注意和上面的密码一致,用户可在命令中设置 /etc/lsyncd.conf中的设置
echo "123456100" > /etc/rsyncdNode1.password
cat /etc/rsyncdNode1.password
echo "123456101" > /etc/rsyncdNode2.password
cat /etc/rsyncdNode2.password
echo "123456102" > /etc/rsyncdNode3.password
cat /etc/rsyncdNode3.password
# 设置文件权限
chmod 600 /etc/rsync*
ll /etc/rsync*
## -rw-------. 1 root root 880 Aug 13 14:54 /etc/rsyncd.conf
## -rw-------. 1 root root 10 Aug 13 14:55 /etc/rsync.password
# 修改/etc/lsyncd.conf
cp /etc/lsyncd.conf /etc/lsyncd.confbak
# 100使用101的目标ip
IP1='192.168.56.100'
IP1Password='/etc/rsyncdNode1.password'
# 100使用102的目标ip
IP2='192.168.56.101'
IP2Password='/etc/rsyncdNode2.password'
cat > /etc/lsyncd.conf << EOF
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
--
-- 具体参数含义可自行百度
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
-- 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
-- maxDelays = 5,
nodaemon = false,
}
-- 如果有多台服务器需要同步,依次往下配置多个sync即可
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP1}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP1Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
sync {
default.rsync,
-- 监控的需要备份的目录
source = "/home/nfs/",
-- 其他账号注意这个
-- 需要同步的ip主机的账号密码
target = "root@${IP2}::backup",
-- 删除信息也同步
delete = true,
-- 延迟15秒同步
-- delay = 15,
delay = 0,
-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为true
init = false,
rsync = {
-- rsync服务路径
binary = "/usr/bin/rsync",
-- 其他账号注意这个
-- 认证文件
password_file = "${IP2Password}",
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
EOF
cat /etc/lsyncd.conf
5.node1 ,node2,node3 执行
systemctl restart rsyncd #启动服务
systemctl status rsyncd #查看服务状态
systemctl restart lsyncd #启动服务
systemctl status lsyncd #查看服务状态
6.node1 ,node2,node3安装nfs
cd /home/nfs/installNfs && bash installNfs.sh
cat > /etc/exports << EOF
/home/nfs 192.168.56.100(rw,sync,all_squash,anonuid=0,anongid=0)
/home/nfs 192.168.56.101(rw,sync,all_squash,anonuid=0,anongid=0)
/home/nfs 192.168.56.102(rw,sync,all_squash,anonuid=0,anongid=0)
/home/nfs 192.168.56.103(rw,sync,all_squash,anonuid=0,anongid=0)
EOF
cat /etc/exports
# 启动
systemctl start nfs
systemctl enable nfs
7.node1 ,node2,node3安装Keepalived
cd /home/nfs/installKeepalived && bash installKeepalived.sh
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.confbak
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
router_id LVS_2
script_user root # 脚本执行用户
enable_script_security # 开启脚本安全权限
}
vrrp_script checkNfs
{
script "/home/nfs/installKeepalived/check-nfs.sh" # 这个地址写的事容器内脚本路径
interval 2
weight -30
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
nopreempt
virtual_ipaddress {
# 需要修改成对应的虚拟ip
192.168.56.120
}
authentication {
auth_type PASS
auth_pass password
}
track_script {
checkNfs
}
}
EOF
service keepalived start
systemctl status keepalived
chkconfig keepalived on
systemctl list-unit-files | grep keepalived
ifconfig | grep -C 10 "enp0s3"
8.测试(node4)
# 客户端测试
yum install nfs-utils -y
showmount -e 192.168.56.120
#Export list for 192.168.56.120:
#/home/nfs 192.168.56.103,192.168.56.102,192.168.56.101,192.168.56.100
mount -t nfs 192.168.56.120:/home/nfs /mnt
cd /mnt
-
node4上/mnt新增文件2.txt 在node1 node2 node3的/home/nfs上都有文件(代表成功)
-
node1或者node2或者node3新增文件,node4查看是否存在
-
node1挂掉,在node4新增文件,查看node2,node1是否新增
-
node1重启,看node1是否恢复步骤3的数据
-
node2挂掉,在node4新增文件,查看node1,node3是否新增
-
node1新增文件,查看node4,node3是否新增文件
-
node2重启,看node2是否恢复步骤5的数据
FQA:
1.在容器中使用软链接可以达到文件同步的状态
ln -s [源文件或目录] [目标文件或目录]
rm -ef [软链接名字]
ln -s /home/node1 /home/nfs
ln -s /home/node2 /home/nfs
ln -s /home/node3 /home/nfs
结论:
在容器中使用软链接可以达到文件同步的状态
使用mount挂载的时候会变成真实地址(不建议使用不同的存放路径作为 软连接进行nfs提供服务)