nfs高可用部署
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 | nfs1 |
node2 | 192.168.56.101 | nfs2 | |
node3 | 192.168.56.102 | 客户端 |
2.1 node1和node2 部署rsync和lsyncd 做双向同步
2.2 node1和node2 部署nfs提供服务
2.3 node1和node2 部署keepalive做虚拟ip
2.4 环境变量准备
主机 | 同步目录 | 同步账号 |
---|---|---|
node1(192.168.56.100) | /home/nfs | root/123456 |
node2(192.168.56.101) | /home/nfs | root/123456 |
node3(192.168.56.102) | /mnt |
3. 部署lsyncd rsync 做双向同步
3.1. 安装
在node1 开放防火墙:
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.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" accept"
firewall-cmd --reload
firewall-cmd --list-all
在node2 开放防火墙:
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.102" accept"firewall-cmd --reload
firewall-cmd --list-all
在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.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"firewall-cmd --reload
firewall-cmd --list-all
创建目录
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
复制代码
修改 rsyncd.conf
#需要互相监听的ip
cp /etc/rsyncd.conf /etc/rsyncd.confbakIP='192.168.56.100 192.168.56.101'
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 = /etc/rsync.password
#允许链接的ip
hosts allow = ${IP}
#hosts deny = x.x.x.x #不允许的ip
EOF
cat /etc/rsyncd.conf
修改 lsyncd.conf
node2(101)机器监听node1(100)
node1(100)机器监听node2(101)
cp /etc/lsyncd.conf /etc/lsyncd.conf bak# 100使用101的目标ip
IP='192.168.56.101'
# 101使用100的目标ip
IP='192.168.56.100'
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/", target = "root@${IP}::backup", -- 删除信息也同步delete = true,-- 延迟15秒同步-- delay = 15,delay = 0,-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为trueinit = false,rsync = {-- rsync服务路径binary = "/usr/bin/rsync", -- 认证文件password_file = "/etc/rsyncd.password", archive = true,compress = false,verbose = false,_extra = {"--bwlimit=200", "--omit-link-times"}}
}
EOF
cat /etc/lsyncd.conf
3.3. 创建备份目录
mkdir -p /home/nfs/
3.4. 创建账号密码
#认证文件,连接的账号密码 中的配置/etc/rsyncd.conf
echo 'root:123456' > /etc/rsync.password
chmod 600 /etc/rsync.password
#查看配置是否成功
cat /etc/rsync.password
## 123456#指定密码,密码注意和上面的密码一致,用户可在命令中设置 /etc/lsyncd.conf中的设置
echo "123456" > /etc/rsyncd.password
chmod 600 /etc/rsyncd.password #设置文件权限
cat /etc/rsyncd.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 status rsyncd #查看服务状态
systemctl restart lsyncd #启动服务
systemctl status lsyncd #查看服务状态cat /var/log/rsyncd.log
3.7. 测试
分别在node1 新增文件 查看node2是否同步
在node2 新增文件查看node1是否同步
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)
EOFcat /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.102,192.168.56.101,192.168.56.100mount -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. 增加检查脚本
vi /home/nfs/package/installKeepalived/check-nfs.sh
#!/bin/bash
count=`netstat -apn | grep 873 | wc -l`
if [ $count -gt 0 ]; then/usr/bin/systemctl status nfs &>/dev/nullif[ $? -ne 0]then/usr/bin/systemctl restart nfs/usr/bin/systemctl status nfs &>/dev/nullif[ $? -ne 0]thenexit 1fiexit 0fiexit 0
elseexit 1
fi
5.3 修改 keepalive配置
vi /etc/keepalived/keepalived.conf
global_defs {router_id LVS_2script_user root # 脚本执行用户enable_script_security # 开启脚本安全权限
}vrrp_script checkNfs
{script "/home/nfs/package/installKeepalived/check-nfs.sh" # 这个地址写的事容器内脚本路径interval 2weight -30
}vrrp_instance VI_1 {state BACKUPinterface enp0s3virtual_router_id 51priority 100advert_int 1nopreemptvirtual_ipaddress {# 需要修改成对应的虚拟ip192.168.56.120}authentication {auth_type PASSauth_pass password}track_script {checkNfs}
}
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.102,192.168.56.101,192.168.56.100mount -t nfs 192.168.56.120:/home/nfs /mnt
cd /mnt
-
node3上/mnt新增文件2.txt 在node1 node2的/home/nfs上都有文件(代表成功)
-
node1或者node2新增文件,node3查看是否存在
-
node1挂掉,在node3新增文件,查看node2是否新增
-
node1重启,看node1是否恢复步骤3的数据
-
node2挂掉,在node3新增文件,查看node1是否新增
-
node1新增文件,查看node3是否新增文件
-
node2重启,看node2是否恢复步骤5的数据
精简
1.在node1 开放防火墙:
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.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" accept"
firewall-cmd --reload
firewall-cmd --list-all
2.在node2 开放防火墙:
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.102" accept"firewall-cmd --reload
firewall-cmd --list-all
3.在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.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"firewall-cmd --reload
firewall-cmd --list-all
4.node1和node2 执行下面的操作
创建目录
mkdir -p /home/nfs && cd /home/nfs
将nfsPackage.zip拷贝到/home/nfs 进行解压
注意备份的目录 /home/nfs
cd /home/nfs/installRsyncLsyncd && bash installRsyncLsyncd.sh
#需要互相监听的ip
cp /etc/rsyncd.conf /etc/rsyncd.confbakIP='192.168.56.100 192.168.56.101'
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 = /etc/rsync.password
#允许链接的ip
hosts allow = ${IP}
#hosts deny = x.x.x.x #不允许的ip
EOF
cat /etc/rsyncd.conf#------------------------------------------------------#
######注意下面的账号密码 默认两台测试机都是root和123456#####
#------------------------------------------------------#
#认证文件,连接的账号密码 中的配置/etc/rsyncd.conf
echo 'root:123456' > /etc/rsync.password
chmod 600 /etc/rsync.password
#查看配置是否成功
cat /etc/rsync.password
## 123456#指定密码,密码注意和上面的密码一致,用户可在命令中设置 /etc/lsyncd.conf中的设置
echo "123456" > /etc/rsyncd.password
chmod 600 /etc/rsyncd.password #设置文件权限
cat /etc/rsyncd.password
5.node1执行
注意备份的目录 /home/nfs
cp /etc/lsyncd.conf /etc/lsyncd.conf bak
# 100使用101的目标ip
IP='192.168.56.101'
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/", target = "root@${IP}::backup", -- 删除信息也同步delete = true,-- 延迟15秒同步-- delay = 15,delay = 0,-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为trueinit = false,rsync = {-- rsync服务路径binary = "/usr/bin/rsync", -- 认证文件password_file = "/etc/rsyncd.password", archive = true,compress = false,verbose = false,_extra = {"--bwlimit=200", "--omit-link-times"}}
}
EOF
cat /etc/lsyncd.conf
6.node2执行
注意备份的目录 /home/nfs
cp /etc/lsyncd.conf /etc/lsyncd.conf bak
# 100使用101的目标ip
IP='192.168.56.100'
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/", target = "root@${IP}::backup", -- 删除信息也同步delete = true,-- 延迟15秒同步-- delay = 15,delay = 0,-- false代表启动服务前的内容不会同步,如想设置为true,删掉即可,不要配置为trueinit = false,rsync = {-- rsync服务路径binary = "/usr/bin/rsync", -- 认证文件password_file = "/etc/rsyncd.password", archive = true,compress = false,verbose = false,_extra = {"--bwlimit=200", "--omit-link-times"}}
}
EOF
cat /etc/lsyncd.conf
7.node1 和node2执行
systemctl restart rsyncd #启动服务
systemctl status rsyncd #查看服务状态
systemctl restart lsyncd #启动服务
systemctl status lsyncd #查看服务状态
8.node1和node2安装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)
EOFcat /etc/exports
# 启动
systemctl start nfs
systemctl enable nfs
9.node1和node2安装Keepalived
cd /home/nfs/installKeepalived && chmod +x installKeepalived.sh && ./installKeepalived.shcp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.confbak cat > /etc/keepalived/keepalived.conf << EOF
global_defs {router_id LVS_2script_user root # 脚本执行用户enable_script_security # 开启脚本安全权限
}vrrp_script checkNfs
{script "/home/nfs/installKeepalived/check-nfs.sh" # 这个地址写的事容器内脚本路径interval 2weight -30
}vrrp_instance VI_1 {state BACKUPinterface enp0s3virtual_router_id 51priority 100advert_int 1nopreemptvirtual_ipaddress {# 需要修改成对应的虚拟ip192.168.56.120}authentication {auth_type PASSauth_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"
10.测试(node3)
# 客户端测试
cd /home/nfs/installNfs && bash installNfs.sh
showmount -e 192.168.56.120
#Export list for 192.168.56.120:
#/home/nfs 192.168.56.102,192.168.56.101,192.168.56.100mount -t nfs 192.168.56.120:/home/nfs /mnt
cd /mnt
-
node3上/mnt新增文件2.txt 在node1 node2的/home/nfs上都有文件(代表成功)
-
node1或者node2新增文件,node3查看是否存在
-
node1挂掉,在node3新增文件,查看node2是否新增
-
node1重启,看node1是否恢复步骤3的数据
-
node2挂掉,在node3新增文件,查看node1是否新增
-
node1新增文件,查看node3是否新增文件
-
node2重启,看node2是否恢复步骤5的数据