一、HA Cluster定義
高可用叢集,英文原文為High Availability Cluster,簡稱HA Cluster,簡單的說,叢集(cluster)就是一組計算機,它們作為一個整體向使用者提供一組網絡資源。這些單個的計算機系統就是叢集的節點(node)。
高可用叢集的出現是為了使叢集的整體服務盡可能可用,進而減少由計算機硬體和軟體易錯性所帶來的損 失。如果某個節點失效,它的備援節點将在幾 秒鐘的時間内接管它的職責。高可用叢集軟體的主要作用就是實作故障檢查和業務切換的自動化。
配置HA Cluster之前需要先了解幾個基礎定義:
ha_aware:如果一個應用程式自己能夠利用底層心跳資訊傳遞層的功能完成叢集事務決策的程式;也就是說該程式自己具有HA的能力。反之;稱為非ha_aware。
不具有該能力時就需要借助其他程式或元件來完成叢集功能:
DC(Designated Coordinator):收集叢集中每一個節點的資訊;以此來判斷目前的節點數、服務數;以及對應服務運作于哪個節點等相關資訊;友善管理;是節點標明的協調員;起承上啟下的作用。
CRM(Cluster Resource Manager):CRM對于資源的配置對應的都有一個腳本或應用程式來執行
RA(Resource Agent):支援接收四個參數{start|stop|restart|status};對資源進行管理操作
LRM(Local Resource Manager):執行資源檢測等功能
下面直接上圖說明它們之間的關系:
<a href="http://s3.51cto.com/wyfs02/M02/24/8B/wKiom1NR9nTzN9vCAAHRorJwDc8891.jpg" target="_blank"></a>
CRM(Cluster Resource Manager):
heartbeat
heartbeat v1: haresources(配置接口:配置檔案;檔案名haresoucres)
heartbeat v2: crm(各節點運作程序:crmd(tcp/5560);用戶端:crmsh heartbeat-GUI)
heartbeat v3 = heartbeat + pacemaker + cluster-glue
cman + rgmanager:
resource group manager:Failover Domain(故障轉移域)
RHCS(RedHat Cluster Suite):Conga(完全生命周期的配置接口)
二、安裝配置heartbeat v1實作web叢集服務:
大緻規劃:
node1:172.16.251.85
node2:172.16.251.86
node3:172.16.251.87(NFS)
VIP: 172.16.251.111
這裡沒有用到node3;隻是作為NFS使用的。
系統版本:CentOS 6.5 x86_84
有幾點需要注意的
節點名稱
叢集每個節點的名稱都需要互相能解析;更改/etc/hosts;需與"uname -n"一緻
時間同步
可以使用網絡時間伺服器同步
密鑰認證
節點間需要基于ssh認證;友善管理;并非必須
多節點管理
後續需要可以使用ansible軟體來管理;基于ssh密鑰認證
1
2
3
4
5
6
7
8
9
10
11
<code>[root@node1 heartbeat2]</code><code># uname -n</code>
<code>node1.soul.com</code>
<code>[root@node1 heartbeat2]</code><code># cat /etc/hosts</code>
<code>127.0</code><code>.</code><code>0.1</code> <code>localhost localhost.localdomain localhost4 localhost4.localdomain4</code>
<code>::</code><code>1</code> <code>localhost localhost.localdomain localhost6 localhost6.localdomain6</code>
<code>172.16</code><code>.</code><code>251.85</code> <code>node1.soul.com node1 </code><code>#node1為别名;各節點都需要配置</code>
<code>172.16</code><code>.</code><code>251.86</code> <code>node2.soul.com node2</code>
<code>172.16</code><code>.</code><code>251.87</code> <code>node3.soul.com node3</code>
<code>[root@node1 heartbeat2]</code><code>#</code>
<code> </code>
<code>#</code>
12
13
14
15
16
17
<code>#基于SSH認證</code>
<code>[root@node1 ~]</code><code># ssh-keygen -t rsa</code>
<code>Generating public</code><code>/</code><code>private rsa key pair.</code>
<code>Enter </code><code>file</code> <code>in</code> <code>which to save the key (</code><code>/</code><code>root</code><code>/</code><code>.ssh</code><code>/</code><code>id_rsa):</code>
<code>Enter passphrase (empty </code><code>for</code> <code>no passphrase): </code><code>#一路回車留白即可</code>
<code>Enter same passphrase again:</code>
<code>Your identification has been saved </code><code>in</code> <code>/</code><code>root</code><code>/</code><code>.ssh</code><code>/</code><code>id_rsa.</code>
<code>...</code>
<code>[root@node1 ~]</code><code># ssh-copy-id -i .ssh/id_rsa.pub root@node2</code>
<code>#第一次傳輸拷貝時需要輸入密碼;後續就無需輸入了</code>
<code>#在對應的node2上執行與node1一樣的操作;兩台主機互相做認證</code>
<code> </code>
<code>#測試</code>
<code>[root@node1 ~]</code><code># ssh node2 'date';date</code>
<code>Fri Apr </code><code>18</code> <code>19</code><code>:</code><code>17</code><code>:</code><code>30</code> <code>CST </code><code>2014</code>
<code>[root@node1 ~]</code><code># 時間一定需要保持一緻</code>
安裝heartbeat基本軟體
18
19
20
21
22
23
24
<code>[root@node1 heartbeat2]</code><code># ls</code>
<code>heartbeat</code><code>-</code><code>2.1</code><code>.</code><code>4</code><code>-</code><code>12.el6</code><code>.x86_64.rpm </code><code>#核心程式 </code>
<code>heartbeat</code><code>-</code><code>ldirectord</code><code>-</code><code>2.1</code><code>.</code><code>4</code><code>-</code><code>12.el6</code><code>.x86_64.rpm </code><code>#實作director HA的</code>
<code>heartbeat</code><code>-</code><code>pils</code><code>-</code><code>2.1</code><code>.</code><code>4</code><code>-</code><code>12.el6</code><code>.x86_64.rpm </code><code>#庫檔案</code>
<code>heartbeat</code><code>-</code><code>devel</code><code>-</code><code>2.1</code><code>.</code><code>4</code><code>-</code><code>12.el6</code><code>.x86_64.rpm </code><code>#開發元件</code>
<code>heartbeat</code><code>-</code><code>stonith</code><code>-</code><code>2.1</code><code>.</code><code>4</code><code>-</code><code>12.el6</code><code>.x86_64.rpm </code><code>#資源管理</code>
<code>heartbeat</code><code>-</code><code>gui</code><code>-</code><code>2.1</code><code>.</code><code>4</code><code>-</code><code>12.el6</code><code>.x86_64.rpm </code><code>#圖形配置界面</code>
<code>#由于centos6.5版本的cluster-glue-libs包與pils沖突;但是又必須依賴pils</code>
<code>#是以這裡先用yum解決依賴關系;在rpm安裝;目前隻安裝pils、stonith和核心包</code>
<code> </code>
<code># yum install perl-TimeDate net-snmp-libs libnet PyXML</code>
<code># rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm ...</code>
<code>[root@node1 ~]</code><code># rpm -ql heartbeat 安裝完成檢視生成的檔案</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>README.config</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>harc</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>rc.d</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>rc.d</code><code>/</code><code>ask_resources</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>rc.d</code><code>/</code><code>hb_takeover</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>rc.d</code><code>/</code><code>ip</code><code>-</code><code>request</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>rc.d</code><code>/</code><code>ip</code><code>-</code><code>request</code><code>-</code><code>resp</code>
<code>/</code><code>etc</code><code>/</code><code>ha.d</code><code>/</code><code>rc.d</code><code>/</code><code>status</code>
配置heartbeat的認證密碼
<code>#拷貝配置檔案到/etc/ha.d目錄</code>
<code>[root@node1 ~]</code><code># cp /usr/share/doc/heartbeat-2.1.4/{haresources,authkeys,ha.cf} /etc/ha.d/</code>
<code>#haresources 資料總管</code>
<code>#authkeys 認證檔案</code>
<code>#ha.cf 主配置檔案</code>
<code>[root@node1 ~]</code><code># cd /etc/ha.d/</code>
<code>[root@node1 ha.d]</code><code># vim authkeys</code>
<code>auth </code><code>2</code> <code>#啟用第二項sha1加密</code>
<code>#1 crc</code>
<code>2</code> <code>sha1 a443995f092077eca1b4 </code><code>#密碼</code>
<code>#3 md5 Hello!</code>
<code>[root@node1 ha.d]</code><code># chmod 600 authkeys #更改權限;很重要</code>
主配置檔案說明
<code>[root@node1 ha.d]</code><code># vim ha.cf</code>
<code># File to write other messages to</code>
<code>logfile </code><code>/</code><code>var</code><code>/</code><code>log</code><code>/</code><code>ha</code><code>-</code><code>log </code><code>#日志檔案;開啟</code>
<code>keepalive </code><code>1</code> <code>#定義規定時間發送心跳資訊;機關s</code>
<code>deadtime </code><code>5</code> <code>#定義機關時間内對方無心跳資訊;stonith對方</code>
<code>warntime </code><code>3</code> <code>#警告時間</code>
<code>initdead </code><code>60</code> <code>#開機後機關時間後傳遞心跳資訊;機關s</code>
<code>udpport </code><code>694</code> <code>#監聽的端口</code>
<code>#bcast #廣播位址</code>
<code>mcast eth0 </code><code>225.0</code><code>.</code><code>40.1</code> <code>694</code> <code>1</code> <code>0</code> <code>#定義多點傳播位址</code>
<code>#ucast #單點傳播</code>
<code>auto_failback on </code><code>#故障轉回</code>
<code>node node1.soul.com </code><code>#節點數</code>
<code>node node2.soul.com</code>
<code>ping </code><code>172.16</code><code>.</code><code>0.1</code> <code>#ping節點仲裁裝置;因為節點為2台</code>
<code>compression bz2 </code><code>#壓縮傳送心跳</code>
<code>compression_threshold </code><code>2</code> <code>#2K以上才進行壓縮</code>
<code> </code>
<code>#本次這樣配置;詳細資訊檔案内有說明</code>
定義cluster服務
<code>[root@node1 ha.d]</code><code># vim haresources</code>
<code>#定義很簡單;在檔案末尾添加</code>
<code>node1.soul.com </code><code>172.16</code><code>.</code><code>251.111</code><code>/</code><code>16</code><code>/</code><code>eth0 httpd</code>
<code>#節點 VIP 掩碼 網卡 服務</code>
<code>#具體檔案内有例子可以參考</code>
<code>[root@node1 ha.d]</code><code># scp -p haresources ha.cf authkeys node2:/etc/ha.d/</code>
<code>#複制到node2上;并保持原有屬性</code>
<code>haresources </code><code>100</code><code>%</code> <code>5949</code> <code>5.8KB</code><code>/</code><code>s </code><code>00</code><code>:</code><code>00</code>
<code>ha.cf </code><code>100</code><code>%</code> <code>10KB</code> <code>10.3KB</code><code>/</code><code>s </code><code>00</code><code>:</code><code>00</code>
<code>authkeys </code><code>100</code><code>%</code> <code>660</code> <code>0.6KB</code><code>/</code><code>s </code><code>00</code><code>:</code><code>00</code>
<code>[root@node1 ha.d]</code><code>#</code>
配置每個節點的httpd服務
<code>[root@node1 ~]</code><code># vim /var/www/html/index.html</code>
<code><h1>Node1.soul.com<</code><code>/</code><code>h1></code>
<code>#這裡為了試驗;是以設定兩個index檔案不同;且需要關閉服務開啟自動啟動</code>
<code>#因為叢集會自動控***務啟動/關閉</code>
<code>[root@node1 ~]</code><code># chkconfig httpd off</code>
<code>[root@node1 ~]</code><code>#</code>
<code> </code>
<code>#node2節點配置</code>
<code>[root@node2 ~]</code><code># vim /var/www/html/index.html</code>
<code><h1>Node2.soul.com<</code><code>/</code><code>h1></code>
<code>[root@node2 ~]</code><code># chkconfig httpd off</code>
<code>[root@node2 ~]</code><code>#</code>
<code>#配置好後需要進行測試;這裡就不列出</code>
三、啟動測試heartbeat
啟動測試
25
<code>[root@node1 ~]</code><code># service heartbeat start</code>
<code>Starting High</code><code>-</code><code>Availability services:</code>
<code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>01</code><code>:</code><code>59</code> <code>INFO: Resource </code><code>is</code> <code>stopped</code>
<code>Done.</code>
<code>#啟動node1</code>
<code>[root@node1 ~]</code><code># ssh node2 'service heartbeat start'</code>
<code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>02</code><code>:</code><code>38</code> <code>INFO: Resource </code><code>is</code> <code>stopped</code>
<code>#啟動node2;這裡使用的是别名;可以寫完整;node2.soul.com</code>
<code> </code>
<code>[root@node1 ~]</code><code># tail -40 /var/log/ha-log</code>
<code>IPaddr[</code><code>12178</code><code>]: </code><code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>02</code><code>:</code><code>54</code> <code>INFO: Using calculated netmask </code><code>for</code> <code>172.16</code><code>.</code><code>251.111</code><code>: </code><code>255.255</code><code>.</code><code>0.0</code>
<code>IPaddr[</code><code>12178</code><code>]: </code><code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>02</code><code>:</code><code>54</code> <code>INFO: </code><code>eval</code> <code>ifconfig eth0:</code><code>0</code> <code>172.16</code><code>.</code><code>251.111</code> <code>netmask </code><code>255.255</code><code>.</code><code>0.0</code> <code>broadcast </code><code>172.16</code><code>.</code><code>255.255</code>
<code>IPaddr[</code><code>12149</code><code>]: </code><code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>02</code><code>:</code><code>55</code> <code>INFO: Success</code>
<code>ResourceManager[</code><code>12055</code><code>]: </code><code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>02</code><code>:</code><code>55</code> <code>info: Running </code><code>/</code><code>etc</code><code>/</code><code>init.d</code><code>/</code><code>httpd start</code>
<code>[root@node1 ~]</code><code># 可以檢視日志資訊</code>
<code>[root@node1 ~]</code><code># ss -tunl | grep 80</code>
<code>tcp LISTEN </code><code>0</code> <code>128</code> <code>:::</code><code>80</code> <code>:::</code><code>*</code>
<code>tcp LISTEN </code><code>0</code> <code>128</code> <code>:::</code><code>34580</code> <code>:::</code><code>*</code>
<code>[root@node1 ~]</code><code># ifconfig | grep "172.16.251.111"</code>
<code> </code><code>inet addr:</code><code>172.16</code><code>.</code><code>251.111</code> <code>Bcast:</code><code>172.16</code><code>.</code><code>255.255</code> <code>Mask:</code><code>255.255</code><code>.</code><code>0.0</code>
<code>#測試都啟動正常</code>
<a href="http://s3.51cto.com/wyfs02/M01/24/88/wKiom1NRLkawpf10AADCPoAfUmg648.jpg" target="_blank"></a>
因為上面設定的是在node1上;是以顯示為node1.
測試轉移
<code>#在node2上停止node1</code>
<code>[root@node1 ~]</code><code># /usr/share/heartbeat/hb_standby local</code>
<code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>51</code><code>:</code><code>04</code> <code>Going standby [local].</code>
<code>[root@node2 ~]</code><code># ifconfig</code>
<code>eth0:</code><code>0</code> <code>Link encap:Ethernet HWaddr </code><code>00</code><code>:</code><code>0C</code><code>:</code><code>29</code><code>:DF:</code><code>70</code><code>:B6</code>
<code> </code><code>UP BROADCAST RUNNING MULTICAST MTU:</code><code>1500</code> <code>Metric:</code><code>1</code>
<code>#測試node2上已啟動服務和VIP</code>
<a href="http://s3.51cto.com/wyfs02/M00/24/88/wKiom1NRMEjz2MjBAADLGcNucVk408.jpg" target="_blank"></a>
四、挂載NFS系統;實作共享存儲
共享NFS系統
<code>#建立一個node3;實作NFS;配置資訊這裡就不做解釋</code>
<code>[root@node3 ~]</code><code># mkdir /www/htdocs -pv</code>
<code>mkdir: created directory `</code><code>/</code><code>www'</code>
<code>mkdir: created directory `</code><code>/</code><code>www</code><code>/</code><code>htdocs'</code>
<code>[root@node3 ~]</code><code># vim /etc/exports</code>
<code>/</code><code>www</code><code>/</code><code>htdocs </code><code>172.16</code><code>.</code><code>0.0</code><code>/</code><code>16</code><code>(rw)</code>
<code> </code>
<code>[root@node3 ~]</code><code># setfacl -m u:48:rwx /www/htdocs/</code>
<code>[root@node3 ~]</code><code># getfacl /www/htdocs/</code>
<code>getfacl: Removing leading </code><code>'/'</code> <code>from</code> <code>absolute path names</code>
<code># file: www/htdocs/</code>
<code># owner: root</code>
<code># group: root</code>
<code>user::rwx</code>
<code>user:apache:rwx</code>
<code>[root@node3 ~]</code><code># vim /www/htdocs/index.html</code>
<code><h1>Page </code><code>in</code> <code>NFS Server<</code><code>/</code><code>h1></code>
<code>[root@node3 ~]</code><code># service nfs restart</code>
<code>Shutting down NFS daemon: [ OK ]</code>
<code>Shutting down NFS mountd: [ OK ]</code>
<code>Shutting down NFS quotas: [ OK ]</code>
<code>Shutting down NFS services: [ OK ]</code>
修改叢集管理資訊
<code>#停止heartbeat服務</code>
<code>[root@node1 ~]</code><code># vim /etc/ha.d/haresources</code>
<code>node1.soul.com </code><code>172.16</code><code>.</code><code>251.111</code><code>/</code><code>16</code><code>/</code><code>eth0 Filesystem::</code><code>172.16</code><code>.</code><code>251.87</code><code>:</code><code>/</code><code>www</code><code>/</code><code>htdocs::</code><code>/</code><code>var</code><code>/</code><code>www</code><code>/</code><code>html::nfs httpd</code>
<code>[root@node1 ~]</code><code># scp /etc/ha.d/haresources node2:/etc/ha.d/</code>
<code>#複制一份到node2</code>
<code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>26</code><code>:</code><code>50</code> <code>INFO: Resource </code><code>is</code> <code>stopped</code>
<code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>26</code><code>:</code><code>59</code> <code>INFO: Resource </code><code>is</code> <code>stopped</code>
測試
<a href="http://s3.51cto.com/wyfs02/M01/24/88/wKioL1NRLD3DNAEnAADOI8_WzFI698.jpg" target="_blank"></a>
<code>2014</code><code>/</code><code>04</code><code>/</code><code>18_21</code><code>:</code><code>45</code><code>:</code><code>23</code> <code>Going standby [local].</code>
<code>#在node2上檢視80端口已啟動;測試頁面正常</code>
<code>[root@node2 ~]</code><code># ss -tunl | grep 80</code>
本文轉自Mr_陳 51CTO部落格,原文連結:http://blog.51cto.com/chenpipi/1398394,如需轉載請自行聯系原作者