歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> CentOS 6.5環境下heartbeat高可用集群的實現及工作原理詳解

CentOS 6.5環境下heartbeat高可用集群的實現及工作原理詳解

日期:2017/3/1 12:08:57   编辑:關於Linux
Linux HA Cluster高可用服務器集群,所謂的高可用不是主機的高可用,而是服務的高可用。


什麼叫高可用:一個服務器down掉的可能性多種多樣,任何一個可能壞了都有可能帶來風險,而服務器離線通常帶來的代價是很大的,尤其是web站點,所以當某一台提供服務的的服務器down掉不至於服務終止的就叫高可用。


什麼叫心跳:就是將多台服務器用網絡連接起來,而後每一台服務器都不停的將自己依然在線的信息很簡短很小的通告給同一個網絡中的備用服務器的主機,告訴其實主機自己依然在線,其它服務器收到這個心跳信息就認為本機是在線的,尤其是主服務器。


心跳信息怎麼發送,由誰來收,其實就是進程中的通信兩台主機是沒法通信的,只能利用網絡功能,通過進程監聽在某一套接字上,實現數據發送,數據請求,所以多台服務器就得運行同等的進程,這兩個進程不停的進行通信,主節點(主服務器)不停的向對方同等的節點發送自己的心跳信息,那這個軟件就叫高可用的集群的基准層次,也叫心跳信息傳遞層以及事物信息的傳遞層,這是運行在集群中的各節點上的進程,這個進程是個服務軟件,關機後需要將其啟動起來,主機間才可以傳遞信息的,一般是主節點傳給備節點。


所謂的資源:以web為例,vip是資源,web服務也是資源,還有網頁面也是資源,一個服務包括多個資源,而像web的共享存儲也是資源等等,不同的服務所需要的資源也是不同的,而共享存儲是高可用集群中最難解決的問題。


如是主節點掛了,多個備節點怎麼樣來選擇一個備節點來做為提供服務的一個節點呢,而這種應該選擇哪個備用節點來做為提供服務的機制就叫做集群事物決策的過程。


ha_aware:如果一個應用程序自己能夠利用底層心跳信息傳遞層的功能完成集群事物決策的過程的軟件就叫ha_aware。


DC:Designated Coordinator選定的協調員,當DC所在的主機掛了就會先選出一個DC,再由DC做出事物的決策。注意:在高可用集群中最核心的、最底層的管理的單位叫資源,把資源組合在一起來組合成一個服務。

高可用集群中任何資源都不應該自行啟動,而是由CRM管理啟動啟動的;
CRM:Cluster Resources Manager集群資源管理,真正做出決策的是CRM。
heartbeat v1版時就有了資源管理的概念,而v1版的資源就是heartbeat自帶的,叫haresources,這個文件是個配置文件;而這個配置文件接口就叫haresources;
當heartbeat v2第二版的時候,heartbeat被做了很大的改進,自己可以做為一個獨立進程來運行,並而可以通過它接收用戶請求,它就叫crm,在運行時它需要在各節點上運行一個叫crmd的進程,這個進程通常要監聽在一個套接字上,端口就是5560,所以服務器端叫crmd,而客戶端叫crm(可以稱為crm shell),是個命令行接口,通過這個命令行接口就可以跟服務器端的crm通信了,heartbeat也有它的圖形化界面工具,就叫heartbeat-GUI工具,通過這個界面就可以配置進行。
第三版heartbeat v3,被獨立成三個項目heartbeat、pacemaker(心髒起博器)、cluster-glue(集群的貼合器),架構分離開來了,可以結合其它的組件工作了。

RA:resource agent資源代理,其實就是能夠接收CRM的調度用於實現在節點上對某一個資源完成管理的工具,這個管理的工具通常是腳本,所以我們通常稱為資源代理。任何資源代理都要使用同一種風格,接收四個參數:{start|stop|restart|status},包括配置IP地址的也是。每個種資源的代理都要完成這四個參數據的輸出。
當某一個節點出現故障時,其上面的資源被自動轉移到其它正常的備用節點上並啟動的這個過程叫故障轉移,也稱為失效轉移(failover)。
如果出現故障的節點又回來的,那我們就要把這個節點添加回來,那這個添加回來的過程我們就叫失效轉回,也稱故障轉回(failback)。

資源爭用、資源隔離:
萬一集群發生分裂時,為了避免不再成為集群上的節點繼續使用資源而發生資源爭用情況,導致有掛載文件系統的系統文件發生崩潰,成為新的集群的就會給不再成為集群的節點補一槍,讓不是集群節點的服務死透,不再接收請求,這就叫stonith(shoot the other node in the head),而這種功能就叫資源隔離。爭用共享存儲的後果是非常嚴重的,輕則共享存儲崩潰,重則整個文件系統都崩潰,數據全部丟失。

資源隔離有兩種級別:
節點級別:這種就叫STONITH,這種就是不管怎麼樣直接把對方的電源給切斷,一般這種主機都是連接到電源交換機上的。
資源級別:這種需要依賴一些硬件設備來完成,比如連接到共享存儲的光纖交換機,把需要踢除出去的節點的光纖接口屏蔽了,這種就叫資源級別的隔離。
對於服務器左右分隔的這種情況通常稱為腦裂(brain-split),左右不協調了,在高可以用集群中避免資源爭用完成資源隔離是我們在設計高可用集群中必須要考濾的問題。

兩個節點的模式下,一旦發生集群分隔以後,其中一個節點發生故障,在我們無法判定哪個節點不正常的時候,而正常的節點一定是可以連到互聯網上去的,這樣的話就說明正常的節點是可以跟前端路由通信的,所以我們就把前端路由當成第三個節點,這裡我們稱為ping節點,當每個節點聯系到對方之後先去ping前端的節點,如果可以ping通,那就說明自己是正常的,就說明該節點是有多票法定票數的節點,而前端的ping節點就叫仲裁設備,幫助節點判斷哪個節點是優勝一方的,偶數節點數時就會借助於仲裁設備。
RHCS不是使用ping節點來判斷的,他是使用了一個共享存儲的設備,偶數個節點處於活動的節點不斷的往磁盤中寫數據,按照心跳信息頻率每隔一個信息頻率就往磁盤裡寫一個數據位,只要這個設備每隔一個心跳時間間隔就更新一次數據位,就說明這個設備處於活動狀態的,如果發現節點多次沒有寫數據位了就認為節點掛了,這種也叫仲裁設備(qdisk)。仲裁設備又有兩種:分別為ping node和qdisk;

信息層(Messaging Layer):主從兩個節點的心跳信息都要基於信息層來實現,也叫底層基礎架構層,用於傳遞心跳信息的,而能夠實現這種功能的有Corosync和heartbeat,corosync是openAIS的一個組件,
資源分配層(Resource Allocation):也叫資源管理器層,這層的核心組件叫CRM(Cluster Resourcce Manager集群資源管理器),CRM上必須有一個資源被推舉成為管理者的,叫Leader,它的工作是決策集群中的所有事物的,這裡稱為DC(Designated Coordinator指定協調員),任何DC上會額外運行兩個進程,一個叫PE(Policy Engine策略引擎),所謂策略引擎就是將底層信息層收集整個集群中所有節點上的信息在本地生成一個大圖big pic來策略節點運行在哪個節點上,並通知其實節點上的資源管理器來實現資源的啟動和關閉等操作;一個叫TE(Transition Engine 傳輸引擎),它主要是把PE做出的決策通告給對應節點的CRM;
集群資源管理器必須借助於Messageing Layer通告給每一個節點,自動的廣播或組播給每一個節點,這樣就保證了每一個節點上的信息都是一樣的,而這些數據在計算機中又怎麼樣來交互數據的呢,這裡就要基於擴展標記語言來實現數據的格式傳遞的,這種叫半結構化數據基於XML的,所以在各節點之間實現配置信息保存都是通過XML文件保存的,而要能夠理解這個XML文件保存的信息使用到一個工具叫CIB(Cluster Information Base集群信息庫);只要能連接到CRM上都可以去配置這個XML文件,首先它會先保存到DC的XML中,然後再由DC同步支每個節點上的XML文件中去的;
Resources層:而PE(策略引擎)就是根據XML這個庫來獲取資源的配置信息的,並通過Messaging Layer不獲取當前節點的活動信息,而後做出決策,一旦做得決策就要啟動資源了;所以PE借助於本地的Messaging Layer通知給其實節點的集群信息庫來實現對某些資源信息的傳遞,比如說通告其它CRM要啟動某一資源了,收到信息後CRM並不負責啟動,轉由LRM(Local Resource Manager本地資源管理)啟動,每個節點上都運行在這個LRM,而並發資源又借助於RA(Resource Agent資源代理)實現資源管理,這就是它的工作原理;CRM負責收集信息,推舉為DC的由PE運行,PE負責整合整個集群中的所有資源,並確保某些資源在合適的節點上運行起來,一旦做出決策就會通告給其它節點上的CRM,對應節點上的CRM收到通告以後會調用自己的LRM,由LRM指揮RA完成相關的操作;

那下面我們來實現heartbeat v1版本的工作過程:

安裝配置高可用集群:實現heartbeat v1版的過程

\

1、節點名稱很關鍵,集群每個節的名稱都得能互相解析;

用hosts文件,/etc/hosts:hosts中主機名的正反解析結果必須跟”uname -n”的結果保持一致;


2、時間必須得同步,使用網絡時間服務器同步時間到公司內部服務器,再次通過局域網同步時間(具體搭建過程可參考企業內部在centos7.2系統中配置NTP服務及內網服務器時間同步:http://www.2cto.com/os/201604/499445.html

# yum install -y ntp
# vim /etc/ntp.conf


加入如下內容:
server 192.168.8.102
restrict 192.168.8.102 nomodify notrap noquery
server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10


# service ntpd start
# service ntpd restart
手動同步一次時間,後續ntp會自動同步
# ntpdate -u 192.168.8.102


3、在主節點上配置虛擬IP(VIP)並安裝httpd服務:

兩台高可用節點IP
主節點:192.168.8.39 web1.chinasoft.com
備用節點:192.168.8.40 web2.chinasoft.com
在主節點配置虛擬VIP

ifconfig eth0:0 192.168.8.66/16 gw 192.168.8.254 up

安裝apache測試通過以後關閉apache服務,並且開機不啟動(因為httpd服務需要交給heartbeat服務管理)

# yum install -y httpd

# service httpd stop

# chkconfig httpd off


4、各節點間能基於ssh密鑰互相認證通信;

1)配置主機名:

第一台節點的主機名為web1.chinasoft.com,第二台節點的主機名為web2.chinasoft.com


# vim /etc/hosts 改主機名,注意,兩個節點都要添加,我幾個節點就加幾條解析
192.168.8.40 web2.chinasoft.com web2
192.168.8.39 web1.chinasoft.com web1
# uname -n
web2.chinasoft.com
# uname -n
web1.chinasoft.com
# cat /etc/sysconfig/network 如果這個與web1或2不一致就改一下,這個改配置文件保證下次系統重啟時主機名依然有效,
# 如果改好了沒有生效就ctrl+d注銷一下再登錄就OK了

2)兩台主機或多台主機基於ssh無密鑰通信

# ssh-keygen -t rsa -P ''   這個生成一個密碼為空的公鑰和一個密鑰,把公鑰復制到對方節點上即可
# ssh-copy-id -i .ssh/id_rsa.pub [email protected] 對方主機名用登錄用戶名


-----------------
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]


報錯
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for web2.chinasoft.com has changed,
and the key for the corresponding IP address 192.168.8.40
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
2b:58:e9:bd:28:e5:91:43:cb:67:47:dc:b9:92:e7:cd.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:2
RSA host key for web2.chinasoft.com has changed and you have requested strict checking.
Host key verification failed.


.ssh/known_hosts 裡面記錄的目標主機 key 值不正確。這是最普遍的情況,只要刪除對應的主機記錄就能恢復正常。
運行命令: # rm /root/.ssh/known_hosts
-----------------


兩台主機都要互相可以通信,所以兩台主機都得互相生成密鑰和復制公鑰,相互的節點上的hosts文件是都要解析對方的主機名:192.168.8.40 web2.chinasoft.com web2
192.168.8.39 web1.chinasoft.com web1
# ssh web2.chinasoft.com 'date';date
Thu Apr 14 14:51:36 CST 2016
Thu Apr 14 14:51:36 CST 2016


命令依賴軟件包安裝
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
-bash: ssh-copy-id: command not found
# yum install -y openssh-clients


3)安裝heartbeat v1版本的程序,兩個節點都要安裝上heartbeat的相關程序包

# 安裝這幾個包,但是存在依賴關系,需要解決:
heartbeat-2.1.4-12.el6.x86_64.rpm、heartbeat-pils-2.1.4-12.el6.x86_64.rpm、
heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
# 解決依賴關系:
# yum -y install perl-TimeDate net-snmp-libs libnet PyXML gettext-devel
如果找不到合適的包,就先安裝epel源信息
# yum install -y epel-release


# rpm -ivh heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm  heartbeat-2.1.4-12.el6.x86_64.rpm

報錯:
error: Failed dependencies:
libltdl.so.7()(64bit) is needed by heartbeat-pils-2.1.4-12.el6.x86_64
libltdl.so.7()(64bit) is needed by heartbeat-stonith-2.1.4-12.el6.x86_64
libltdl.so.7()(64bit) is needed by heartbeat-2.1.4-12.el6.x86_64


安裝 libtool-ltdl 即可
# yum install -y libtool-ltdl


一個高可用集群得依賴:1、信息層; 2、資源管理器;3、資源代理
我們配置的過程就按這種層次去配置就可以了;
這裡要注意的是:如何在網絡中我們期望的節點集群成為我們所需要的節點,在集群中信息不能隨便傳遞,而心跳節點是基於組播地址傳遞的,如果別人也裝了heartbeat也連接到這個組播地址上來,這都不安全,基於這種情況,我們各節點這間信息傳遞是需要認證的,這種認證基於HMAC(消息認證碼),消息認證碼是使用單向加密算動法來實現的,而單向加密一般有三類:crc(循環冗余校驗碼)、md5(信息摘要算法)、sha1。heartbeat基於udp協議,監聽在694端口上;

4)配置heartbeat

它的配置文件在/etc/ha.d/的目錄下,但是安裝完程序之後這個目錄下沒有這個配置文件,只有/usr/share/doc/heartbeat-2.1.4/目錄下有ha.cf的主配置文件樣本,復制到/etc下修改配置文件即可使用;還有一個authkeys的認證文件,這個文件就是我們各節點認證時所保存的認證密碼和認證機制,所以這個文件的權限至關重要,必須是600,否則啟動不了服務;第三個haresources,定義資源時需要資源管理器來讀取這個文件,所以這個也得有;

# cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,authkeys,haresources} /etc/ha.d/
# cd /etc/ha.d/
# openssl rand -hex 8   生成16位隨機數
8beffe603880f0a8
# vim /etc/ha.d/authkeys
auth 2   這裡的2與下面選項的數只要一致就可以了,沒有什麼限定
2 sha1 8beffe603880f0a8
# chmod 600 authkeys
# vim /etc/ha.d/ha.cf    啟用以下參數及功能
logfile /var/log/ha-log  #日志文件,正常日志信息記錄到哪去的
#logfacility    local0   #關閉該項日志
keepalive 1000ms   #每隔多長時間發送一次心跳信息的,單位是秒,毫秒用ms
deadtime 8    #隔多長時間探測到對方不在線就kill掉的時間間隔
warntime 10   #警告時間
udpport 694
mcast eth0 225.0.0.1 694 1 0   #定義組播地址
auto_failback on    #開啟故障轉回功能
node web1.chinasoft.com   #定義兩個節點
node web2.chinasoft.com
ping 192.168.8.254   #ping節點,可以設置成一個固定在線的IP比如配置成路由地址
compression     bz2    #壓縮格式
compression_threshold 2    #表示小於2K時不壓縮傳輸
定義資源:在資源管理器的配置文件中定義;/etc/ha.d/haresources,在/etc/ha.d/resource.d下有各種資源類型,當在資源配置文件中定義時就會調用這裡的資源類型來運行相應的程序;


# vim /etc/ha.d/haresources
web1.chinasoft.com 192.168.8.66 httpd   # 192.168.8.66這個是浮動地址
注:web1.chinasoft.com:說明哪台主機是主節點,更傾向於誰上面
[web1.chinasoft.com 192.168.8.66/16/eth0 httpd 也可以這樣定義
web2.chinasoft.com 192.168.8.40 httpd  httpd是怎麼被調用的呢:首先會找/etc/ha.d/resource.d目錄下,如果沒有就去/etc/init.d/目錄下找httpd,找到就start。]
# scp -p authkeys haresources ha.cf web1.chinasoft.com:/etc/ha.d
# service heartbeat start
# ssh web2.chinasoft.com 'service heartbeat start'

注意:

配置完成後需要等一段時間才能生效


\

結束:

當一個節點掛掉了,另一個節點就會頂上去,成為主節點,使用服務依然可以提供服務,而不會使用服務終止,這裡我們應該准備兩個節點不同的web頁面的內容加以區別,測試時我們把其中的別一個web服務終止,就可以看得出效果來了,heaetbeat會自動切換到別一個正常運行的節點上去斷續提供服務。

報錯處理(/var/log/ha-log):

heartbeat[4294]: 2016/04/14_19:11:53 ERROR: should_drop_message: attempted replay attack [web2.chinasoft.com]? [gen = 1460624833, curgen = 1460624839]
heartbeat[4294]: 2016/04/14_19:11:54 ERROR: should_drop_message: attempted replay attack [web2.chinasoft.com]? [gen = 1460624833, curgen = 1460624839]
heartbeat[4294]: 2016/04/14_19:11:55 ERROR: should_drop_message: attempted replay attack [web2.chinasoft.com]? [gen = 1460624833, curgen = 1460624839]


Copyright © Linux教程網 All Rights Reserved