CentOS7數據庫架構之NFS+heartbeat+DRBD(親測,詳解)


參考文檔

https://blog.51cto.com/732233048/1669417

CentOS 7下安裝配置Heartbeat高可用集群_服務器應用_Linux公社-Linux系統門戶網站
https://www.linuxidc.com/Linux/2019-02/157123.htm

NFS自動掛載_服務器應用_Linux公社-Linux系統門戶網站
https://www.linuxidc.com/Linux/2013-05/84777.htm

1 NFS高可用解決方案之DRBD+heartbeat搭建 - 溫柔易淡 - 博客園
https://www.cnblogs.com/liaojiafa/p/6129499.html

Linux HA集群之DRBD詳解(較全面)

構建Mysql+heartbeat+DRBD+LVS集群應用系統系列之DRBD的搭建
https://www.cnblogs.com/liaojiafa/p/6118425.html

RHEL/CentOS/Fedora各種源(EPEL、Remi、RPMForge、RPMFusion)配置 - AderStep - CSDN博客
https://blog.csdn.net/gatieme/article/details/71056309

CentOS7.5搭建Heartbeat+DRBD+NFS高可用共享存儲-聆聽未來-51CTO博客
https://blog.51cto.com/kerry/2309747?source=dra

error while loading shared libraries解決辦法 - xiangxianghehe的博客 - CSDN博客
https://blog.csdn.net/xiangxianghehe/article/details/79051782

使用heartbeat需要了解的。。 - 學習中間件調優管理監控的專欄 - CSDN博客
https://blog.csdn.net/big1980/article/details/9915547

理論概述

本案例只是,為搭建MySQL集群做准備,並無MySQL

DRBD

DRBD(distributed replicated block device分布式復制塊設備)是一個基於軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲復制解決方案。DRBD是鏡像塊設備,是按數據位鏡像成一樣的數據塊

DRBD可以部署在如下類的底層設備上:
1、一個磁盤,或者是磁盤的某一個分區;
2、一個soft raid 設備;
3、一個LVM的邏輯卷;
4、一個EVMS(Enterprise Volume Management System,企業卷管理系統)的卷;
5、其他任何的塊設備。

工作原理

DRBD需要運行在各個節點上,且是運行在節點主機的內核中,所以DRBD是內核模塊,在Linux2.6.33版本起開始整合進內核。

DRBD工作的位置在文件系統的buffer Cache和磁盤調度器之間

如上圖左節點為活躍節點實線箭頭,有節點為備用節點虛線箭頭。
左節點接收到數據法網內核的數據通路,DRBD在數據通路中注冊鈎子檢查數據(類似ipvs)當檢測到接收的數據是發往自己管理的存儲位置,程序會復制另一份,一份存儲到本機的DRBD存儲設備,另一份就發給TCP/IP協議棧,通過網絡傳輸到另一台節點上TCP/IP協議棧;另一台節點上運行的DRBD模塊同樣在數據通路上監測數據,當檢測到傳輸過來的數據時,運行存儲機制,存儲到本機DRBD存儲設備的對應位置。

如果左節點宕機,在高可用集群中右節點成為活躍節點,並且會接收到左節點宕機的信號,接受數據先保存到本地,左節點恢復上線之后,再把左節點宕機后右節點變動的 數據鏡像到左節點。
每個設備(drbd 提供了不止一個設備)都有一個狀態,可能是‘主’狀態或‘從’態。在主節點上,應用程序應能運行和訪問drbd設備(/dev/drbd)。每次寫入會發往本地磁盤設備和從節點設備中。從節點只能簡單地把數據寫入它的磁盤設上。 讀取數據通常在本地進行。如果主節點發生故障,心跳(heartbeat或corosync)將會把從節點轉換到主狀態,並啟動其上的應用程序。(如果您將它和無日志FS 一起使用,則需要運行fsck)。如果發生故障的節點恢復工作,它就會成為新的從節點,而且必須使自己的內容與主節點的內容保持同步。

復制協議
鏡像過程完成之后還需要返回成功或失敗的回應信息。回應信息可以在傳輸過程中的不同位置返回

協議A
異步復制協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認為是完成的。在一個節點發生故障時,可能發生數據丟失,因為被寫入到遠程節點上的數據可能仍在發送隊列。盡管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點
協議B
內存同步(半同步)復制協議。一旦本地磁盤寫入已完成且復制數據包達到了對等節點則認為寫在主節點上被認為是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因為在傳輸中的數據可能不會被提交到磁盤
協議C
同步復制協議。只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認為完成。沒有任何數據丟失,所以這是一個群集節點的流行模式,但I / O吞吐量依賴於網絡帶寬
一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。為了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議

簡而言之:
A:數據一旦寫入磁盤並發送到本地TCP/IP協議棧,就認為完成了寫入操作
B:數據一旦到達對等節點的TCP/IP協議棧,即收到接受確認就認為完成了寫入操作
C:數據一旦到達對等節點的磁盤,即收到寫入確認就認為完成了寫入操作
協議A性能最好,C數據可靠性最高

架構

Mysql+heartbeat+drbd+lvs是一套成熟的集群解決方案在現在多數企業里面,通過heartbeat+DRBD完成Mysql的主節點寫操作的高可用性,通過Mysql+lvs實現Mysql數據庫的主從復制和Mysql讀寫的負載均衡。這個方案在讀寫方面進行了分離,融合了寫操作的高可用和讀操作的負載均衡。

NFS

NFS作為業界常用的共享存儲方案,被眾多公司采用。使用NFS作為共享存儲,為前端WEB server提供服務,主要存儲網頁代碼以及其他文件。

  • 常用同步技術
  1. rsync+inotify實現文件同步
  2. 借助DRBD,實現文件同步
    但是以上方案都沒有實現高可用,只是實現了兩者數據同步。但是業務要求NFS服務器必須是高可用,所以我們在第二種同步方案的基礎上,在結合heartbeat來實現高可用。

架構部署

采用MySQL讀寫分離的方案;而讀寫之間的數據同步采用MySQL的單項或者雙向復制技術實現。
MySQL寫操作采用基於heartbeat+DRBD+MySQL搭建高可用集群;讀操作普遍采用基於LVS+keepalived搭建高可用擴展集群方案

本案例中暫時沒部署MySQL,實現思路:dbmaster和dbbackup兩台機器,分別安裝nfs,heartbeat,dbmaster,DRBD。

  • nfs可以另找一台服務器搭建專門用為共享存儲。
  • nfs的控制權交給了heartbeat。

架構拓撲

image

環境
全部都是Centos 7.5 系統

主機名 IP 擔任角色
dbmaster 192.168.111.3 drbd主,nfs server,heartbeat主
dbbackup 192.168.111.4 drbd被,heartbeat被
VIP 192.168.111.100
nfs客戶端 192.168.111.5 掛載VIP共享的目錄測試

部署DRBD

  1. 所有主機配置hosts並且改為對應的主機名
  2. 所有主機保持網絡狀況的良好通信
  3. 所有主機安裝最新的epel源
  4. DRBD這兩台各自分別添加了1GB硬盤供DRBD使用
  5. 同步時間
[root@localhost ~]# vim /etc/hosts
    192.168.111.7 lvsmaster       
    192.168.111.8 lvsbackup
    192.168.111.3 dbmaster
    192.168.111.4 dbbackup
    192.168.111.5 dbslave1
    192.168.111.6 dbslave2

[root@dbmaster yum.repos.d]# uname -r
3.10.0-862.el7.x86_64
#這是舊的

[root@dbbackup ~]# yum install kernel* -y

[root@dbbackup ~]# reboot

[root@localhost ~]# uname -r
3.10.0-957.12.1.el7.x86_64
#這是新的


drbd                  397041  0 
libcrc32c              12644  4 xfs,drbd,nf_nat,nf_conntrack    
[root@dbbackup ~]# yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm -y

[root@dbbackup ~]# yum -y install drbd84-utils kmod-drbd84
#安裝DRBD
[root@localhost ~]# modprobe drbd
#不出意外這樣就OK了
[root@localhost ~]# lsmod |grep -i drbd
  • 分區
[root@localhost ~]# fdisk /dev/sdb 
歡迎使用 fdisk (util-linux 2.23.2)。

更改將停留在內存中,直到您決定將更改寫入磁盤。
使用寫入命令前請三思。

Device does not contain a recognized partition table
使用磁盤標識符 0x7ce5781e 創建新的 DOS 磁盤標簽。

命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分區號 (1-4,默認 1):
起始 扇區 (2048-2097151,默認為 2048):
將使用默認值 2048
Last 扇區, +扇區 or +size{K,M,G} (2048-2097151,默認為 2097151):
將使用默認值 2097151
分區 1 已設置為 Linux 類型,大小設為 1023 MiB

命令(輸入 m 獲取幫助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盤。

#以上關於DRBD和分區的操作在111.3和111.4機器上重復操作,master和backup分區大小一致。
  • 修改配置文件
[root@dbmaster ~]# vim /etc/drbd.conf 
#include "drbd.d/global_common.conf"; 
#注釋掉這行,避免和我們自己寫的配置產生沖突。
    include "drbd.d/*.res";
    include "drbd.d/*.cfg";
[root@localhost ~]# vim /etc/drbd.d/drbd_basic.cfg 
    global {
    	usage-count yes;
        #是否參與DRBD使用者統計,默認為yes,yes or no都無所謂 
    }
    common {
        syncer { rate 30M; }
    }
    #設置主備節點同步的網絡速率最大值,默認單位是字節,我們可以設定為兆
    resource r0 {
    #r0為資源名,我們在初始化磁盤的時候就可以使用資源名來初始化。
    	protocol C;
    	#使用 C 協議。
    	handlers {
    	    pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f ";  
            pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt ";
            local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
            fence-peer "/usr/lib4/heartbeat/drbd-peer-outdater -t 5";
            pri-lost "echo pri-lst. Have a look at the log file.mail -s 'Drbd Alert' root";
            split-brain "/usr/lib/drbd/notify-split-brain.sh root";
            out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
    }
    	net {
    	  cram-hmac-alg "sha1";
    	  shared-secret "MySQL-HA";
    	  #drbd同步時使用的驗證方式和密碼信息
    }
    	disk {
    	  on-io-error detach;
    	  fencing resource-only;
    	  # 使用DOPD(drbd outdate-peer deamon)功能保證數據不同步的時候不進行切換。
    }
    	startup {
    	  wfc-timeout 120;
    	  degr-wfc-timeout 120;
    }
    	device /dev/drbd0;
    	#這里/dev/drbd0是用戶掛載時的設備名字,由DRBD進程創建
    	on dbmaster {
    	#每個主機名的說明以on開頭,后面是hostname(必須在/etc/hosts可解析)
    	  disk /dev/sdb1;
    	  #使用這個磁盤作為drbd的磁盤/dev/drbd0。
    	  address 192.168.111.3:7788;
    	  #設置DRBD的監聽端口,用於與另一台主機通信
    	  meta-disk internal;
    	  #drbd的元數據存放方式
    }
    	on dbbackup {
    	  disk /dev/sdb1;
    	  address 192.168.111.4:7788;
    	  meta-disk internal;
    }
    }
  • drbd報錯
[root@dbmaster ~]# drbdadm create-md r0
WARN:
  You are using the 'drbd-peer-outdater' as fence-peer program.
  If you use that mechanism the dopd heartbeat plugin program needs
  to be able to call drbdsetup and drbdmeta with root privileges.

  You need to fix this with these commands:
  chgrp haclient /lib/drbd/drbdsetup-84
  chmod o-x /lib/drbd/drbdsetup-84
  chmod u+s /lib/drbd/drbdsetup-84

  chgrp haclient /usr/sbin/drbdmeta
  chmod o-x /usr/sbin/drbdmeta
  chmod u+s /usr/sbin/drbdmeta

md_offset 1072689152
al_offset 1072656384
bm_offset 1072623616

Found xfs filesystem
     1047552 kB data area apparently used
     1047484 kB left usable by current configuration

Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
   * use external meta data (recommended)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
Operation refused.

Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40

應該是該分區有殘留的文件

  • 解決
[root@dbmaster ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1048576字節(1.0 MB)已復制,0.00339429 秒,309 MB/秒
[root@dbmaster ~]# drbdadm create-md r0
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 14097th user to install this version
WARN:
  You are using the 'drbd-peer-outdater' as fence-peer program.
  If you use that mechanism the dopd heartbeat plugin program needs
  to be able to call drbdsetup and drbdmeta with root privileges.

  You need to fix this with these commands:
  chgrp haclient /lib/drbd/drbdsetup-84
  chmod o-x /lib/drbd/drbdsetup-84
  chmod u+s /lib/drbd/drbdsetup-84

  chgrp haclient /usr/sbin/drbdmeta
  chmod o-x /usr/sbin/drbdmeta
  chmod u+s /usr/sbin/drbdmeta

initializing activity log
initializing bitmap (32 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
success
#使用dd命令清空,然后再執行
  • 進一步配置
[root@dbmaster ~]# systemctl start drbd.service
[root@dbbackup ~]# systemctl enable drbd.service 
#啟動服務

#如報錯,試試如下,不報錯跳過這步
[root@dbmaster ~]# groupadd haclient
[root@dbmaster ~]# chgrp haclient /lib/drbd/drbdsetup-84
[root@dbmaster ~]# chmod o-x /lib/drbd/drbdsetup-84
[root@dbmaster ~]# chmod u+s /lib/drbd/drbdsetup-84
[root@dbmaster ~]# chgrp haclient /usr/sbin/drbdmeta
[root@dbmaster ~]# chmod o-x /usr/sbin/drbdmeta
[root@dbmaster ~]# chmod u+s /usr/sbin/drbdmeta
#以上這幾個操作,找了很多資料都沒有提到要做,還特意提醒不用做,可能環境不同吧,不做一直報錯

[root@dbmaster ~]# drbdadm primary --force r0
#主上操作
[root@dbmaster ~]# drbdadm role r0
Primary/Secondary
#查看狀態

[root@dbbackup ~]# drbdadm role r0
Secondary/Primary
#backup機器查看狀態

[root@dbbackup ~]# drbdadm dstate r0
UpToDate/UpToDate
#查看數據同步狀態,如上為一致,還有Inconsistent狀態為數據不一致正在同步
  • 掛載DRBD磁盤
現在dbmaster上操作
[root@dbmaster ~]# mkfs.ext4 /dev/drbd0 
mke2fs 1.42.9 (28-Dec-2013)
文件系統標簽=
OS type: Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 261871 blocks
13093 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376

Allocating group tables: 完成                            
正在寫入inode表: 完成                            
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成


[root@dbmaster ~]# mkdir /nfs
[root@dbmaster ~]# mount /dev/drbd0 /nfs




現在是dbbackup上操作,主要是檢測備端是否能夠正常掛載和使用:

[root@dbmaster ~]# umount /nfs
#主上將設備卸載
[root@dbmaster ~]# drbdadm secondary all
#切換為被狀態

[root@dbbackup ~]# drbdadm primary r0
#被設為主狀態
[root@dbbackup ~]# mkdir /nfs
[root@dbbackup ~]# mount /dev/drbd0 /nfs

[root@dbbackup ~]# df -Th
文件系統                類型      容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root xfs        17G  4.5G   13G   27% /
devtmpfs                devtmpfs  470M     0  470M    0% /dev
tmpfs                   tmpfs     487M     0  487M    0% /dev/shm
tmpfs                   tmpfs     487M   14M  473M    3% /run
tmpfs                   tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sr0                iso9660   4.2G  4.2G     0  100% /media/cdrom
/dev/sda1               xfs      1014M  251M  764M   25% /boot
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0
/dev/drbd0              ext4      991M  2.6M  922M    1% /database

再按相同的方法將狀態切換回來

好的,這下簡單測試了下,先告一段落

部署heartbeat

  • 安裝cluster-glue

[root@dbmaster ~]# ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa
[root@dbmaster ~]# ssh-copy-id root@dbbackup
#ssh免密認證

[root@dbbackup ~]# yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc -y
#兩機同樣操作安裝依賴

[root@dbbackup ~]# useradd -g haclient hacluster

安裝包下載
下載軟件包:Reusable-Components-glue、resource-agents、heartbeat
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2019年資料/2月/26日/CentOS 7下安裝配置Heartbeat高可用集群/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

[root@dbmaster ~]# tar -jxvf glue.tar.bz2 
#我這是改名之后的,原來的是一串數字
[root@dbmaster ~]# cd Reusable-Cluster-Components-glue--0a7add1d9996/
[root@dbmaster Reusable-Cluster-Components-glue--0a7add1d9996]# ./autogen.sh
./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
make && make install
echo $?
cd ..
  • 安裝resource-agents

[root@dbbackup ~]# tar zxf resource-agents-3.9.6.tar.gz 
[root@dbbackup ~]# cd resource-agents-3.9.6/
./autogen.sh 
./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
make && make install
echo $?
cd ..
  • 安裝heartbeat

[root@dbmaster ~]# tar jxf heartbeat.bz2 
#該名稱是我后來改過的
[root@dbmaster ~]# cd Heartbeat-3-0-958e11be8686/

./bootstrap
export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
make && make install
echo $?

[root@dbbackup ~]# mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
[root@dbbackup ~]# cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/

[root@dbmaster ~]# cp Heartbeat-3-0-958e11be8686/doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
#拷貝配置文件

[root@dbmaster Heartbeat-3-0-958e11be8686]# chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys 
#該權限必須為600
#以上安裝兩台機器一樣
  • 配置文件
[root@dbmaster ~]# vim /usr/local/heartbeat/etc/ha.d/haresources
#末尾添加如下
dbmaster IPaddr::192.168.111.100/24/ens32 drbddisk::r0 Filesystem::/dev/drbd0::/nfs::ext4 killnfsd
#dbmaster IPaddr::192.168.111.10/24/ens32主機名 后跟虛擬IP地址、接口
#drbddisk::r0管理drbd資源的名稱
#Filesystem::/dev/drbd0::/nfs::ext4 renfsd文件系統::掛載的目錄及格式::后跟renfsd資源腳本

[root@dbmaster ~]# cp /etc/ha.d/resource.d/drbddisk /usr/local/heartbeat/etc/ha.d/resource.d/
#兩台一樣

[root@dbmaster ~]# echo "pkill -9 nfs; systemctl restart nfs; exit 0" > /usr/local/heartbeat/etc/ha.d/resource.d/killnfsd
#編輯nfs腳本文件killnfsd ,killnfsd 腳本文件的作用,
#drbd主備切換時,若nfs沒有啟動,則此腳本會把nfs啟動
#drbd主備切換時,若nfs已啟動,則此腳本會重啟nfs服務,因為NFS服務切換后,必須重新mount一下nfs共享出來的目錄,否則會出現stale NFS file handle的錯誤

[root@dbmaster ~]# chmod +x /usr/local/heartbeat/etc/ha.d/resource.d/drbddisk
[root@dbmaster ~]# chmod +x /usr/local/heartbeat/etc/ha.d/resource.d/killnfsd 



[root@dbmaster resource.d]# pwd
/usr/local/heartbeat/etc/ha.d/resource.d
[root@dbmaster resource.d]#  ll drbddisk Filesystem killnfsd IPaddr 
-rwxr-xr-x 1 root root 3162 5月  14 15:43 drbddisk
-rwxr-xr-x 1 root root 1923 5月  14 10:15 Filesystem
-rwxr-xr-x 1 root root 2297 5月  14 10:15 IPaddr
-rwxr-xr-x 1 root root   57 5月  14 15:41 killnfsd
#必須要有這四個腳本,有的是自帶,有的是復制,有的自己寫,上面已經說明而且必須要有執行權限。

[root@dbmaster ~]# vim  /usr/local/heartbeat/etc/ha.d/ha.cf
#修改主配置文件(去掉注釋或修改值)
logfile	/var/log/ha-log
#指定heartbeat日志文件的位置
logfacility     local0
#利用系統日志打印日志
keepalive 1
# 心跳發送時間間隔
deadtime 5
 # 備用節點5s內沒有檢測到master機的心跳,確認對方故障
warntime 2
# 警告2次
initdead 10
# 守護進程啟動30s后,啟動服務資源。
udpport 694
#設定集群節點間的通信協議及端口為udp694監聽端口(該端口可以修改)
ucast ens32 192.168.111.4
# 另一台主機節點eth0的地址,注意是另一台。
auto_failback off
#當primary節點切換到secondary節點之后,primary節點恢復正常,不進行切回操作,因為切換一次mysql master成本很高。
node	dbmaster
node	dbbackup
# 定義兩個節點的主機名,一行寫一個。
ping 192.168.111.2
#兩個IP的網關
respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail 
#使用這個腳本去偵聽對方是否還活着(使用的是ICMP報文檢測)



[root@dbmaster ~]# vim /usr/local/heartbeat/etc/ha.d/authkeys
#認證文件
    auth 1
    #表示使用id為2的驗證 下邊需要定義一個2的驗證算法
    1 sha1 HA_DB
    #口令(HISHA1)隨便給 主從配置相同即可

dbdackup也是同樣的安裝方法,配置文件直接scp過去就可以了,然后修改

[root@dbmaster ~]# scp -r /usr/local/heartbeat/etc/ha.d/{authkeys,haresources,ha.cf} root@dbbackup:/usr/local/heartbeat/etc/ha.d/
[root@dbbackup ha.d]# vim /usr/local/heartbeat/etc/ha.d/ha.cf 
ucast ens32 192.168.111.3
#把backup節點上ha.cf配置文件中ucast中IP改為對方

[root@dbmaster ~]# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/

[root@dbmaster ~]# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
#2機器將這些庫文件鏈接過去,要不啟動報錯
May 13 13:09:27 dbmaster heartbeat: [86183]: ERROR: Illegal directive [ucast] in /usr/local/heartbeat/etc/ha.d/ha.cf

部署NFS及配合heartbeat

[root@dbbackup ~]# yum -y install  nfs-utils nfs-utils-lib nfs4-acl-tools
#dbmaster和dbbackup安裝
[root@dbmaster ~]# vim /etc/exports
    /nfs	192.168.111.0/255.255.255.0(rw,sync,no_root_squash)
#設置nfs共享目錄,權限,網段
[root@dbmaster ~]# systemctl restart rpcbind

#啟動順序一定是rpcbind->nfs,否則有可能出現錯誤
#在這里nfs不需要啟動,它由heartbeat控制

[root@dbmaster ~]# systemctl start heartbeat
[root@dbmaster ~]# systemctl enable heartbeat
#最多等一兩分鍾VIP肯定出來,否則查看日志
[root@dbmaster ~]# ip a | grep inet
#主上查看
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
    inet 192.168.111.3/24 brd 192.168.111.255 scope global noprefixroute ens32
    inet 192.168.111.100/24 brd 192.168.111.255 scope global secondary ens32:0
#到了這,VIP肯定要出來,可以稍等會,觀察下日志。如果出錯,上面可能哪一步沒有到位
[root@dbmaster ~]# mount | grep drbd
/dev/drbd0 on /nfs type ext4 (rw,relatime,data=ordered)
#這個也已經根據配置自動掛載

[root@dbbackup ~]# showmount -e 192.168.111.100
Export list for 192.168.111.100:
/nfs 192.168.111.0/255.255.255.0
#查看VIP共享的目錄
  • 配置nfs自動掛載
[root@localhost ~]# mkdir /nfs
[root@localhost ~]# mount 192.168.111.100:/nfs/ /nfs/
#客戶端測試
[root@localhost ~]# echo "192.168.111.100:/nfs /nfs nfs defaults,soft,intr 0 0" >> /etc/fstab 
[root@localhost ~]# tail -1 /etc/fstab 
192.168.111.100:/nfs /nfs nfs defaults,soft,intr 0 0
#Nfs是類型
#soft參數是為了向用戶輸出錯誤信息
#intr參數為了解決當網絡出現故障時,我們可以通過按下ctrl+c組合鍵來終止操作

  • 驗證:接下來我們在主上把nfs服務關掉,模擬故障,看VIP是否切換主機
[root@dbmaster ~]# systemctl stop nfs
[root@dbmaster ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: inactive (dead) since 二 2019-05-14 18:21:09 CST; 6s ago
  Process: 61802 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 61799 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 61797 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
 Main PID: 60625 (code=exited, status=0/SUCCESS)

5月 14 16:35:58 dbmaster systemd[1]: Starting NFS server and services...
5月 14 16:35:58 dbmaster systemd[1]: Started NFS server and services.
5月 14 18:21:09 dbmaster systemd[1]: Stopping NFS server and services...
5月 14 18:21:09 dbmaster systemd[1]: Stopped NFS server and services.

我在主被兩台機器上查看debug日志,沒有任何變動

[root@dbbackup ~]# cd /nfs

#我在掛載了VIP的機器上查看共享目錄能否使用,卡死終端

總結下原因:heartbeat沒有監控到nfs的服務狀態,它自身想當然的認為,只有heartbeat服務出故障,才切VIP。

解決:我們將nfs,和heartbeat服務做一個捆綁,類似於事物性質。即nfs出問題,heartbeat也要宕掉。這里通過腳本實現。

[root@dbmaster ~]# vim /opt/monitornfs.sh

while true
do
    drbdstatus=`cat /proc/drbd 2> /dev/null  | grep ro | tail -n1 | awk -F':' '{print $4}' | awk -F'/' '{print $1}'`
    nfsstatus=`systemctl status nfs&>/dev/null ; echo $?`

    if [ -z  $drbdstatus ];then
        sleep 10
        continue
    elif [ $drbdstatus == 'Primary' ];then
        if [ $nfsstatus -ne 0 ];then
            systemctl start nfs &> /dev/null
            newnfsstatus=`systemctl status nfs&>/dev/null ; echo $?`
            if [ $newnfsstatus -ne 0 ];then
            systemctl stop heartbeat
            #嘗試開啟之后若還是不行,則關掉heartbeat
            fi
        fi
    fi
    sleep 5
done

[root@dbmaster ~]# chmod +x /opt/monitornfs.sh 
[root@dbmaster ~]# nohup /opt/monitornfs.sh &
#以上關於腳本操作,在dbbackup上重復
  • 測試
[root@dbmaster ~]# systemctl stop nfs
#主節點關掉nfs服務

#但是后台的腳本又給他開啟了
[root@dbmaster ~]# systemctl stop heartbeat
#VIP切換到備機了

**但是nfs客戶端的使用並不影響,切換的時候會有輕微的延遲。
**

nfs切記要掛載到別的機器上不要為了省事,省機器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM