運維筆記29 (高可用集羣之heartbeat+drbd+mysql)

概述:

          上一次所介紹的高可用集羣是紅帽系列自帶的一個套件,具有web界面對於剛接觸高可用集羣的人有很友好,但也有一個問題,就是當集羣出現一些問題無法工作的時候光靠那個web界面一般不能解決什麼,所以這次迴歸本源,純手動配置這個高可用集羣heartbeat。所使用的存儲是drbd,搭載服務是mysql,mysql服務和別的服務搭載起來可是有一定不同的。環境:兩臺rhel6.5

集羣拓撲圖:


1.安裝heartbeat

          heartbeat是一個開源項目,我們可以通過他的官網下載源代碼包編譯,這裏我們使用rpm包安裝了。如下:

[root@ha1 heartbeat]# ls
heartbeat-3.0.4-2.el6.x86_64.rpm        heartbeat-libs-3.0.4-2.el6.x86_64.rpm
heartbeat-devel-3.0.4-2.el6.x86_64.rpm  ldirectord-3.9.5-3.1.x86_64.rpm
2.配置heartbeat

        heartbeat的配置文件均在/etc/ha.d下,進入這個目錄

[root@ha1 ha.d]# ls
harc  rc.d  README.config  resource.d  shellfuncs
看到README.config我們一定要看一下,養成遇到README就看的習慣。

You need three configuration files to make heartbeat happy,
and they all go in this directory.

They are:
	ha.cf		Main configuration file
	haresources	Resource configuration file
	authkeys	Authentication information

These first two may be readable by everyone, but the authkeys file
must not be.
上面的話告訴我們這裏還需要三個配置文件,而且authkeys的並不是誰都可以看的哦。繼續往下看

If you installed heartbeat using rpm packages then
this command will show you where they are on your system:
		rpm -q heartbeat -d
上面這句話告訴我們想找到那三個文件需要運行"rpm -q heartbeat -d"這個命令

/usr/share/doc/heartbeat-3.0.4/authkeys
/usr/share/doc/heartbeat-3.0.4/ha.cf
/usr/share/doc/heartbeat-3.0.4/haresources
通過README的提示,我們成功找到了三個配置文件的位置。現在開始配置這三個文件

ha.cf    heartbeat的主配置文件

logfacility	local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport	10009
bcast	eth0		# Linux
auto_failback on
node	ha1.mo.com
node	ha2.mo.com
ping 172.25.9.250
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
這是需要配置的所有字段,下面我挨個解釋下儀式是什麼

logfacility    local0        #heartbeat服務的日誌

keepalive 2                  #發送心跳的頻率是2s

deadtime 30                 #當30s的時候無響應就認爲節點掛掉了

warntime 10                 #10s無響應的時候就進行警告

initdead 60                   #根據配置文件所說明的,就是有一些操作系統開機的時候不會啓動網卡,所以要多等這類系統 一點時間設置成60s

udpport 10009             #設這個服務的端口號,在內網不要有和這個端口重複的。



bcast eth0                    #通過什麼發送,我們選擇廣播

auto_failback on           #服務是否自動切換回主服務器

node                             #代表你的節點,第一個就是主節點

ping                              #選擇一臺主機作爲測試對象,只要能ping通我所書寫的這個第三方節點,就認爲自己是好的,而另一臺ping不同,如果有fence的話,我就要接管他。

respawn                       #確定ipfaill腳本的路徑

apiauth                         #api的用戶驗證。


haresources    集羣的資源配置文件

ha1.mo.com      IPaddr::172.25.9.200/24/eth0  httpd
我們這裏是測試一下這個集羣的功能,先使用配置較爲簡單的http服務。


authkeys     集羣的身份驗證文件

auth 1
1 crc
這裏由於是內網所以選擇最簡單的crc循環冗餘校驗即可。

這時heartbeat的配置文件就寫好了,現在最重要的一點,我們現在配置的是集羣,不是以前的單個服務,要將剛纔寫好的配置文件分發給其他節點,並且都安裝上http服務。現在所以節點啓動heartbeat服務。

heartbeat: udpport setting must precede media statementsheartbeat[1356]: 2017/02/16_22:36:43 ERROR: Bad permissions on keyfile [/etc/ha.d//authkeys], 600 recommended.
啓動失敗發現如上信息,原來忘記修改了authkeys的權限成爲600。啓動成功,現在通過查看日至,看看服務是否都架設成功。

Feb 16 22:39:36 ha1 /usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_172.25.9.200)[1793]: INFO:  Success
Feb 16 22:39:36 ha1 ResourceManager(default)[1674]: info: Running /etc/init.d/httpd  start
通過上面兩條我們可以看出,我們設置的ip已經分到ha1這臺機子上了,http也在這臺上啓動了。

3.配置drbd存儲

       DRBD的全稱爲:Distributed Replicated Block Device(DRBD)分佈式塊設備複製,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡來鏡像整個設備。你可以把它看作是一種網絡RAID。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。

       DRBD不同於我們之前接觸的NFS,ISCSI等C/S結構的存儲,他是分佈式的,每一臺節點上都擁有存儲而不是所有節點都都將存儲放到一臺服務器上,在節點上有primary節點和secondary節點之分,primary節點接受數據,並且把數據同步到secondary節點上,當primary節點故障,服務就會切換到secondary節點上。由於secondary節點上的數據是同步primary節點而來,所以是完全一樣的數據。

4.drbd的安裝與配置

      大家一定知道安裝軟件一般有兩種方式,一種是源代碼安裝,另一種是rpm包安裝,源代碼安裝方式定執行好,但是不適合大規模佈置,所以我們這次將源代碼包生成rpm包去佈置我們的集羣。


[root@ha1 drbd-8.4.2]# ls
autogen.sh    documentation        filelist-redhat  preamble-sles11
benchmark     drbd                 filelist-suse    README
ChangeLog     drbd_config.h        Makefile.in      rpm-macro-fixes
configure     drbd-kernel.spec.in  preamble         scripts
configure.ac  drbd-km.spec.in      preamble-rhel5   user
COPYING       drbd.spec.in         preamble-sles10
進入源代碼包的主目錄

運行./configure

[root@ha1 drbd-8.4.2]# ./configure 
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/root/drbd-8.4.2':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
發現沒有安裝gcc,我們安裝gcc。

由於我們要創建rpm包,所以還要加上一些參數,而且drbd這個功能在6.5系列的內核中並沒有開啓,需要加載進來,也需要添加參數。

 --with-km               Enable kernel module
--enable-spec           Rather than creating Makefiles, create an RPM spec file only
[root@ha1 drbd-8.4.2]# ./configure --enable-spec --with-km
輸入上面的命令。查看有什麼東西缺少
configure: error: Cannot build utils without flex, either install flex or pass the --without-utils option.
缺少flex,那麼就安裝flex,繼續執行配置命令

configure: WARNING: No rpmbuild found, building RPM packages is disabled.
發現缺少rpmbuild,繼續安裝,執行配置命令,發現已經沒有相關的錯誤了,可以生成rpm包了。執行rpm-build命令。

[root@ha1 drbd-8.4.2]# rpmbuild drbd-kernel.spec
error: File /root/rpmbuild/SOURCES/drbd-8.4.2.tar.gz: No such file or directory
發現這個目錄下沒有源代碼包文件。將源代碼包放到這個下面。繼續創建rpm-build。

[root@ha1 drbd-8.4.2]# rpmbuild -bb drbd.spec
spec文件就相當於rpm創建的配置文件

接下來創建drbd內核模塊的rpm包

[root@ha1 drbd-8.4.2]# rpmbuild -bb drbd-km.spec
error: Failed build dependencies:
kernel-devel is needed by drbd-km-8.4.2-2.el6.x86_64
發現如上錯誤,我們對內核編譯的時候需要內核開發包,繼續安裝。成功後進入/root/rpmbuild/RPMS。

[root@ha1 x86_64]# ls
drbd-8.4.2-2.el6.x86_64.rpm
drbd-bash-completion-8.4.2-2.el6.x86_64.rpm
drbd-heartbeat-8.4.2-2.el6.x86_64.rpm
drbd-km-2.6.32_431.el6.x86_64-8.4.2-2.el6.x86_64.rpm
drbd-pacemaker-8.4.2-2.el6.x86_64.rpm
drbd-udev-8.4.2-2.el6.x86_64.rpm
drbd-utils-8.4.2-2.el6.x86_64.rpm
drbd-xen-8.4.2-2.el6.x86_64.rpm
這裏就是我們部署drbd需要的所有rpm包。接下來只要無腦的yum install *就可以了。

接下來部署drbd。如我們之前所說,drbd是分佈式的存儲每一個節點都要有存儲,而且對於高可用集羣所分享的存儲的大小一定要是一樣的。我們給虛擬機添加一塊2G的虛擬硬盤。

編寫drbd配置文件

drbd.conf    drbd的主配置文件

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf";
include "drbd.d/*.res";
這個文件中定義說drbd.d/*.res可以作爲配置文件的信息。

我們就選擇在drbd.d下創建一個mo.res,寫入如下內容。

resource mo {
meta-disk internal;     
device /dev/drbd1;       
syncer {
verify-alg sha1;        
}
on ha1.mo.com {
disk /dev/vda;
address 172.25.9.30:7789;
}
on  ha2.mo.com {
disk /dev/vda;
address 172.25.9.31:7789;
}
}
第一個resource mo定義的是這個資源和名字mo。device定義drbd的設備名字,syncer是同步數據的時候使用的校驗方式。接下來是定義兩個節點的信息。配置文件寫好後,仍然是要切記同步到另一個節點上去。


5.將mysql的存儲轉移到drbd存儲上

現在有了存儲我們就可以上真正的主角mysql服務了,因爲前面的那些準備工作就是爲了讓mysql更好的更穩定的運行。首先在各個節點下載mysql。然後開啓drbd服務,這個服務和別的服務有所不同,第一次開啓的時候要使用一條初始化命令。

[root@ha1 ~]# drbdadm create-md mo
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
啓動服務。

在另一邊也進行如上同樣的操作。使用下面命令可以觀察同步。

[root@ha1 ~]# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by [email protected], 2017-02-17 00:16:09

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2097052
現在使用硬盤。首先要將ha1節點設置爲primary節點
[root@ha1 ~]# drbdadm primary mo --force
第一次要強制讓ha1節點爲主節點。接下來就可以使用drbd設備了。

[root@ha1 ~]# mkfs.ext4 /dev/drbd1 
[root@ha1 ~]# mount /dev/drbd1 /mnt/
[root@ha1 ~]# df
Filesystem                   1K-blocks    Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  19134332 1202568  16959784   7% /
tmpfs                           510120       0    510120   0% /dev/shm
/dev/sda1                       495844   33463    436781   8% /boot
/dev/drbd1                     2064108   35840   1923416   2% /mnt
而且這個設備有直接格式化使用即可,不用分區。

接下來啓動mysql服務,爲了創建mysql的存儲文件。並且進入mysql創建一個庫,作爲一會驗證使用。之後關閉mysql,將/var/lib/mysql目錄下的文件都複製到/mnt下,也就是我們的drbd存儲。切記,mysql下不能有sock文件,如果有這個文件,會認爲mysql已經開啓,會導致服務啓動失敗。

[root@ha1 mnt]# ls
ibdata1  ib_logfile0  ib_logfile1  mo  mysql  test
現在就將mysql的存儲轉移到了drbd下,將/var/lib/mysql的文件刪除。並且將drbd下文件的屬主屬組都變成mysql。

[root@ha1 mnt]# ll
total 20492
-rw-r----- 1 mysql mysql 10485760 Feb 17 01:08 ibdata1
-rw-r----- 1 mysql mysql  5242880 Feb 17 01:08 ib_logfile0
-rw-r----- 1 mysql mysql  5242880 Feb 17 01:08 ib_logfile1
drwx------ 2 mysql mysql     4096 Feb 17 01:08 mo
drwx------ 2 mysql mysql     4096 Feb 17 01:08 mysql
drwx------ 2 mysql mysql     4096 Feb 17 01:08 test

現在將ha1設置爲secondary節點,ha2設置爲主節點。將/dev/drbd1掛載到/var/lib/mysql上。現在在ha2上開啓mysql。發現裏面確實有我們剛創建的數據庫。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo                 |
| mysql              |
| test               |
+--------------------+
現在drbd和mysql的手動切換已經成功了。接下來關閉mysql服務,卸載/dev/drbd1,讓ha2也變成secondary節點。

[root@ha2 ~]# cat /proc/drbd 
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by [email protected], 2017-02-17 00:16:09

 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:304 nr:2185208 dw:2185512 dr:4117 al:5 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
兩個節點均以變成secondary

6.將drbd,mysql加入heartbeat集羣

現在資源都有了,就是沒有將資源加入配置文件。首先停掉剛纔的heartbeat。然後修改haresources文件。

ha1.mo.com      IPaddr::172.25.9.200/24/eth0  drbddisk::mo Filesystem::/dev/drbd1::/var/lib/mysql::ext4 mysqld
上面就是集羣服務的配置,分別是ip,drbd,掛在,mysql。啓動集羣后就會按照這個順序進行服務的啓動。這些服務啓動腳本都放在/etc/ha.d/resource.d下面。現在將配置文件同步到另一個節點ha2。ha1,ha2都開啓heartbeat。

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:db:73:2d brd ff:ff:ff:ff:ff:ff
    inet 172.25.9.30/24 brd 172.25.9.255 scope global eth0
    inet 172.25.9.200/24 brd 172.25.9.255 scope global secondary eth0
    inet6 fe80::5054:ff:fedb:732d/64 scope link 
       valid_lft forever preferred_lft forever
通過查看ip可以看到,服務已經在ha1這臺機器上起來了。
7.對集羣進行一些測試。

(1)內核崩潰

echo c > /proc/sysrq-trigger

Feb 17 01:38:25 ha2 heartbeat: [3247]: WARN: node ha1.mo.com: is dead
Feb 17 01:38:25 ha2 heartbeat: [3247]: WARN: No STONITH device configured.
Feb 17 01:38:25 ha2 heartbeat: [3247]: WARN: Shared disks are not protected.
Feb 17 01:38:25 ha2 heartbeat: [3247]: info: Resources being acquired from ha1.mo.com.
Feb 17 01:38:25 ha2 ipfail: [3272]: info: Status update: Node ha1.mo.com now has status dead
Feb 17 01:38:25 ha2 heartbeat: [3247]: info: Link ha1.mo.com:eth0 dead.
上面就是內核壞掉後,ha2的日誌信息,先告訴ha1已經死了,沒有fence設備(STONITH),共享存儲沒有被保護,資源正在從ha1上被獲得,ha1的網卡已經死掉。接下來就是接管的信息了。測試一下ha2上mysql服務是否啓動正常。

由於沒有fence設備,我們不能讓ha1自動斷電,現在手動讓他斷電試試。斷電後啓動發現,heartbeat也都正常啓動了。所以這次測試成功。

(2)讓備份機器ha2的網卡壞掉

[root@ha1 ~]# ip link set eth0 down
ha2會發現自己無法收到ha1的心跳,他會認爲是ha1死掉了,然後想去接管設備,但是無法接管成功,在這期間,eth0會被啓動起來。所以就恢復了。ha1會認爲收到ha2的接管命令,但是沒有成功,所與取消被接管。

但是在測試三次後發現一個,網卡不能再啓動了,日誌中充斥着如下的信息。

而且將ha2 forceoff掉後再啓動會在開啓的時候出現如下信息:


(3)讓ha1主服務器的網卡壞掉

此時會出現ha1認爲ha2壞了,ha2認爲ha1壞了的情況,但是服務會正常的切換到ha2上去。












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章