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

來源:互聯網
上載者:User

標籤:

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://blog.csdn.net/reblue520/article/details/51143450);
# yum install -y ntp# vim /etc/ntp.conf加入如下內容:server 192.168.8.102restrict 192.168.8.102 nomodify notrap noqueryserver  127.127.1.0     # local clockfudge   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/authkeysauth 2   這裡的2與下面選項的數只要一致就可以了,沒有什麼限定2 sha1 8beffe603880f0a8# chmod 600 authkeys# vim /etc/ha.d/ha.cf    啟用以下參數及功能logfile /var/log/ha-log  #記錄檔,正常日誌資訊記錄到哪去的#logfacility    local0   #關閉該項日誌keepalive 1000ms   #每隔多長時間發送一次心跳資訊的,單位是秒,毫秒用msdeadtime 8    #隔多長時間探測到對方不線上就kill掉的時間間隔warntime 10   #警告時間udpport 694mcast eth0 225.0.0.1 694 1 0   #定義組播地址auto_failback on    #開啟故障轉回功能node web1.chinasoft.com   #定義兩個節點node web2.chinasoft.comping 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/haresourcesweb1.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]

可以參考:http://www.cerebris.com/blog/2011/02/14/cloning-a-heartbeat-server/
# rm /var/lib/heartbeat/hb_uuid
# service heartbeat restart


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.