上一篇部落格我們聊了下高可用叢集corosync+pacemaker的相關概念以及corosync的配置,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13585921.html;今天我們來說一下corosync+pacemaker高可用叢集的配置工具crmsh安裝和使用;在centos7上預設base倉庫沒有crmsh這個工具,紅帽預設在base倉庫中只留了pcs這個配置工具,所以我們要想在centos7上使用crmsh這個工具來管理corosync+pacemaker高可用叢集,需要去找對應的包進行安裝;好在opensuse給centos7提供了一個倉庫,我們可以使用opensuse的倉庫去安裝這個工具;
1、配置opensuse倉庫
[root@node01 ~]# cd /etc/yum.repos.d/ [root@node01 yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo epel.repo CentOS-Base.repo.bak CentOS-fasttrack.repo CentOS-Vault.repo CentOS-CR.repo CentOS-Media.repo docker-ce.repo [root@node01 yum.repos.d]# rz rz waiting to receive. zmodem trl+C ȡ 100% 350 bytes 350 bytes/s 00:00:01 0 Errors [root@node01 yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo docker-ce.repo CentOS-Base.repo.bak CentOS-fasttrack.repo CentOS-Vault.repo epel.repo CentOS-CR.repo CentOS-Media.repo crmsh.repo [root@node01 yum.repos.d]# cat crmsh.repo [network_ha-clustering_Stable] name=Stable High Availability/Clustering packages (CentOS_CentOS-7) type=rpm-md baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/ gpgcheck=1 gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/repodata/repomd.xml.key enabled=1 [root@node01 yum.repos.d]#
提示:crmsh這個工具是一個叢集管理工具,只需要在叢集某一臺server上安裝即可,如果有需要在其他節點管理叢集,也可以在其他節點配置yum倉庫,安裝即可;
2、安裝crmsh
[root@node01 ~]# cd /etc/yum.repos.d/ [root@node01 yum.repos.d]# [root@node01 yum.repos.d]# cd [root@node01 ~]# yum install crmsh -y 已載入外掛:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com 正在解決依賴關係 --> 正在檢查事務 ---> 軟體包 crmsh.noarch.0.3.0.0-6.2 將被 安裝 --> 正在處理依賴關係 crmsh-scripts >= 3.0.0-6.2,它被軟體包 crmsh-3.0.0-6.2.noarch 需要 --> 正在處理依賴關係 python-parallax,它被軟體包 crmsh-3.0.0-6.2.noarch 需要 --> 正在檢查事務 ---> 軟體包 crmsh-scripts.noarch.0.3.0.0-6.2 將被 安裝 ---> 軟體包 python-parallax.noarch.0.1.0.1-29.1 將被 安裝 --> 解決依賴關係完成 依賴關係解決 ==================================================================================================== Package 架構 版本 源 大小 ==================================================================================================== 正在安裝: crmsh noarch 3.0.0-6.2 network_ha-clustering_Stable 746 k 為依賴而安裝: crmsh-scripts noarch 3.0.0-6.2 network_ha-clustering_Stable 93 k python-parallax noarch 1.0.1-29.1 network_ha-clustering_Stable 36 k 事務概要 ==================================================================================================== 安裝 1 軟體包 (+2 依賴軟體包) 總計:875 k 總下載量:782 k 安裝大小:2.9 M ……省略部分內容…… Running transaction 正在安裝 : crmsh-scripts-3.0.0-6.2.noarch 1/3 正在安裝 : python-parallax-1.0.1-29.1.noarch 2/3 正在安裝 : crmsh-3.0.0-6.2.noarch 3/3 驗證中 : python-parallax-1.0.1-29.1.noarch 1/3 驗證中 : crmsh-3.0.0-6.2.noarch 2/3 驗證中 : crmsh-scripts-3.0.0-6.2.noarch 3/3 已安裝: crmsh.noarch 0:3.0.0-6.2 作為依賴被安裝: crmsh-scripts.noarch 0:3.0.0-6.2 python-parallax.noarch 0:1.0.1-29.1 完畢! [root@node01 ~]#
3、crmsh的使用
[root@node01 ~]# crm crm(live)# ls cibstatus help site cd cluster quit end script verify exit ra maintenance bye ? ls node configure back report cib resource up status corosync options history crm(live)# status Stack: corosync Current DC: node02.test.org (version 1.1.21-4.el7-f14e36fd43) - partition with quorum Last updated: Mon Aug 31 22:08:50 2020 Last change: Mon Aug 31 19:41:56 2020 by root via crm_attribute on node01.test.org 2 nodes configured 0 resources configured Online: [ node01.test.org node02.test.org ] No resources crm(live)# bye bye [root@node01 ~]# crm ls cibstatus help site cd cluster quit end script verify exit ra maintenance bye ? ls node configure back report cib resource up status corosync options history [root@node01 ~]# crm status Stack: corosync Current DC: node02.test.org (version 1.1.21-4.el7-f14e36fd43) - partition with quorum Last updated: Mon Aug 31 22:09:08 2020 Last change: Mon Aug 31 19:41:56 2020 by root via crm_attribute on node01.test.org 2 nodes configured 0 resources configured Online: [ node01.test.org node02.test.org ] No resources [root@node01 ~]#
提示:crm有兩種使用方式,一種是互動式,直接在命令列敲crm命令就可以進入互動式shell;另外一種是非互動式,在crm 命令後面直接加要執行的命令;
4、crmsh的幫助資訊
提示:進入互動式shell使用ls可以檢視當前所在位置支援使用那些命令;crmsh它類似Linux中的檔案系統,它可以使用ls檢視當前位置可以使用的命令,也可以使用cd命令進入到指定配置,或者cd ..返回上級配置介面;比如要進入configure配置,我們可以使用cd configure 也可以直接敲configure進入configure配置;檢視幫助可以使用help ,預設是顯示當前介面的所有命令的簡要幫助,如果要檢視某個命令的詳細使用格式,可以help 某個命令,如下所示;
5、常用命令使用
status:檢視叢集狀態資訊同crm_mon顯示一樣,不同的是在crmsh互動式介面使用status它不會阻塞,在命令列使用crm_mon它會阻塞終端;
verify:驗證當前所在位置的配置資訊是否正確,
提示:以上校驗配置資訊反饋給我們說我們配置了STONITH 但是並沒有發現STONITH裝置;解決辦法關閉STONITH選項
提示:我們的所有配置相關的操作都要進入到configure介面操作;property這個命令是用來設定叢集相關屬性的;crmsh支援命令補全,如果不知道一個命令有那些引數可設定可以連續敲兩次tab鍵,它會列出支援的引數;
驗證配置,提交配置
提示:只要verify沒有報任何錯誤資訊都表示當前配置介面的配置資訊正確;沒有任何錯誤,我們就可以使用commit命令來提交配置,讓其配置生效;
ra相關命令
classes/class:列出資源類別
info :檢視指定資源代理的後設資料資訊,簡單講就是檢視一個資源代理的詳細幫助資訊;
提示:以上截圖表示檢視ocf類別下的heartbeat下的IPaddr這個資源代理的詳細幫助資訊,其中帶星號的引數是必選項,其他選項不指定都是使用預設值;
list:列出指定類別資源代理列表,就是檢視指定類別的資源代理中有那些資源可以代理;
providers:檢視指定資源是那個providers下的資源代理;
configure相關命令
primitive:定義一個基本資源;
命令使用語法
提示:在configure配置介面,可以使用primitive命令來定義一個資源,其中rsc表示給資源起一個名稱,然後指定資源的類別,和資源代理,然後加上指定資源代理需要的引數,以及選項就可以定義好一個資源;
示例:在configure配置介面使用ocf這個資源類別下的heartbeat下的IPaddr來定義一個ip資源,
提示:可以看到當我們驗證配置介面的配置沒有問題以後,commit配置,對應的資源就生效了,並且在node01上生效了;
驗證:在node01上檢視對應的ip地址是否配置上去了?
提示:可以看到對應ip地址的確在node01上給配置好了;
驗證:把node01模擬下線,看看對應ip地址是否會轉移呢?
提示:我們把node01設定為standby以後,在檢視叢集狀態資訊,可以看到對應的webip 這個資源已經停止了,並且給我們報了一個錯誤,說在node02.test.org上沒有配置;其實原因是在node02上並沒有br0這塊網路卡,所以它轉移過去配置不成功;
在node02上新增一個br0網橋並把ens33橋接到br0上,把ens33的地址配置到br0上,然後重啟網路服務,看看對應webip是否會遷移上來呢?
[root@node02 ~]# cd /etc/sysconfig/network-scripts/ [root@node02 network-scripts]# cat ifcfg-br0 TYPE=Bridge NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=192.168.0.42 PREFIX=24 GATEWAY=192.168.0.1 DNS1=192.168.0.1 [root@node02 network-scripts]# cat ifcfg-ens33 TYPE=Ethernet NAME=ens33 DEVICE=ens33 ONBOOT=yes BRIDGE=br0 [root@node02 network-scripts]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:91:99:30 brd ff:ff:ff:ff:ff:ff inet 192.168.0.42/24 brd 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe91:9930/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:fe:1b:15 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:fe:1b:15 brd ff:ff:ff:ff:ff:ff [root@node02 network-scripts]# systemctl restart network [root@node02 network-scripts]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000 link/ether 00:0c:29:91:99:30 brd ff:ff:ff:ff:ff:ff 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:fe:1b:15 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:fe:1b:15 brd ff:ff:ff:ff:ff:ff 7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 00:0c:29:91:99:30 brd ff:ff:ff:ff:ff:ff inet 192.168.0.42/24 brd 192.168.0.255 scope global br0 valid_lft forever preferred_lft forever inet6 fe80::b41a:aeff:fe2e:ca6e/64 scope link valid_lft forever preferred_lft forever [root@node02 network-scripts]#
提示:可以看到node02上已經有br0,但是我們配置的ip地址並沒有遷移過來;
重新將node01上線,然後在下線,看看webip是否能夠遷移到node02上?
提示:重新將node01上線以後,再次檢視叢集狀態發現node02離線了,對應webip也停止了;這可能是因為我們剛才在node02上把IP地址遷移到br0上的原因;對於webip不能工作的原因是我們的叢集是兩個節點的特殊叢集,當其中一臺server處於離線,就發生了叢集網路分割槽,線上的一方並沒有大於總選票的一半,所以對應資源也就停止了;
重啟node02上的corosync pacemaker,然後再次進入crmsh終端使用status命令檢視叢集狀態資訊
提示:重啟node02的corosync和pacemaker後,叢集狀態恢復正常;
現在將node01設定成standby模式,看看是否將webip遷移到node02上?
提示:可以看到把node01設定為standby模式以後,webip就自動遷移到node02上了;
驗證:在node02上檢視對應的webip是否真的遷移過來了呢?
提示:在node02上也能看到對應webip資源遷移過來了;
monitor:定義資源的監控選項
命令使用語法
示例:給剛才的webip定義監控選項
提示:從上面的截圖可以看到,我們給資源新增監控選項,不外乎在資源的後面用OP引數,指定了OP引數型別是monitor,interval=# timeout=#;其實我們給資源新增監控選項在建立資源的時候就可以在其後使用OP monitor interval=時間 timeout=時間;這裡在校驗配置資訊時提示我們設定的超時時間過短;為了不讓它警告我們,我們可以修改對應資源的timeout的值即可,如下
edit:用vim編輯器開啟配置檔案,進行編輯
提示:使用edit命令即可開啟當前configure介面的配置檔案,我們可以修改自己需要修改的地方,然後儲存退出即可
提示:可以看到當我們修改配置檔案以後,再次使用show命令可以看到對應選項的值已經發生變化,校驗都沒有任何警告;
驗證:把node02上的br0:br0:1 down掉,看看它會不會自動啟動起來?
提示:剛開始把br0:br0:1down掉以後,在檢視叢集狀態,對應webip是處於正常啟動狀態的,這是因為監控探測的時間還沒有到;等上一會我們再次檢視叢集狀態就會發現報錯了;
提示:我們定義的資源監控選項監控到對應資源故障以後,它會把故障寫進CIB中,然後把對應的資源進行重啟;報錯是為了方便我們檢視對應資源是否發生故障,提醒管理員排查相關故障;
示例2:定義web服務httpd託管在corosync+pacemaker高可用叢集上
1、在叢集節點上安裝httpd
[root@node01 ~]# yum install httpd -y
提示:在需要轉移的所有節點上都要安裝;
2、檢視httpd資源代理需要用到的引數資訊
提示:從上面的截圖看,託管httpd不需要任何引數指定;
3、定義託管httpd
提示:以上就是在定義httpd資源時,一起把監控選項給定義好;
檢視叢集狀態
提示:這裡提示我們webserver在node01上啟動發生了未知錯誤,所以它在node02上啟動了;預設情況託管的服務會負載均衡的在叢集節點上執行著;
在node01上排查錯誤
提示:在node01上檢視埠資訊,發現node01的80埠被佔用了,這也就導致httpd在node01上無法正常啟動的原因;
停止掉node01的nginx服務,看看對應webserver是否會遷回node01?
提示:可以看到把node01上的nginx服務停掉以後,webserver並沒有從node02遷回node01,這是因為webserver對node02的傾向性和對node01的傾向性是一樣的,所以它不會從node02遷移至node01,必經遷移資源也會印象業務嘛;
利用nfs共享儲存為httpd提供網頁檔案
配置node03為nfs伺服器
[root@node03 ~]# mkdir -p /data/htdocs/ [root@node03 ~]# cd /data/htdocs/ [root@node03 htdocs]# ls [root@node03 htdocs]# echo "<h1> This page on nfs server</h1>" > index.html [root@node03 htdocs]# cat index.html <h1> This page on nfs server</h1> [root@node03 htdocs]# cat /etc/exports /data/htdocs/ 192.168.0.0/24(rw) [root@node03 htdocs]# groupadd -g 48 apache [root@node03 htdocs]# useradd -u 48 -g 48 -s /sbin/nologin apache [root@node03 htdocs]# id apache uid=48(apache) gid=48(apache) groups=48(apache) [root@node03 htdocs]# setfacl -m u:apache:rwx /data/htdocs/ [root@node03 htdocs]# systemctl start nfs [root@node03 htdocs]# systemctl enable nfs-server.service Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. [root@node03 htdocs]#
提示:nfs提供共享的目錄必須要讓apache使用者對其有讀許可權,其次httpd服務來訪問nfs是通過在httpd伺服器上的apache使用者身份來訪問nfs,在nfs這邊它會識別其UID,GID,所以我們在nfs上要新建一個同httpd伺服器上的apache同id的使用者;並且設定該使用者對nfs共享出來的目錄有讀許可權,如果業務需要上傳檔案,我們還需要對共享目錄設定寫和執行許可權;
配置託管nfs服務
驗證:檢視叢集狀態,看看nfs服務是否執行到叢集節點上了?
提示:可以看到westore已經在node01啟動了;
驗證:在node01上看看對應nfs是否真的掛載上了?
提示:可以看到node01上的確把nfs掛載到我們指定的目錄上了;
group:定義組,把多個資源歸併到一組;
提示:這裡設定多個資源為一個組,預設它會按照先後順序啟動,停止是相反的順序,所以這裡的資源的前後決定了資源啟動順序和停止順序;當然對於監控選項也是可以加上的,這個和定義單獨的資源的監控選項一樣,我們可以理解為group是把多個資源歸併到一起,使得我們可以以組為單位進行調配和設定;
再次檢視叢集狀態資訊
提示:可以看到webstore已經從node01遷移到node02上了;為啥是webstore從node01遷往node02上呢?這是因為webip和webserver都在node02上,它兩對node02的傾向性總和要大於webstore;所以webservice對node02的傾向性就要大於node01的傾向性,所以webstore會從node01遷移到node02上;
測試:用瀏覽器訪問webip看看是否能夠訪問到對應的網頁?
測試:把node02設定為standby模式,看看對應網頁是否能夠繼續訪問?
提示:可以看到把node02設定成standby模式以後,上面的資源都會遷移到node01上,對於服務來說只是短暫的影響,通常這種影響在使用者層面上無所感知的;
到此一個完整的web服務就託管到高可用叢集corosync+pacemaker之上了;對於其他服務都是相同的邏輯;