centos7部署nfs+keepalived+drbd

一、项目需求描述

     现在使用的架构是nfs+keepalived+rsync+sersync,目前这套架构存在主从nfs节点数据同步不一致问题,大概会有 120s左右的数据延长同步时间,需要提供优化的自动化方案。

二、现有方案缺点

1、切换不能保证主从节点数据一致。

2、客户端需要umount,在从新mount,客户端才能正常读写。

3、sersync+nfs主从节点进行切换时,如果主节点数据没有完全同步到从节点,从节点接管了主节点,sersync在去推送时会导致数据丢失。

4、目前只能单点运行。

三、方案目标

保证业务稳定性和数据的完整性。

四、资源选型

  • 三台centos7.6 4C8G200G规格的机器

  • 规划资源角色

类型

主节点

备节点

VIP地址

客户端

IP

10.241.212.3

10.241.212.4

10.241.212.249

10.241.212.1

角色

keepalived

keepalived

nfs-server

nfs-server

nfs-client

drbd-Primary

drbd-Secondary

  • DRBD90版

五、准备工作

  • 修改主机名称(主备节点两台机器执行)

vim /etc/hosts10.241.212.3 nfs-master10.241.212.4 nfs-backup

  • 设置ssh互信(主节点执行)

ssh-keygen -f ~/.ssh/id_rsa -P '' -qssh-copy-id nfs-backupssh-copy-id nfs-master

  • 关闭防火墙(主备节点两台机器执行)

systemctl stop firewalld && systemctl stop iptablessystemctl disable firewalld && systemctl disable iptables
  • 配置磁盘gpt分区(主备节点两台机器执行)

parted /dev/sdbmklabel gptmkpart primary 0 -1

  • 配置yum源(主备节点两台机器执行)

​
rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpmyum install -y glib2-devel libxml2-devel bzip2-devel flex-devel bison-devel OpenIPMI-devel net-snmp-devel ipmitool ipmiutil ipmiutil-devel asciidoc kernel-devel​
  • 安装drbd、keepalived、nfs软件包(主备节点两台机器执行)

yum -y install drbd90-utils kmod-drbd90 keepalived rpcbind nfs-utils
  • 加载drbd模块(主备节点两台机器执行)

modprobe drbdlsmod |grep drbd

六、DRBD配置(主备节点两台机器执行)

  • 编辑全局配置文件

cat /etc/drbd.d/global_common.conf |egrep -v "^.*#|^$"global {usage-count yes;}common {protocol C;   //采用完全同步复制模式handlers {}startup {wfc-timeout    240;degr-wfc-timeout  240;outdated-wfc-timeout  240;}options {}disk {on-io-error  detach;}net {cram-hmac-alg  md5;shared-secret "testdrbd";}}
  • 编辑资源配置文件

cat > /etc/drbd.d/data.res << EOF
resource data { #资源名称protocol C; #使用协议meta-disk internal;device /dev/drbd0; #DRBD设备名称on nfs-master {disk /dev/sdb1;address 10.241.212.3:7789; #设置DRBD监听地址与端口}on nfs-backup {disk /dev/sdb1;address 10.241.212.4:7789;}
}
EOF

拷贝到备节点

cd /etc/drbd.d
scp data.res global_common.conf root@nfs-bakcup:/etc/drbd.d/
  • 创建DRBD设备激活data资源

mknod /dev/drbd0 b 147 0
[root@nfs-master drbd.d]# ll /dev/drbd0
brw-rw---- 1 root disk 147, 0 Feb 20 14:37 /dev/drbd0
  • 创建drbd设备的元数据

drbdadm create-md data
  • #注:如出现

  • 执行

    dd if=/dev/zero of=/dev/sdb1 bs=1M count=100

    在执行drbdadm create-md data即可

  • 启动drbd服务,并设置开机自启动

systemctl start drbd
systemctl enable drbd
  • 初始化设备同步

#查询主备节点drbd状态
[root@nfs-master drbd.d]# drbdadm status
data role:Secondarydisk:InconsistentSecondary role:Secondarypeer-disk:Inconsistent

#此步骤只能在一个节点上执行(主节点)
drbdadm primary --force data#查看同步进度情况
drbdadm statusdata role:Primarydisk:UpToDateSecondary role:Secondaryreplication:SyncSource peer-disk:Inconsistent done:36.82  //这里有初始化全量同步过程#同步完成情况
drbdadm statusdata role:Primarydisk:UpToDateSecondary role:Secondarypeer-disk:UpToDate    //显示UpToDate/UpToDate 表示主从配置成功

七、挂载DRBD文件系统到目录,主节点操作


#格式化 /dev/drbd0(主备节点均执行)
mkfs.ext4 /dev/drbd0 #创建挂载目录,然后执行DRBD挂载(主备节点均执行)mkdir /data#(主节点执行)
mount /dev/drbd0 /data# 查询挂载情况
df -h Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        3.8G     0  3.8G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           3.9G   28M  3.8G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda3        15G  2.6G   12G  19% /
/dev/sda1      1008M  145M  813M  16% /boot
tmpfs           781M     0  781M   0% /run/user/0
/dev/drbd0      197G   61M  187G   1% /data特别注意:Secondary节点上不允许对DRBD设备进行任何操作,包括只读,所有的读写操作只能在Primary节点上进行。只有当Primary节点挂掉时,Secondary节点才能提升为Primary节点

八、DRBD提升和降级资源测试(手动故障主备切换)

# DBRD的提升和降级资源测试使用以下命令之一手动将aresource’s role从次要角色切换到主要角色(提升)或反之亦然(降级):#创建测试文件cd /data/touch file{1..5}lsfile1  file2  file3  file4  file5#切换测试umount /datadrbdadm secondary data   //切换资源到从节点,主节点降级# 从节点检查drbdadm primary data   //备用节点提权测试#挂载drbd0磁盘mount /dev/drbd0 /data/cd /data/lsfile1  file2  file3  file4  file5  //可以看到数据已经同步#从节点测试是否能够写入数据touch slave-{1..3}lsfile1  file2  file3  file4  file5  slave-1  slave-2  slave-3  //可以写入,说明切换测试正常

九、NFS配置

#编辑nfs配置文件
vim /etc/exports
/data 10.241.212.249/16(rw,sync,no_root_squash)
#启动nfs服务和开机自启
systemctl start rpcbind.service && systemctl enable rpcbind.service       
systemctl start nfs-server.service && systemctl enable nfs-server.service

十、keepalived配置(主配置)

#修改keepalived配置文件
vim keepalived.conf! Configuration File for keepalivedglobal_defs {router_id nfs-master}vrrp_script chk_nfs {script "/etc/keepalived/check_nfs.sh"interval 5
}vrrp_instance VI_1 {state MASTERinterface eth1virtual_router_id 60priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_nfs}notify_stop /etc/keepalived/notify_stop.sh  #当服务停止时执行的脚本   notify_master /etc/keepalived/notify_master.sh  #当切换成主时执行的脚本virtual_ipaddress {10.241.212.249}
}
##启动keepalived服务systemctl start keepalived.service systemctl enable keepalived.service 
#备节点配置:
! Configuration File for keepalivedglobal_defs {router_id nfs-backup
}vrrp_instance VI_1 {state BACKUPinterface eth1virtual_router_id 60priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}notify_master /etc/keepalived/notify_master.sh  #当切换成主时执行的脚本notify_backup /etc/keepalived/notify_backup.sh  #当切换成备时执行的脚本virtual_ipaddress {10.241.212.249}
}##启动keepalived服务systemctl start keepalived.service systemctl enable keepalived.service 
#主节点配置vim /etc/keepalived/check_nfs.sh#!/bin/bash##检查nfs服务可用性:进程和是否能挂载systemctl status nfs-server &> /dev/null  if [ $? -ne 0 ];then    //-ne测试两个整数是否不等,不等为真,相等为假。##如果服务不正常,重启服务systemctl restart nfs-serversystemctl status nfs-server &>/dev/nullif [ $? -ne 0 ];then##若重启后还不正常。卸载drbd0,并降级为备用节点umount /dev/drbd0drbdadm secondary r0##关闭keepalived服务systemctl stop keepalivedfifi#添加权限
chmod 755 /etc/keepalived/check_nfs.sh此脚本只在主节点机器上配置#创建日志目录
mkdir /etc/keepalived/logs# 创建stop脚本
cat notify_stop.sh #!/bin/bashtime=`date "+%F  %H:%M:%S"`echo -e "$time  ------notify_stop------\n" >> /etc/keepalived/logs/notify_stop.logsystemctl stop nfs-server &>> /etc/keepalived/logs/notify_stop.logumount /data &>> /etc/keepalived/logs/notify_stop.logdrbdadm secondary r0 &>> /etc/keepalived/logs/notify_stop.logecho -e "\n" >> /etc/keepalived/logs/notify_stop.log#添加stop脚本权限
chmod 755 /etc/keepalived/notify_stop.sh此脚本在(主备两台机器上都要配置)
#配置master脚本vim notify_master.sh #!/bin/bashtime=`date "+%F  %H:%M:%S"`echo -e "$time  ------notify_master------\n" >> /etc/keepalived/logs/notify_master.logdrbdadm primary r0 &>> /etc/keepalived/logs/notify_master.logmount /dev/drbd0 /data &>> /etc/keepalived/logs/notify_master.logsystemctl restart nfs-server &>> /etc/keepalived/logs/notify_master.logecho -e "\n" >> /etc/keepalived/logs/notify_master.log#配置master脚本权限
chmod 755 /etc/keepalived/notify_master.sh此脚本(只在备节点机器上配置)#创建logs目录
mkdir /etc/keepalived/logs#创建backup脚本
vim notify_backup.sh #!/bin/bashtime=`date "+%F  %H:%M:%S"`echo -e "$time  ------notify_stop------\n" >> /etc/keepalived/logs/notify_backup.logsystemctl stop nfs-server &>> /etc/keepalived/logs/notify_backup.logumount /data &>> /etc/keepalived/logs/notify_backup.logdrbdadm secondary r0 &>> /etc/keepalived/logs/notify_backup.logecho -e "\n" >> /etc/keepalived/logs/notify_backup.log#配置backup权限
chmod 755 /etc/keepalived/notify_backup.sh

十一、NFS客户端挂载测试

#客户端只需要安装rpcbind程序,并确认服务正常
#安装nfs服务依赖和服务包[root@nfsclient ~]# yum -y install rpcbind nfs-utils#创建开机自启动和开启服务[root@nfsclient ~]# systemctl start rpcbind && systemctl enable rpcbind
[root@nfsclient ~]# systemctl start nfs-server && systemctl enable nfs-server#挂载NFSmount -t nfs 10.241.212.249:/data /data[root@localhost data]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              15G  2.4G   12G  18% /
devtmpfs              1.9G     0  1.9G   0% /dev
tmpfs                 1.9G     0  1.9G   0% /dev/shm
tmpfs                 1.9G  196M  1.7G  11% /run
tmpfs                 1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1            1008M  103M  854M  11% /boot
/dev/sdb1              40G   48M   38G   1% /mnt
tmpfs                 378M     0  378M   0% /run/user/0
10.241.212.249:/data  197G   60M  187G   1% /data

十二、高可用环境故障自动切换测试

先关闭主节点主机上的keepalived服务。就会发现VIP资源已经转移到备节点上了。同时,主节点的nfs也会主动关闭,同时备节点会升级为DRBD的主节点

## 停止主节点的keepalived服务systemctl stop keepalived.service #在备节点查看ip情况,是否接管vip地址
[root@nfs-backup ~]# ip a |grep 10.241inet 10.241.212.4/16 brd 10.241.255.255 scope global eth1inet 10.241.212.249/16 scope global secondary eth1#也可以通过var/log/messages 查看日志#查看drbd节点资源状态
[root@nfs-backup ~]# drbdadm status
data role:Primarydisk:UpToDatenfs-master role:Secondarypeer-disk:UpToDate#查询数据情况,确认是否一致
cd /data#刚做了主从切换,现在在primary的节点测试删除数据,观察客户端是否同步rm -rf test-*#登录客户端,进入data目录查看
cd /data
ls#当主节点机器的keepalived服务恢复启动后,VIP资源又会强制夺回来(可以查看/var/log/message系统日志)#并且主节点机器还会再次变为DRBD的主节点
FAQ总结:此套服务不能解决vip切换节点时,nfs服务client端挂载异常问题,还需要在client手动执行umount,重新mount恢复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之std::thread线程

std::thread是C11线程库提供的线程创建。参数绑定的是线程需要调用的函数与参数。 1、如何创建 std::thread th;//空的&#xff0c; std::thread th1([]() { //匿名函数&#xff0c; //执行线程代码 }); void thFun(int k)&#xff1b; std::thread th(thFun,10);// thFun为…

四、分类算法 - 随机森林

目录 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结 sklearn转换器和估算器KNN算法模型选择和调优朴素贝叶斯算法决策树随机森林 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结

【论文阅读】【yolo系列】YOLO-Pose的论文阅读

Abstract 我们介绍YOLO-pose&#xff0c;一种无热图联合检测的新方法&#xff0c;基于流行的YOLO目标检测框架的图像二维多人姿态估计。 【现有方法的问题】现有的基于热图的两阶段方法是次优的&#xff0c;因为它们不是端到端可训练的&#xff0c;训练依赖于surrogate L1 loss…

Linux pageset

1. 引言 在用户进程发生缺页异常时&#xff0c;Linux内核需要分配所需物理页面以及建立也表映射&#xff0c;来维持进程的正常内存使用需求。而对于分配物理页面仅依赖于buddy系统&#xff0c;对于小order页面的分配效率较低。因此Linux通过在每个cpu维护一个page链表&#xff…

12 Autosar_SWS_MemoryMapping.pdf解读

AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费&#xff1a;不同类型的变量&#xff0c;为了对齐造成的空间两份&#xff1b; 1.2 特殊RAM的用途&#xff1a;比如一些变量通过位掩码来获取&#xff0c;如果map到特定RAM可以通过编译器的位掩码…

爬取链家二手房房价数据存入mongodb并进行分析

实验目的 1.使用python将爬虫数据存入mongodb&#xff1b; 2.使用python读取mongodb数据并进行可视化分析。 实验原理 MongoDB是文档数据库&#xff0c;采用BSON的结构来存储数据。在文档中可嵌套其他文档类型&#xff0c;使得MongoDB具有很强的数据描述能力。本节案例使用的…

IP地址定位可以精确到哪里

IP地址定位能够精确到的位置级别取决于多种因素&#xff0c;包括IP地址的分配方式、数据库的质量和更新频率、用户的移动性等。一般而言&#xff0c;IP地址定位可以精确到市级&#xff0c;甚至可以达到街道级别 https://www.ip66.net/?utm-sourceLJ&utm-keyword?1146 但需…

LeetCode494. Target Sum——01背包

文章目录 一、题目二、题解 一、题目 You are given an integer array nums and an integer target. You want to build an expression out of nums by adding one of the symbols ‘’ and ‘-’ before each integer in nums and then concatenate all the integers. For …

大数据在电商领域的典型应用

大数据作为一种新兴的信息技术&#xff0c;是无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据技术是指在数据获取、存储、管理、…

程序媛的mac修炼手册-- 如何彻底卸载Python

啊&#xff0c;前段时间因为想尝试chatgpt的API&#xff0c;需要先创建一个python虚拟环境来安装OpenAI Python library. 结果&#xff0c;不出意外的出意外了&#xff0c;安装好OpenAI Python library后&#xff0c;因为身份认证问题&#xff0c;根本就没有获取API key的权限…

Shader基础的简单实现(基于URP渲染)

一个模型是很多个顶点组成&#xff0c;顶点数据中包含坐标、法线、切线、UV坐标、顶点颜色等等组成。 URP(Universal Render Pipeline)通用渲染管线&#xff0c;是Unity在2019.3版本之后推出的一种新的渲染管线。传统的渲染管线在渲染多光源的情况&#xff0c;是把每一个主要光…

C语言第二十八弹---整数在内存中的存储

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、整数在内存中的存储 2、大小端字节序和字节序 2.1、什么是大小端&#xff1f; 2.2、为什么有大小端? 2.3、练习 2.3.1、练习1 2.3.2、练习2 2.…

Java 注解机制解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么需要happens-before原则&#xff1a; 主要是因为Java内存模型 &#xff0c; 为了提高CPU效率&#xff0c;通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…

Pytorch 复习总结 2

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 线性神经网络。 本文以机器学习中的两大基本问题 —— 回归和分类为例&#xff0c;介绍…

【数据结构初阶 6】二叉树:堆的基本操作 + 堆排序的实现

文章目录 &#x1f308; Ⅰ 二叉树的顺序结构&#x1f308; Ⅱ 堆的概念与性质&#x1f308; Ⅲ 堆的基本操作01. 堆的定义02. 初始化堆03. 堆的销毁04. 堆的插入05. 向上调整堆06. 堆的创建07. 获取堆顶数据08. 堆的删除09. 向下调整堆10. 判断堆空 &#x1f308; Ⅳ 堆的基本…

【selenium】八大元素定位方式|xpath css id name...

目录 一、基础元素定位 二、cssSelector元素定位——通过元素属性定位 三、xpath元素定位——通过路径 1 、xpath绝对定位 &#xff08;用的不多&#xff09; 缺点&#xff1a;一旦页面结构发生变化&#xff08;比如重新设计时&#xff0c;路径少两节&#xff09;&#x…

从计网的角度讲明白什么是网关

网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似&#xff0c;不同的是互连层。网关既可以用于广域网互连&#xff0c;也可以用于局域网互连…

JDBC实现连接池

简单上手 使用 JDBC 来执行 SQL 查询和更新操作 import java.sql.*;public class Main {public static void main(String[] args) {String url "jdbc:mysql://localhost:3306/your_database_name";String username "your_username";String password &…

vs2015零基础编译zlib从失败到成功

本博文源于笔者不断尝试从0编译zlib到能够将文件打包成zip的一个简单过程&#xff0c;其中包含了如何下载zlib&#xff0c;如何编译zlib&#xff0c;如何使用zlib等。内容堪比教科书级别&#xff0c;可以收藏&#xff0c;可以自用&#xff0c;希望博文能帮助到读者。 1、下载z…

Protocol Buffers v21.12 安装 ( linux 系统 )

下载 Protocol Buffers v21.12 Protocol Buffers v21.12 解压 tar zxvf protobuf-cpp-3.21.12.tar.gz执行 进入解压目录&#xff0c;执行下面configure可执行程序&#xff0c;目的是监测安装环境&#xff0c;生成makefile ./configure执行完后可以检查是否生成makefile文件 构…