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

參考文檔

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

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

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

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

Linux HA集羣之DRBD詳解(較全面)c++

構建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/71056309sql

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/79051782bootstrap

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

理論概述

本案例只是,爲搭建MySQL集羣作準備,並沒有MySQL

DRBD

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

DRBD能夠部署在以下類的底層設備上: 一、一個磁盤,或者是磁盤的某一個分區; 二、一個soft raid 設備; 三、一個LVM的邏輯卷; 四、一個EVMS(Enterprise Volume Management System,企業卷管理系統)的卷; 五、其餘任何的塊設備。

工做原理

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切記要掛載到別的機器上不要爲了省事,省機器

相關文章
相關標籤/搜索