理論概述
本案例只是,為搭建MySQL集群做準(zhǔn)備,并無MySQL
DRBD
DRBD(distributed replicated block device分布式復(fù)制塊設(shè)備)是一個(gè)基于軟件實(shí)現(xiàn)的、無共享的、服務(wù)器之間鏡像塊設(shè)備內(nèi)容的存儲(chǔ)復(fù)制解決方案。DRBD是鏡像塊設(shè)備,是按數(shù)據(jù)位鏡像成一樣的數(shù)據(jù)塊
DRBD可以部署在如下類的底層設(shè)備上: 1、一個(gè)磁盤,或者是磁盤的某一個(gè)分區(qū); 2、一個(gè)soft raid 設(shè)備; 3、一個(gè)LVM的邏輯卷; 4、一個(gè)EVMS(Enterprise Volume Management System,企業(yè)卷管理系統(tǒng))的卷; 5、其他任何的塊設(shè)備。
工作原理
DRBD需要運(yùn)行在各個(gè)節(jié)點(diǎn)上,且是運(yùn)行在節(jié)點(diǎn)主機(jī)的內(nèi)核中,所以DRBD是內(nèi)核模塊,在Linux2.6.33版本起開始整合進(jìn)內(nèi)核。
DRBD工作的位置在文件系統(tǒng)的buffer Cache和磁盤調(diào)度器之間
如上圖左節(jié)點(diǎn)為活躍節(jié)點(diǎn)實(shí)線箭頭,有節(jié)點(diǎn)為備用節(jié)點(diǎn)虛線箭頭。 左節(jié)點(diǎn)接收到數(shù)據(jù)法網(wǎng)內(nèi)核的數(shù)據(jù)通路,DRBD在數(shù)據(jù)通路中注冊(cè)鉤子檢查數(shù)據(jù)(類似ipvs)當(dāng)檢測(cè)到接收的數(shù)據(jù)是發(fā)往自己管理的存儲(chǔ)位置,程序會(huì)復(fù)制另一份,一份存儲(chǔ)到本機(jī)的DRBD存儲(chǔ)設(shè)備,另一份就發(fā)給TCP/IP協(xié)議棧,通過網(wǎng)絡(luò)傳輸?shù)搅硪慌_(tái)節(jié)點(diǎn)上TCP/IP協(xié)議棧;另一臺(tái)節(jié)點(diǎn)上運(yùn)行的DRBD模塊同樣在數(shù)據(jù)通路上監(jiān)測(cè)數(shù)據(jù),當(dāng)檢測(cè)到傳輸過來的數(shù)據(jù)時(shí),運(yùn)行存儲(chǔ)機(jī)制,存儲(chǔ)到本機(jī)DRBD存儲(chǔ)設(shè)備的對(duì)應(yīng)位置。
如果左節(jié)點(diǎn)宕機(jī),在高可用集群中右節(jié)點(diǎn)成為活躍節(jié)點(diǎn),并且會(huì)接收到左節(jié)點(diǎn)宕機(jī)的信號(hào),接受數(shù)據(jù)先保存到本地,左節(jié)點(diǎn)恢復(fù)上線之后,再把左節(jié)點(diǎn)宕機(jī)后右節(jié)點(diǎn)變動(dòng)的 數(shù)據(jù)鏡像到左節(jié)點(diǎn)。 每個(gè)設(shè)備(drbd 提供了不止一個(gè)設(shè)備)都有一個(gè)狀態(tài),可能是‘主’狀態(tài)或‘從’態(tài)。在主節(jié)點(diǎn)上,應(yīng)用程序應(yīng)能運(yùn)行和訪問drbd設(shè)備(/dev/drbd)。每次寫入會(huì)發(fā)往本地磁盤設(shè)備和從節(jié)點(diǎn)設(shè)備中。從節(jié)點(diǎn)只能簡單地把數(shù)據(jù)寫入它的磁盤設(shè)上。 讀取數(shù)據(jù)通常在本地進(jìn)行。如果主節(jié)點(diǎn)發(fā)生故障,心跳(heartbeat或corosync)將會(huì)把從節(jié)點(diǎn)轉(zhuǎn)換到主狀態(tài),并啟動(dòng)其上的應(yīng)用程序。(如果您將它和無日志FS 一起使用,則需要運(yùn)行fsck)。如果發(fā)生故障的節(jié)點(diǎn)恢復(fù)工作,它就會(huì)成為新的從節(jié)點(diǎn),而且必須使自己的內(nèi)容與主節(jié)點(diǎn)的內(nèi)容保持同步。
復(fù)制模式 鏡像過程完成之后還需要返回成功或失敗的回應(yīng)信息?;貞?yīng)信息可以在傳輸過程中的不同位置返回,如上圖A/B/C三處, 可以分為三種復(fù)制模式:
特點(diǎn): 實(shí)時(shí)復(fù)制:一段修改之后馬上復(fù)制過去 透明的傳輸:程序不需要檢測(cè)到這個(gè)數(shù)據(jù)存儲(chǔ)在多個(gè)主機(jī)上 同步或者異步:同步鏡像:程序?qū)懖僮魍瓿珊髸?huì)通知所有已經(jīng)連接的主機(jī);異步同步:程序會(huì)在本地寫完之前通知其它的主機(jī)。
A:一旦本地磁盤寫入已經(jīng)完成,數(shù)據(jù)包已在發(fā)送隊(duì)列中,則寫操作被認(rèn)為是完成的 。在一個(gè)節(jié)點(diǎn)發(fā)生故障時(shí),可能發(fā)生數(shù)據(jù)丟失,因?yàn)楸粚懭氲竭h(yuǎn)程節(jié)點(diǎn)上的數(shù)據(jù)可能仍在發(fā)送隊(duì)列。盡管,在故障轉(zhuǎn)移節(jié)點(diǎn)上的數(shù)據(jù)是一致的,但沒有及時(shí)更新。這通常是用于地理上分開的節(jié)點(diǎn)。 B:一旦本地磁盤寫入已完成且復(fù)制數(shù)據(jù)包達(dá)到了對(duì)等節(jié)點(diǎn)則認(rèn)為寫操作在主節(jié)點(diǎn)上被認(rèn)為是完成的。數(shù)據(jù)丟失可能發(fā)生在參加的兩個(gè)節(jié)點(diǎn)同時(shí)故障的情況下,因?yàn)樵陲w行中的數(shù)據(jù)可能不會(huì)被提交到磁盤。 C:只有在本地和遠(yuǎn)程節(jié)點(diǎn)的磁盤已經(jīng)確認(rèn)了寫操作完成,寫才被認(rèn)為完成。沒有任何數(shù)據(jù)丟失,所以這是一個(gè)群集節(jié)點(diǎn)的流行模式,但I(xiàn)/O吞吐量依賴于網(wǎng)絡(luò)帶寬。 A 數(shù)據(jù)一旦寫入磁盤并發(fā)送到網(wǎng)絡(luò)中就認(rèn)為完成了寫入操作。 B 收到接收確認(rèn)就認(rèn)為完成了寫入操作。 C 收到寫入確認(rèn)就認(rèn)為完成了寫入操作。 就目前而言應(yīng)用最多和應(yīng)用最廣泛的為協(xié)議C。
架構(gòu)
MySQL+heartbeat+drbd+lvs是一套成熟的集群解決方案在現(xiàn)在多數(shù)企業(yè)里面,通過heartbeat+DRBD完成MySQL的主節(jié)點(diǎn)寫操作的高可用性,通過MySQL+lvs實(shí)現(xiàn)MySQL數(shù)據(jù)庫的主從復(fù)制和MySQL讀寫的負(fù)載均衡。這個(gè)方案在讀寫方面進(jìn)行了分離,融合了寫操作的高可用和讀操作的負(fù)載均衡。
NFS
NFS作為業(yè)界常用的共享存儲(chǔ)方案,被眾多公司采用。使用NFS作為共享存儲(chǔ),為前端WEB server提供服務(wù),主要存儲(chǔ)網(wǎng)頁代碼以及其他文件。
- 常用同步技術(shù)
- rsync+inotify實(shí)現(xiàn)文件同步
- 借助DRBD,實(shí)現(xiàn)文件同步
但是以上方案都沒有實(shí)現(xiàn)高可用,只是實(shí)現(xiàn)了兩者數(shù)據(jù)同步。但是業(yè)務(wù)要求NFS服務(wù)器必須是高可用,所以我們?cè)诘诙N同步方案的基礎(chǔ)上,在結(jié)合heartbeat來實(shí)現(xiàn)高可用。
架構(gòu)部署
采用MySQL讀寫分離的方案;而讀寫之間的數(shù)據(jù)同步采用MySQL的單項(xiàng)或者雙向復(fù)制技術(shù)實(shí)現(xiàn)。 MySQL寫操作采用基于heartbeat+DRBD+MySQL搭建高可用集群;讀操作普遍采用基于LVS+keepalived搭建高可用擴(kuò)展集群方案
本案例中暫時(shí)沒部署MySQL,實(shí)現(xiàn)思路:dbmaster和dbbackup兩臺(tái)機(jī)器,分別安裝nfs,heartbeat,dbmaster,DRBD。
- nfs可以另找一臺(tái)服務(wù)器搭建專門用為共享存儲(chǔ)。
- nfs的控制權(quán)交給了heartbeat。
架構(gòu)拓?fù)?/p>
環(huán)境 全部都是CentOS 7.5 系統(tǒng)
主機(jī)名|IP|擔(dān)任角色
–|–|–
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共享的目錄測(cè)試
部署DRBD
- 所有主機(jī)配置hosts并且改為對(duì)應(yīng)的主機(jī)名
- 所有主機(jī)保持網(wǎng)絡(luò)狀況的良好通信
- 所有主機(jī)安裝最新的epel源
- DRBD這兩臺(tái)各自分別添加了1GB硬盤供DRBD使用
- 同步時(shí)間
[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
- 分區(qū)
[root@localhost ~]# fdisk /dev/sdb 歡迎使用 fdisk (util-linux 2.23.2)。 更改將停留在內(nèi)存中,直到您決定將更改寫入磁盤。 使用寫入命令前請(qǐng)三思。 Device does not contain a recognized partition table 使用磁盤標(biāo)識(shí)符 0x7ce5781e 創(chuàng)建新的 DOS 磁盤標(biāo)簽。 命令(輸入 m 獲取幫助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分區(qū)號(hào) (1-4,默認(rèn) 1): 起始 扇區(qū) (2048-2097151,默認(rèn)為 2048): 將使用默認(rèn)值 2048 Last 扇區(qū), +扇區(qū) or +size{K,M,G} (2048-2097151,默認(rèn)為 2097151): 將使用默認(rèn)值 2097151 分區(qū) 1 已設(shè)置為 Linux 類型,大小設(shè)為 1023 MiB 命令(輸入 m 獲取幫助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盤。 #以上關(guān)于DRBD和分區(qū)的操作在111.3和111.4機(jī)器上重復(fù)操作,master和backup分區(qū)大小一致。
- 修改配置文件
[root@dbmaster ~]# vim /etc/drbd.conf #include "drbd.d/global_common.conf"; #注釋掉這行,避免和我們自己寫的配置產(chǎn)生沖突。 include "drbd.d/*.res"; include "drbd.d/*.cfg"; [root@localhost ~]# vim /etc/drbd.d/drbd_basic.cfg global { usage-count yes; #是否參與DRBD使用者統(tǒng)計(jì),默認(rèn)為yes,yes or no都無所謂 } common { syncer { rate 30M; } } #設(shè)置主備節(jié)點(diǎn)同步的網(wǎng)絡(luò)速率最大值,默認(rèn)單位是字節(jié),我們可以設(shè)定為兆 resource r0 { #r0為資源名,我們?cè)诔跏蓟疟P的時(shí)候就可以使用資源名來初始化。 protocol C; #使用 C 協(xié)議。 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同步時(shí)使用的驗(yàn)證方式和密碼信息 } disk { on-io-error detach; fencing resource-only; # 使用DOPD(drbd outdate-peer deamon)功能保證數(shù)據(jù)不同步的時(shí)候不進(jìn)行切換。 } startup { wfc-timeout 120; degr-wfc-timeout 120; } device /dev/drbd0; #這里/dev/drbd0是用戶掛載時(shí)的設(shè)備名字,由DRBD進(jìn)程創(chuàng)建 on dbmaster { #每個(gè)主機(jī)名的說明以on開頭,后面是hostname(必須在/etc/hosts可解析) disk /dev/sdb1; #使用這個(gè)磁盤作為drbd的磁盤/dev/drbd0。 address 192.168.111.3:7788; #設(shè)置DRBD的監(jiān)聽端口,用于與另一臺(tái)主機(jī)通信 meta-disk internal; #drbd的元數(shù)據(jù)存放方式 } on dbbackup { disk /dev/sdb1; address 192.168.111.4:7788; meta-disk internal; } }
- drbd報(bào)錯(cuò)
[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
應(yīng)該是該分區(qū)有殘留的文件
- 解決
[root@dbmaster ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1 記錄了1+0 的讀入 記錄了1+0 的寫出 1048576字節(jié)(1.0 MB)已復(fù)制,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命令清空,然后再執(zhí)行
- 進(jìn)一步配置
[root@dbmaster ~]# systemctl start drbd.service [root@dbbackup ~]# systemctl enable drbd.service #啟動(dòng)服務(wù) #如報(bào)錯(cuò),試試如下,不報(bào)錯(cuò)跳過這步 [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 #以上這幾個(gè)操作,找了很多資料都沒有提到要做,還特意提醒不用做,可能環(huán)境不同吧,不做一直報(bào)錯(cuò) [root@dbmaster ~]# drbdadm primary --force r0 #主上操作 [root@dbmaster ~]# drbdadm role r0 Primary/Secondary #查看狀態(tài) [root@dbbackup ~]# drbdadm role r0 Secondary/Primary #backup機(jī)器查看狀態(tài) [root@dbbackup ~]# drbdadm dstate r0 UpToDate/UpToDate #查看數(shù)據(jù)同步狀態(tài),如上為一致,還有Inconsistent狀態(tài)為數(shù)據(jù)不一致正在同步
- 掛載DRBD磁盤
現(xiàn)在dbmaster上操作 [root@dbmaster ~]# mkfs.ext4 /dev/drbd0 mke2fs 1.42.9 (28-Dec-2013) 文件系統(tǒng)標(biāo)簽= 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 第一個(gè)數(shù)據(jù)塊=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 現(xiàn)在是dbbackup上操作,主要是檢測(cè)備端是否能夠正常掛載和使用: [root@dbmaster ~]# umount /nfs #主上將設(shè)備卸載 [root@dbmaster ~]# drbdadm secondary all #切換為被狀態(tài) [root@dbbackup ~]# drbdadm primary r0 #被設(shè)為主狀態(tài) [root@dbbackup ~]# mkdir /nfs [root@dbbackup ~]# mount /dev/drbd0 /nfs [root@dbbackup ~]# df -Th 文件系統(tǒng) 類型 容量 已用 可用 已用% 掛載點(diǎn) /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 再按相同的方法將狀態(tài)切換回來
好的,這下簡單測(cè)試了下,先告一段落
部署heartbeat
- 安裝cluster-glue
[root@dbmaster ~]# ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa [root@dbmaster ~]# ssh-copy-id root@dbbackup #ssh免密認(rèn)證 [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 #兩機(jī)同樣操作安裝依賴 [root@dbbackup ~]# useradd -g haclient hacluster 安裝包下載 下載軟件包:Reusable-Components-glue、resource-agents、heartbeat 免費(fèi)下載地址在 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 #我這是改名之后的,原來的是一串?dāng)?shù)字 [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 #該權(quán)限必須為600 #以上安裝兩臺(tái)機(jī)器一樣
- 配置文件
[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主機(jī)名 后跟虛擬IP地址、接口 #drbddisk::r0管理drbd資源的名稱 #Filesystem::/dev/drbd0::/nfs::ext4 renfsd文件系統(tǒng)::掛載的目錄及格式::后跟renfsd資源腳本 [root@dbmaster ~]# cp /etc/ha.d/resource.d/drbddisk /usr/local/heartbeat/etc/ha.d/resource.d/ #兩臺(tái)一樣 [root@dbmaster ~]# echo "pkill -9 nfs; systemctl restart nfs; exit 0" > /usr/local/heartbeat/etc/ha.d/resource.d/killnfsd #編輯nfs腳本文件killnfsd ,killnfsd 腳本文件的作用, #drbd主備切換時(shí),若nfs沒有啟動(dòng),則此腳本會(huì)把nfs啟動(dòng) #drbd主備切換時(shí),若nfs已啟動(dòng),則此腳本會(huì)重啟nfs服務(wù),因?yàn)镹FS服務(wù)切換后,必須重新mount一下nfs共享出來的目錄,否則會(huì)出現(xiàn)stale NFS file handle的錯(cuò)誤 [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 #必須要有這四個(gè)腳本,有的是自帶,有的是復(fù)制,有的自己寫,上面已經(jīng)說明而且必須要有執(zhí)行權(quán)限。
[root@dbmaster ~]# vim /usr/local/heartbeat/etc/ha.d/ha.cf #修改主配置文件(去掉注釋或修改值) logfile /var/log/ha-log #指定heartbeat日志文件的位置 logfacility local0 #利用系統(tǒng)日志打印日志 keepalive 1 # 心跳發(fā)送時(shí)間間隔 deadtime 5 # 備用節(jié)點(diǎn)5s內(nèi)沒有檢測(cè)到master機(jī)的心跳,確認(rèn)對(duì)方故障 warntime 2 # 警告2次 initdead 10 # 守護(hù)進(jìn)程啟動(dòng)30s后,啟動(dòng)服務(wù)資源。 udpport 694 #設(shè)定集群節(jié)點(diǎn)間的通信協(xié)議及端口為udp694監(jiān)聽端口(該端口可以修改) ucast ens32 192.168.111.4 # 另一臺(tái)主機(jī)節(jié)點(diǎn)eth0的地址,注意是另一臺(tái)。 auto_failback off #當(dāng)primary節(jié)點(diǎn)切換到secondary節(jié)點(diǎn)之后,primary節(jié)點(diǎn)恢復(fù)正常,不進(jìn)行切回操作,因?yàn)榍袚Q一次mysql master成本很高。 node dbmaster node dbbackup # 定義兩個(gè)節(jié)點(diǎn)的主機(jī)名,一行寫一個(gè)。 ping 192.168.111.2 #兩個(gè)IP的網(wǎng)關(guān) respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail #使用這個(gè)腳本去偵聽對(duì)方是否還活著(使用的是ICMP報(bào)文檢測(cè)) [root@dbmaster ~]# vim /usr/local/heartbeat/etc/ha.d/authkeys #認(rèn)證文件 auth 1 #表示使用id為2的驗(yàn)證 下邊需要定義一個(gè)2的驗(yàn)證算法 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節(jié)點(diǎn)上ha.cf配置文件中ucast中IP改為對(duì)方 [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機(jī)器將這些庫文件鏈接過去,要不啟動(dòng)報(bào)錯(cuò) 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) #設(shè)置nfs共享目錄,權(quán)限,網(wǎng)段 [root@dbmaster ~]# systemctl restart rpcbind #啟動(dòng)順序一定是rpcbind->nfs,否則有可能出現(xiàn)錯(cuò)誤 #在這里nfs不需要啟動(dòng),它由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肯定要出來,可以稍等會(huì),觀察下日志。如果出錯(cuò),上面可能哪一步?jīng)]有到位 [root@dbmaster ~]# mount | grep drbd /dev/drbd0 on /nfs type ext4 (rw,relatime,data=ordered) #這個(gè)也已經(jīng)根據(jù)配置自動(dòng)掛載 [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自動(dòng)掛載
[root@localhost ~]# mkdir /nfs [root@localhost ~]# mount 192.168.111.100:/nfs/ /nfs/ #客戶端測(cè)試 [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參數(shù)是為了向用戶輸出錯(cuò)誤信息 #intr參數(shù)為了解決當(dāng)網(wǎng)絡(luò)出現(xiàn)故障時(shí),我們可以通過按下ctrl+c組合鍵來終止操作
- 驗(yàn)證:接下來我們?cè)谥魃习裯fs服務(wù)關(guān)掉,模擬故障,看VIP是否切換主機(jī)
[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.
我在主被兩臺(tái)機(jī)器上查看debug日志,沒有任何變動(dòng)
[root@dbbackup ~]# cd /nfs #我在掛載了VIP的機(jī)器上查看共享目錄能否使用,卡死終端
總結(jié)下原因:heartbeat沒有監(jiān)控到nfs的服務(wù)狀態(tài),它自身想當(dāng)然的認(rèn)為,只有heartbeat服務(wù)出故障,才切VIP。
解決:我們將nfs,和heartbeat服務(wù)做一個(gè)捆綁,類似于事物性質(zhì)。即nfs出問題,heartbeat也要宕掉。這里通過腳本實(shí)現(xiàn)。
[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 #嘗試開啟之后若還是不行,則關(guān)掉heartbeat fi fi fi sleep 5 done [root@dbmaster ~]# chmod +x /opt/monitornfs.sh [root@dbmaster ~]# nohup /opt/monitornfs.sh & #以上關(guān)于腳本操作,在dbbackup上重復(fù)
- 測(cè)試
[root@dbmaster ~]# systemctl stop nfs #主節(jié)點(diǎn)關(guān)掉nfs服務(wù) #但是后臺(tái)的腳本又給他開啟了 [root@dbmaster ~]# systemctl stop heartbeat #VIP切換到備機(jī)了
但是nfs客戶端的使用并不影響,切換的時(shí)候會(huì)有輕微的延遲。