實驗環境:
OS : CentOS 6.6
corosync: corosync-1.4.7-1.el6.x86_64
pacemaker:pacemaker-1.1.12-4.el6.x86_64
crmsh:crmsh-2.1-1.6.x86_64.rpm
pssh: pssh-2.3.1-2.el6.x86_64.rpm
node1:
hostname: node2.1inux.com
IP :172.16.66.81
node2:
IP : 172.16.66.82
一、前期環境配置
為了配置一台Linux主機成為HA的節點,通常需要做出如下的準備工作:
1)所有節點的主機名稱和對應的IP位址解析服務可以正常工作,且每個節點的主機名稱需要跟"uname -n“指令的結果保持一緻;是以,需要保證兩個節點上的/etc/hosts檔案均為下面的内容:
<code>172.16.66.81 node1.1inux.com node1</code>
<code>172.16.66.82 node2.1inux.com node2</code>
為了使得重新啟動系統後仍能保持如上的主機名稱,還分别需要在各節點執行類似如下的指令:
<code>Node1:</code>
<code># sed -i </code><code>'s@\(HOSTNAME=\).*@\1node1.1inux.com@g'</code> <code>/etc/sysconfig/network</code>
<code># hostname node1.1inux.com</code>
<code>Node2:</code>
<code># sed -i </code><code>'s@\(HOSTNAME=\).*@\1node2.1inux.com@g'</code> <code>/etc/sysconfig/network</code>
<code># hostname node2.1inux.com</code>
2、設定 node1 、node2基于ssh秘鑰的認證的配置
<code>Node1:</code>
<code>[root@node1 ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -P </code><code>''</code>
<code>[root@node1 ~]# ssh-</code><code>copy</code><code>-id -i /root/.ssh/id_rsa.pub [email protected]</code>
<code>[root@node2 ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -P </code><code>''</code>
<code>[root@node2 ~]# ssh-</code><code>copy</code><code>-id -i /root/.ssh/id_rsa.pub [email protected]</code>
3、時間同步配置
<code>[root@node1 yum.repos.d]# ntpdate 172.16.0.1 ; ssh node2 </code><code>'ntpdate 172.16.0.1'</code>
<code>30 May 16:20:20 ntpdate[2351]: adjust time server 172.16.0.1 offset 0.195961 sec</code>
<code>30 May 16:20:21 ntpdate[1994]: step time server 172.16.0.1 offset 1.033553 sec</code>
<code>[root@node1 yum.repos.d]#</code>
驗證時間同步:
<code>[root@node2 ~]# </code><code>date</code><code>; ssh node1 </code><code>"date"</code>
<code>Sat May 30 16:51:13 CST 2015</code>
<code>[root@node2 ~]#</code>
二、安裝配置 corosync 、pacemaker
1、安裝corosync pacemaker
<code>在node1 上面安裝:</code>
<code>[root@node1 ~]# yum -y install corosync pacemaker</code>
<code>在node2上安裝</code>
<code>[root@node2 ~]# yum -y install corosync pacemaker</code>
<code>===========================</code>
<code>檢視安裝生成的檔案</code>
<code>[root@node2 ~]# rpm -ql corosync</code>
<code>/etc/corosync</code>
<code>/etc/corosync/corosync.conf.example </code><code>//樣例配置檔案</code>
<code>/etc/corosync/corosync.conf.example.udpu </code><code>//</code>
<code>/etc/corosync/service.d </code><code>//服務腳本</code>
<code>/etc/corosync/uidgid.d</code>
<code>/etc/dbus-1/system.d/corosync-signals.conf</code>
<code>/etc/rc.d/init.d/corosync </code><code>//服務檔案</code>
<code>/etc/rc.d/init.d/corosync-notifyd</code>
<code>/etc/sysconfig/corosync-notifyd</code>
<code>/usr/bin/corosync-blackbox</code>
<code>/usr/libexec/lcrso</code>
<code>...</code>
<code>/usr/sbin/corosync</code>
<code>/usr/sbin/corosync-cfgtool</code>
<code>/usr/sbin/corosync-cpgtool</code>
<code>/usr/sbin/corosync-fplay</code>
<code>/usr/sbin/corosync-keygen</code>
<code>/usr/sbin/corosync-notifyd</code>
<code>/usr/sbin/corosync-objctl</code>
<code>/usr/sbin/corosync-pload</code>
<code>/usr/sbin/corosync-quorumtool</code>
<code>....</code>
<code>/</code><code>var</code><code>/lib/corosync</code>
<code>/</code><code>var</code><code>/log/cluster</code>
2、配置corosync ,以下操作在在node2 上操作
<code>[root@node2 ~]# cd /etc/corosync/</code>
<code>[root@node2 corosync]# cp corosync.conf.example corosync.conf</code>
<code>[root@node2 corosync]# vim corosync.conf</code>
<code># Please read the corosync.conf.5 manual page</code>
<code>compatibility: whitetank</code>
<code>totem {</code>
<code> </code><code>version: 2</code>
<code> </code><code># secauth: Enable mutual node authentication. If you choose to</code>
<code> </code><code># enable this (</code><code>"on"</code><code>), then </code><code>do</code> <code>remember to create a shared</code>
<code> </code><code># secret with </code><code>"corosync-keygen"</code><code>.</code>
<code> </code><code>secauth: on </code><code>//開啟安全認證 </code>
<code> </code><code>threads: 0 </code><code>//線程數 0 表示不基于線程模式工作而是程序</code>
<code> </code><code># </code><code>interface</code><code>: define at least one </code><code>interface</code> <code>to communicate</code>
<code> </code><code># over. If you define more than one </code><code>interface</code> <code>stanza, you must</code>
<code> </code><code># also set rrp_mode.</code>
<code> </code><code>interface</code> <code>{</code>
<code> </code><code># Rings must be consecutively numbered, starting at 0.</code>
<code> </code><code>ringnumber: 0 </code><code>//環數目 一般保持為0</code>
<code> </code><code># This is normally the *network* address of the</code>
<code> </code><code># </code><code>interface</code> <code>to bind to. This ensures that you can </code><code>use</code>
<code> </code><code># identical instances of this configuration file</code>
<code> </code><code># across all your cluster nodes, without having to</code>
<code> </code><code># modify this option.</code>
<code> </code><code>bindnetaddr: 172.16.0.0 </code><code>//網絡位址 更改為主機所在網絡的網絡位址</code>
<code> </code><code># However, </code><code>if</code> <code>you have multiple physical network</code>
<code> </code><code># interfaces configured </code><code>for</code> <code>the same subnet, then the</code>
<code> </code><code># network address alone is not sufficient to identify</code>
<code> </code><code># the </code><code>interface</code> <code>Corosync should bind to. In that </code><code>case</code><code>,</code>
<code> </code><code># configure the *host* address of the </code><code>interface</code>
<code> </code><code># instead:</code>
<code> </code><code># bindnetaddr: 192.168.1.1</code>
<code> </code><code># When selecting a multicast address, consider RFC</code>
<code> </code><code># 2365 (which, among other things, specifies that</code>
<code> </code><code># 239.255.x.x addresses are left to the discretion of</code>
<code> </code><code># the network administrator). Do not reuse multicast</code>
<code> </code><code># addresses across multiple Corosync clusters sharing</code>
<code> </code><code># the same network.</code>
<code> </code><code>mcastaddr: 239.235.88.8 </code><code>//多點傳播位址 </code>
<code> </code><code># Corosync uses the port you specify here </code><code>for</code> <code>UDP</code>
<code> </code><code># messaging, </code><code>and</code> <code>also the immediately preceding</code>
<code> </code><code># port. Thus </code><code>if</code> <code>you set this to 5405, Corosync sends</code>
<code> </code><code># messages over UDP ports 5405 </code><code>and</code> <code>5404.</code>
<code> </code><code>mcastport: 5405 </code><code>//多點傳播位址監聽端口</code>
<code> </code><code># Time-to-live </code><code>for</code> <code>cluster communication packets. The</code>
<code> </code><code># number of hops (routers) that this ring will allow</code>
<code> </code><code># itself to pass. Note that multicast routing must be</code>
<code> </code><code># specifically enabled on most network routers.</code>
<code> </code><code>ttl: 1</code>
<code> </code><code>}</code>
<code>}</code>
<code>logging {</code>
<code> </code><code># Log the source file </code><code>and</code> <code>line where messages are being</code>
<code> </code><code># generated. When in doubt, leave off. Potentially useful </code><code>for</code>
<code> </code><code># debugging.</code>
<code> </code><code>fileline: off</code>
<code> </code><code># Log to standard error. When in doubt, set to no. Useful when</code>
<code> </code><code># running in the foreground (when invoking </code><code>"corosync -f"</code><code>)</code>
<code> </code><code>to_stderr: no</code>
<code> </code><code># Log to a log file. When set to </code><code>"no"</code><code>, the </code><code>"logfile"</code> <code>option</code>
<code> </code><code># must not be set.</code>
<code> </code><code>to_logfile: yes </code><code>//是否記錄日志 </code>
<code> </code><code>logfile: /</code><code>var</code><code>/log/cluster/corosync.log </code><code>//日志檔案儲存位置</code>
<code> </code><code># Log to the system log daemon. When in doubt, set to yes.</code>
<code> </code><code>to_syslog: no </code><code>//是否記錄系統日志 一般隻記錄一份 設定為NO </code>
<code> </code><code># Log debug messages (very verbose). When in doubt, leave off.</code>
<code> </code><code>debug: off</code>
<code> </code><code># Log messages with time stamps. When in doubt, set to on</code>
<code> </code><code># (unless you are only logging to syslog, where double</code>
<code> </code><code># timestamps can be annoying).</code>
<code> </code><code>timestamp: on </code><code>//是否開啟時間戳功能</code>
<code> </code><code>logger_subsys {</code>
<code> </code><code>subsys: AMF</code>
<code> </code><code>debug: off</code>
<code>//添加如下行 使pacemaker 以corosync插件方式運作 </code>
<code>service {</code>
<code> </code><code>ver: 0</code>
<code> </code><code>name: pacemaker</code>
<code> </code><code>use_mgmtd: yes</code>
<code> </code><code>}</code>
<code> </code>
<code>aisexec {</code>
<code> </code><code>user: root</code>
<code> </code><code>group: root</code>
<code> </code><code>}</code>
<code>=======================================</code>
生成corosync的密鑰檔案
檢視 # corosync-keygen使用方法:
corosync-keygen是從/dev/random中讀取随機數,如果此熵池中随機數過少,可能導緻無法生成密鑰,但可以通過下載下傳軟體或其他方案來産生大量I/O進而增加熵池中的随機數,編譯生成密鑰
<code>[root@node2 ~]# corosync-keygen</code>
<code>.....</code>
<code>Press keys on your keyboard to generate entropy (bits = 896).</code>
<code>Press keys on your keyboard to generate entropy (bits = 960).</code>
<code>Writing corosync key to /etc/corosync/authkey. </code><code>//生成的密鑰檔案儲存的位置</code>
3、檢視網卡是否開啟了多點傳播MULTICAST功能如果沒有開啟,要手動開啟
<code>[root@node2 corosync]# ip link show</code>
<code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN </code>
<code> </code><code>link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</code>
<code>2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>
<code> </code><code>link/ether 00:0c:29:3d:a9:a1 brd ff:ff:ff:ff:ff:ff</code>
<code>[root@node2 corosync]#</code>
4、将corosync.conf 和authkey複制到node1中
<code>[root@node2 corosync]# scp authkey corosync.conf node1:/etc/corosync/</code>
<code>authkey 100% 128 0.1KB/s 00:00 </code>
<code>corosync.conf 100% 2773 2.7KB/s 00:00 </code>
三、安裝crmsh
RHEL自6.4起不再提供叢集的指令行配置工具crmsh,轉而使用pcs;是以如果想使用crmsh可以自行安裝:
分别在node1和node2 上安裝crmsh和pssh
<code>[root@node2 ~]# ls</code>
<code>anaconda-ks.cfg crmsh-2.1-1.6.x86_64.rpm install.log install.log.syslog pssh-2.3.1-2.el6.x86_64.rpm</code>
<code>[root@node2 ~]# yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm</code>
将此兩個安裝檔案複制到node1上進行安裝
<code>[root@node2 ~]# scp crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm node1:/root/</code>
<code>[root@node1 ~]# yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm</code>
檢視安裝crmsh生成的檔案
<code>----------------------</code>
<code>[root@node1 ~]# rpm -ql crmsh</code>
<code>/etc/bash_completion.d/crm.sh</code>
<code>/etc/crm</code>
<code>/etc/crm/crm.conf</code>
<code>/usr/sbin/crm</code>
<code>/usr/share/crmsh</code>
<code>/</code><code>var</code><code>/cache/crm</code>
<code>---------------------------</code>
檢視pssh生成的檔案
<code>[root@node1 ~]# rpm -ql pssh</code>
<code>/usr/bin/pnuke</code>
<code>/usr/bin/prsync</code>
<code>/usr/bin/pscp.pssh</code>
<code>/usr/bin/pslurp</code>
<code>/usr/bin/pssh</code>
<code>/usr/libexec/pssh</code>
<code>/usr/libexec/pssh/pssh-askpass</code>
<code>[root@node1 ~]#</code>
四、驗證:
1、啟動 corosync
<code>[root@node1 ~]# service corosync start</code>
<code>Starting Corosync Cluster Engine (corosync): [ OK ]</code>
2、驗證端口:
<code>[root@node1 log]# ss -tunl | grep :5405</code>
<code>udp UNCONN 0 0 172.16.66.82:5405 *:* </code>
<code>udp UNCONN 0 0 239.235.1.8:5405 *:* </code>
<code>[root@node2 log]#</code>
3、檢視corosync引擎是否正常啟動:
<code># grep -e </code><code>"Corosync Cluster Engine"</code> <code>-e </code><code>"configuration file"</code> <code>/</code><code>var</code><code>/log/cluster/corosync.log</code>
如圖 3
<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VySLagJG-EAAEPxmZ_ci4947.jpg" target="_blank"></a>
4、檢視初始化成員節點通知是否正常發出:
如圖4
<a href="http://s3.51cto.com/wyfs02/M01/6E/08/wKioL1VySm3BrmemAAD6VlsYOaQ933.jpg" target="_blank"></a>
5、檢查啟動過程中是否有錯誤産生。下面的錯誤資訊表示packmaker不久之後将不再作為corosync的插件運作,是以,建議使用cman作為叢集基礎架構服務;此處可安全忽略。
圖5
<a href="http://s3.51cto.com/wyfs02/M01/6E/0C/wKiom1VySN_zticiAAGkyQFoPCg370.jpg" target="_blank"></a>
6、檢視pacemaker是否正常啟動,圖6
<a href="http://s3.51cto.com/wyfs02/M02/6E/0C/wKiom1VySPrwiP_9AACIIVwqar4196.jpg" target="_blank"></a>
如果上面指令執行均沒有問題,接着可以執行如下指令啟動node2上的corosync
[root@node1 ~]# ssh node2 -- /etc/init.d/corosync start
注意:啟動node2需要在node1上使用如上指令進行,不要在node2節點上直接啟動。
使用crmsh指令檢視叢集節點的啟動狀态
圖7
<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyStvgfjz_AAEuHwIoBrc381.jpg" target="_blank"></a>
五、配置叢集的工作屬性
1、corosync預設啟用了stonith,而目前叢集并沒有相應的stonith裝置,是以此預設配置目前尚不可用,這可以通過如下指令驗正:
<a href="http://s3.51cto.com/wyfs02/M00/6E/08/wKioL1VySy_RE0iAAAFNqqYMgRE553.jpg" target="_blank"></a>
禁用後檢視
# crm configure property stonith-enabled=false
圖9
<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VySaODiK0TAABdtfBhbs0751.jpg" target="_blank"></a>
2、使用crmsh指令檢視目前的配置資訊
圖10
<a href="http://s3.51cto.com/wyfs02/M01/6E/08/wKioL1VyS1DDkDMIAADvotVATXU738.jpg" target="_blank"></a>
[root@node1 ~]# crm configure show
node node1.1inux.com
node node2.1inux.com
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false //stonith 已被禁用
[root@node1 ~]#
也可以進入crm指令模式關閉 圖13
<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyS5KxycmyAALHP1G-NZ0291.jpg" target="_blank"></a>
将no-quorum-policy 設定為ignore
<code>crm(live)configure# property no-quorum-policy=ignore</code>
<code>crm(live)configure# show</code>
<code>node node1.1inux.com \</code>
<code> </code><code>attributes standby=off</code>
<code>node node2.1inux.com \</code>
<code>property cib-bootstrap-options: \</code>
<code> </code><code>dc-version=1.1.11-97629de \</code>
<code> </code><code>cluster-infrastructure=</code><code>"classic openais (with plugin)"</code> <code>\</code>
<code> </code><code>expected-quorum-votes=2 \</code>
<code> </code><code>stonith-enabled=false \</code>
no-quorum-policy=ignore
3、為叢集添加叢集資源
corosync支援heartbeat,LSB和ocf等類型的資源代理,目前較為常用的類型為LSB和OCF兩類,stonith類專為配置stonith裝置而用;
可以通過如下指令檢視目前叢集系統所支援的類型:
[root@node1 ~]# crm ra classes
<a href="http://s3.51cto.com/wyfs02/M00/6E/08/wKioL1VyS8-wx-c4AABUxq4Owns597.jpg" target="_blank"></a>
如果想要檢視某種類别下的所用資源代理的清單,可以使用類似如下指令實作:
# crm ra list lsb
# crm ra list ocf heartbeat
# crm ra list ocf pacemaker
# crm ra list stonith
# crm ra info [class:[provider:]]resource_agent
例如:
# crm ra info ocf:heartbeat:IPaddr
圖12
<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VySkqAjN0tAAPYJAqxXKg201.jpg" target="_blank"></a>
六、配置高可用的Web叢集
1、為web叢集建立一個IP位址資源,以在通過叢集提供web服務時使用
<code>crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.16.66.100 nic=eth0 cidr_netmask=16 op monitor interval=10 timeout=20s</code>
<code>crm(live)configure# verify</code>
<code>crm(live)configure# commit</code>
<code>crm(live)configure#</code>
<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyTDexVu9OAAI6wC9jxag338.jpg" target="_blank"></a>
進入crm 指令行 下線node1 操作
crm(live)node# standby
<a href="http://s3.51cto.com/wyfs02/M02/6E/0C/wKiom1VySrqQCIf5AAKE83wp84M733.jpg" target="_blank"></a>
然後檢視node節點狀态資訊
圖15
<a href="http://s3.51cto.com/wyfs02/M00/6E/0C/wKiom1VyStzzUzh5AAExfy15SDQ908.jpg" target="_blank"></a>
圖15 可以看到node1 已經下線 現在線上的是node2
檢視node2 IP 圖19
<a href="http://s3.51cto.com/wyfs02/M01/6E/0C/wKiom1VySuywa5IrAAGdg8urFNQ524.jpg" target="_blank"></a>
OK IP配置完成,接下來我們配置httpd
2、高可用叢集Web的配置
使用yum源分别在node1、node2 安裝httpd
分别啟動node1、node2上的httpd,并為其建立相應的首頁
<code>node1:</code>
<code>[root@node1 ~]# service httpd start</code>
<code>Starting httpd: [ OK ]</code>
<code>[root@node1 ~]# </code><code>echo</code> <code>"<h1>node1.1inux.com</h1>"</code> <code>> /</code><code>var</code><code>/www/html/index.html</code>
<code>[root@node1 ~]# curl 172.16.66.81</code>
<code><h1>node1.1inux.com</h1></code>
<code>[root@node1 ~]# chkconfig httpd off</code>
<code>[root@node1 ~]# service httpd stop</code>
<code>node2:</code>
<code>[root@node2 ~]# service httpd start</code>
<code>[root@node2 ~]# </code><code>echo</code> <code>"<h1>node2.1inux.com</h1>"</code> <code>> /</code><code>var</code><code>/www/html/index.html</code>
<code>[root@node2 ~]# curl 172.16.66.82</code>
<code><h1>node2.1inux.com</h1></code>
<code>[root@node2 ~]# service httpd stop</code>
<code>[root@node2 ~]# chkconfig httpd off</code>
然後再node1 上配置如下
<code>configure # primitive webserver lsb:httpd op monitor interval=10 timeout=20s</code>
<code>crm(live)configure# group ip_web webip webserver </code><code>//建立組 </code>
<code>primitive webip IPaddr \</code>
<code> </code><code>params ip=172.16.66.100 nic=eth0 cidr_netmask=16 \</code>
<code> </code><code>op monitor interval=10 timeout=20s</code>
<code>primitive webserver lsb:httpd \</code>
<code>group ip_web webip webserver</code>
<code> </code><code>no-quorum-policy=ignore</code>
<code>crm(live)configure# cd ..</code>
<code>crm(live)# status</code>
<code>Last updated: Sun May 31 00:27:05 2015</code>
<code>Last change: Sun May 31 00:24:37 2015</code>
<code>Stack: classic openais (with plugin)</code>
<code>Current DC: node2.1inux.com - partition with quorum</code>
<code>Version: 1.1.11-97629de</code>
<code>2 Nodes configured, 2 expected votes</code>
<code>2 Resources configured</code>
<code>Online: [ node1.1inux.com node2.1inux.com ]</code>
<code> </code><code>Resource Group: ip_web</code>
<code> </code><code>webip (ocf::heartbeat:IPaddr): Started node1.1inux.com </code>
<code> </code><code>webserver (lsb:httpd): Started node1.1inux.com </code><code>//就可以看到此時 webip webserver 都在node1上面了 </code>
<code>crm(live)#</code>
然後我們通路http://172.16.66.100,如圖20 ,顯示的是node1頁面
<a href="http://s3.51cto.com/wyfs02/M02/6E/08/wKioL1VyTOGSlsBKAADCreu2TpM142.jpg" target="_blank"></a>
然後我們在node1上運作如下指令,然後再通路 http://172.16.66.100
[root@node1 ~]# service corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:. [ OK ]
<a href="http://s3.51cto.com/wyfs02/M02/6E/0C/wKiom1VyS2CwjhnjAACw6QHT4KE783.jpg" target="_blank"></a>
此時通路的頁面已經變成了node2
OK 基于heartbeat,crmsh的高可用叢集已經搭建完畢
本文轉自 1inux 51CTO部落格,原文連結:http://blog.51cto.com/1inux/1659046