因为某系统需要部署生产,但是云平台的nas存储资源不足需要重新采购,采购周期较长,需要有一个临时的解决方案,这样时候就需要采用nfs服务来提供网络存储服务了,在部署nfs服务的时候需要考虑生产环境需要有一定的高可用性,经过考虑之后设计为采用keepalived作为的高可用性方案,同时两个nfs节点前面购买一个VIP对外提供服务。
序号 | 服务器地址 | Vip |
1 | 192.99.27.34(master) | 192.99.27.36 |
2 | 192.99.27.35(slave) |
考虑到前期系统使用到存储空间较小,后期使用的存储空间较大,所以这里先申请500G的空间并且是使用lvm制作挂载目录,这样后期空间扩容的时候比较好处理,并且是支持在线扩容的操作。
注:如下的操作需要在两个节点都是一样的操作,切记。如果是有区分的会进行特殊的说明的。
[root@~ /]# mkdir /data
2. 制作lvm存储
这里直接是挂载了一个vdb的500G磁盘的,直接整个磁盘制作lvm即可
[root@~ /]# pvcreate /dev/vdb
[root@~ /]# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb data lvm2 a-- <500.00g 1020.00m
[root@~ /]# vgcreate -n data /dev/vdb
VG #PV #LV #SN Attr VSize VFree
data 1 1 0 wz--n- <500.00g 1020.00m
[root@~ /]# lvcreate -n data data-L 499G
[root@~ /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data data -wi-ao---- 499.00g
[root@~ /]# mkfs.xfs /dev/data/data
[root@~ /]# vim /etc/fstab
/dev/data/data /data xfs defaults 0 0
[root@~ /]# mount -a
[root@~ /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-data 499G 33M 499G 1% /data
[root@~ /]# yum -y install nfs-utils rpcbind
.............
[root@~ /]# rpm -qa | grep nfs
libnfsidmap-0.25-19.el7.x86_64
nfs-utils-1.3.0-0.68.el7.2.x86_64
[root@~ /]# rpm -qa | grep rpcbind
rpcbind-0.2.0-49.el7.x86_64
[root@~ /]# systemctl start rpcbind && systemctl start nfs
[root@~ /]# systemctl enable rpcbind && systemctl enable nfs
[root@~ /]# systemctl status nfs
[root@~ /]# systemctl status rpcbind
[root@~ /]# systemctl status firewalld
[root@~ /]# getenforce
Disabled
[root@~ /]# vim /etc/exports
/data 192.99.207.0/24(rw,sync,all_squash)
[root@~ /]# systemctl restart rpcbind && systemctl restart nfs
注:如下的操作是在192.99.27.34(master)上操作的。
按照同步服务
[root@~ /]# yum -y install rsync.x86_64
......
创建同步用户
[root@~ /]# useradd data
[root@~ /]# echo data123 | passwd --stdin data
配置rsync配置文件
[root@~ /]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /data
auth users = data
secrets file = /etc/rsync_master.pass
hosts allow = 192.99.27.35
配置认证文件
[root@~ /]# echo 'data:data123' > /etc/rsync_master.pass
[root@~ /]# chmod 600 /etc/rsync_master.pass
设置权限
[root@~ /]# chown -R nfsnobody:nfsnobody /data/
启动rsync服务
[root@~ /]# rsync --daemon --config=/etc/rsyncd.conf
[root@~ /]# ps -ef | grep rsync
root 19899 1 0 Oct10 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
注:如下的操作在192.99.27.35(slave)上操作
[root@~ /]# yum -y install rsync.x86_64
[root@~ /]# chown -R nfsnobody:nfsnobody /kingdee
配置认证文件
[root@~ /]# echo "data123" > /etc/rsync.pass
[root@~ /]# chmod 600 /etc/rsync.pass
[root@~ /]# cd /data
[root@~ /]# echo "This is test file" > file.2.txt
同步文件
[root@~ /]# rsync -arv /data/ data@100.99.207.34::data --password-file=/etc/rsync.pass
注:如下的操作在192.99.27.34(master)上操作验证
[root@~ /]# cd /data && ll
total 8
-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.2.txt
[root@~ data]# cat file.2.txt
This is test file
注:如下的操作是在192.99.27.35(slave)上操作的。
按照同步服务
[root@~ /]# yum -y install rsync.x86_64
......
创建同步用户
[root@~ /]# useradd data
[root@~ /]# echo data123 | passwd --stdin data
配置rsync配置文件
[root@~ /]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /data
auth users = data
secrets file = /etc/rsync_master.pass
hosts allow = 192.99.27.34
配置认证文件
[root@~ /]# echo 'data:data123' > /etc/rsync_master.pass
[root@~ /]# chmod 600 /etc/rsync_master.pass
设置权限
[root@~ /]# chown -R nfsnobody:nfsnobody /data/
启动rsync服务
[root@~ /]# rsync --daemon --config=/etc/rsyncd.conf
[root@~ /]# ps -ef | grep rsync
root 1984 1 0 Oct10 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
注:如下的操作在192.99.27.34(master)上操作
[root@~ /]# yum -y install rsync.x86_64
[root@~ /]# chown -R nfsnobody:nfsnobody /data
配置认证文件
[root@~ /]# echo "data123" > /etc/rsync.pass
[root@~ /]# chmod 600 /etc/rsync.pass
[root@~ /]# cd /kingdee
[root@~ /]# echo "This is test file 1" > file.1.txt
同步文件
[root@~ /]# rsync -arv /data/ data@100.99.207.35::data --password-file=/etc/rsync.pass
注:如下的操作在192.99.27.35(slave)上操作验证
[root@~ /]# cd /data && ll
total 8
-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.1.txt
-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.2.txt
[root@~ data]# cat file.1.txt
This is test file 1
以上就完成了nfs的双向同步,但是这里有一个缺点就是,无法做到双向的自动同步,只能是手工的执行,这样的话会出现了两边数据不一致而导致,业务阻断,这样是有需要配置一下自动同步的功能。
将附件上的包上传到/usr/local目录下
注:如下的操作在192.99.27.34(master)上操作验证
[root@~ kingdee]# cd /usr/local
[root@~ local]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@~ local]# mv GNU-Linux-x86/ sersync
[root@~ local]# cd sersync/
修改配置文件
[root@~sersync]# sed -ri '24s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '25s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '30s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '31s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '33s#
# #g' confxml.xml
#启动Sersync
[root@~ sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
注:如下的操作在192.99.27.35(slave)上操作验证
[root@~ kingdee]# cd /usr/local
[root@~ local]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@~ local]# mv GNU-Linux-x86/ sersync
[root@~ local]# cd sersync/
修改配置文件
[root@~ sersync]# sed -ri '24s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '25s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '30s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '31s#
# #g' confxml.xml
[root@~ sersync]# sed -ri '33s#
# #g' confxml.xml
#启动Sersync
[root@~ sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
在master节点上/kingdee目录下创建目录、创建文件、修改文件内容、重命名文件、删除文件、删除文件夹、删除文件内容都能自动同步到slave节点的/kingdee目录下。具体操作这里就不能写了,自行进行验证。
Nfs提供高可用性需要部署一个keepalived来的来提供一个vip,客户端通过这个vip来访问nfs存储。这里需要去申请一个vip地址,这个vip绑定了192.99.27.34,192.99.27.35两个服务器地址。
注:如下的操作在192.99.27.34(master)上操作验证
[root@~ ]# yum install -y keepalived
配置keepalived配置文件
[root@~ ]# cd /etc/keepalived/
先备份keepalived.conf文件
[root@keepalived ]# cp keepalived.conf keepalived.conf_back20221026
[root@keepalived ]# vim keepalived.conf
配置内容如下:
! Configuration File for keepalived
vrrp_script chk_process {
script "/etc/keepalived/check_process.sh"
interval 10
weight 2
}
global_defs {
notification_email {
sys_ft_mw_adm@cmft.com
}
notification_email_from sys_ft_mw_adm@cmft.com
smtp_server mail.cmft.com
smtp_connect_timeout 30
router_id CMFT_WEB
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 53
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass cmft_web
}
track_script {
#run the script
chk_process
}
virtual_ipaddress {
192.99.27.36
}
}
配置keepalived依赖进程的检查脚本
[root@keepalived ]# vim check_process.sh
#!/bin/bash
#间隔的秒数,不能大于60
step=1
for (( i = 0; i < 60; i=(i+step) ));
do
###检查nfs可用性:进程和是否能够挂载
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
###如果服务状态不正常,先尝试重启服务
systemctl restart nfs
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
# 如服务仍不正常,停止 keepalived
systemctl stop keepalived.service
fi
fi
sleep $step
Done
[root@keepalived ]# systemctl start keepalived
[root@keepalived ]# systemctl enable keepalived
注:如下的操作在192.99.27.35(slave)上操作验证
[root@~ ]# yum install -y keepalived
配置keepalived配置文件
[root@~ ]# cd /etc/keepalived/
先备份keepalived.conf文件
[root@keepalived ]# cp keepalived.conf keepalived.conf_back20221026
[root@keepalived ]# vim keepalived.conf
配置内容如下:
! Configuration File for keepalived
vrrp_script chk_process {
script "/etc/keepalived/check_process.sh"
interval 10
weight 2
}
global_defs {
notification_email {
sys_ft_mw_adm@cmft.com
}
notification_email_from sys_ft_mw_adm@cmft.com
smtp_server mail.cmft.com
smtp_connect_timeout 30
router_id CMFT_WEB
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 53
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass cmft_web
}
track_script {
#run the script
chk_process
}
virtual_ipaddress {
192.99.27.36
}
}
配置keepalived依赖进程的检查脚本
[root@keepalived ]# vim check_process.sh
#!/bin/bash
#间隔的秒数,不能大于60
step=1
for (( i = 0; i < 60; i=(i+step) ));
do
###检查nfs可用性:进程和是否能够挂载
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
###如果服务状态不正常,先尝试重启服务
systemctl restart nfs
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
# 如服务仍不正常,停止 keepalived
systemctl stop keepalived.service
fi
fi
sleep $step
Done
[root@keepalived ]# systemctl start keepalived
[root@keepalived ]# systemctl enable keepalived
[root@ keepalived]# cat /etc/services | grep nfs
nfs 2049/tcp nfsd shilp # Network File System
nfs 2049/udp nfsd shilp # Network File System
nfs 2049/sctp nfsd shilp # Network File System
注:所以客户端访问nfs需要开墙到nfs服务端的2049端口即可