Corosync+Pacemaker+DRBD实现Mysql服务的高可用
一、Corosync概述
??請點擊查看詳細介紹
1、什么是AIS和OpenAIS?
? ? AIS是應用接口規范,是用來定義應用程序接口(API)的開放性規范的集合,這些應用程序作為中間件為應用服務提供一種開放、高移植性的程序接口。是在實現高可用應用過程中是亟需的。服務可用性論壇(SA Forum)是一個開放性論壇,它開發并發布這些免費規范。使用AIS規范的應用程序接口(API),可以減少應用程序的復雜性和縮短應用程序的開發時間,這些規范的主要目的就是為了提高中間組件可移植性和應用程序的高可用性。
? ? OpenAIS是基于SA Forum 標準的集群框架的應用程序接口規范。OpenAIS提供一種集群模式,這個模式包括集群框架,集群成員管理,通信方式,集群監測等,能夠為集群軟件或工具提供滿足 AIS標準的集群接口,但是它沒有集群資源管理功能,不能獨立形成一個集群。
2、corosync簡介
? ? corosync最初只是用來演示OpenAIS集群框架接口規范的一個應用,可以說corosync是OpenAIS的一部分,但后面的發展明顯超越了官方最初的設想,越來越多的廠商嘗試使用corosync作為集群解決方案。如Redhat的RHCS集群套件就是基于corosync實現。
? ? corosync只提供了message layer,而沒有直接提供CRM,一般使用Pacemaker進行資源管理。
3、小結
? ? 不管是heartbeat,還是corosync都是高可用集群中的Cluster Messaging Layer(集群信息層),是主要傳遞發集群信息與心跳信息的,并沒有資源管理功能,資源管理還得依賴于上層的crm(Cluster resource Manager,集群資源管理器)。最著名的資源管理器,就是pacemaker,它是heartbeat v3分離出去的子項目。而現在corosync+pacemaker成了高可用集群中的最佳組合。好了,到這里corosync與pacemaker的基礎知識就說到這里了,下面我們來看看怎么安裝corosync與pacemaker。
二、環境準備
1、拓撲結構
2、服務器配置情況
| 名稱 | IP | 安裝軟件 | 系統 |
| node1.wzlinux.com | VIP:192.168.0.18 eth0:192.168.0.10 | corosync、pacemaker DRBD、Mysql | CentOS 6.5 64位 |
| node2.wzlinux.com | VIP:192.168.0.18 eth0:192.168.0.11 | corosync、pacemaker DRBD、Mysql | CentOS 6.5 64位 |
3、關閉防火墻、SELinux和配置時間同步
4、配置各節點互相解析?
node1:
[root@node1?~]#?uname?-n?? node1.wzlinux.com?? [root@node1?~]#?cat?/etc/hosts?? 127.0.0.1???localhost?localhost.localdomain?localhost4?localhost4.localdomain4 ::1?????????localhost?localhost.localdomain?localhost6?localhost6.localdomain6 192.168.0.10?node1.wzlinux.com?node1 192.168.0.11?node2.wzlinux.com?node2node2:
[root@node2?~]#?uname?-n?? node2.wzlinux.com?? [root@node2?~]#?cat?/etc/hosts?? 127.0.0.1???localhost?localhost.localdomain?localhost4?localhost4.localdomain4 ::1?????????localhost?localhost.localdomain?localhost6?localhost6.localdomain6 192.168.0.10?node1.wzlinux.com?node1 192.168.0.11?node2.wzlinux.com?node25、配置各節點ssh互信
node1:
[root@node1?~]#?ssh-keygen??-t?rsa?-f?~/.ssh/id_rsa??-P?''?? [root@node1?~]#?ssh-copy-id?-i?.ssh/id_rsa.pub?root@node2.wzlinux.comnode2:
[root@node2?~]#?ssh-keygen??-t?rsa?-f?~/.ssh/id_rsa??-P?''? [root@node2?~]#?ssh-copy-id?-i?.ssh/id_rsa.pub?root@node1.wzlinux.com三、DRBD的安裝與配置
1、下載安裝
? ? 下載地址為ftp://rpmfind.net/linux/atrpms/,請按照需要下載,也可以在本文附件下載。
? ??詳細配置詳解請點擊查看博文
rpm?-ivh?drbd-8.4.3-33.el6.x86_64.rpm?drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm2、drbd的配置
? ? 以下兩個配置文件node1和node2節點必須相同。
cat?/etc/drbd.d/global-common.confglobal?{usage-count?no;#?minor-count?dialog-refresh?disable-ip-verification } common?{protocol?C;handlers?{pri-on-incon-degr?"/usr/lib/drbd/notify-pri-on-incon-degr.sh;?/usr/lib/drbd/notify-emergency-reboot.sh;?echo?b?>?/proc/sysrq-trigger?;?reboot?-f";pri-lost-after-sb?"/usr/lib/drbd/notify-pri-lost-after-sb.sh;?/usr/lib/drbd/notify-emergency-reboot.sh;?echo?b?>?/proc/sysrq-trigger?;?reboot?-f";local-io-error?"/usr/lib/drbd/notify-io-error.sh;?/usr/lib/drbd/notify-emergency-shutdown.sh;?echo?o?>?/proc/sysrq-trigger?;?halt?-f";#?fence-peer?"/usr/lib/drbd/crm-fence-peer.sh";#?split-brain?"/usr/lib/drbd/notify-split-brain.sh?root";#?out-of-sync?"/usr/lib/drbd/notify-out-of-sync.sh?root";#?before-resync-target?"/usr/lib/drbd/snapshot-resync-target-lvm.sh?-p?15?--?-c?16k";#?after-resync-target?/usr/lib/drbd/unsnapshot-resync-target-lvm.sh;}startup?{#wfc-timeout?120;#degr-wfc-timeout?120;}disk?{on-io-error?detach;#fencing?resource-only;}net?{cram-hmac-alg?"sha1";shared-secret?"mydrbd";}syncer?{rate?1000M;} }? ? 定義一個資源/etc/drbd.d/mysql.res,內容如下:
resource?mydata?{on?node1.wzlinux.com?{device????/dev/drbd0;disk??????/dev/sdb;address???192.168.0.10:7789;meta-disk?internal;}on?node2.wzlinux.com?{device????/dev/drbd0;disk??????/dev/sdb;address???192.168.0.11:7789;meta-disk?internal;} }? ? 然后把文件同步到另一個節點
scp?/etc/drbd.d/{global_common.conf,mysql.res}?node2:/etc/drbd.d? ? 分別在兩個節點初始化資源,然后啟動服務
drbdadm?create-md?web service?drbd?start四、Mysql的安裝與配置
1、安裝mysql
? ? 為了實驗方便一些,我這里直接使用yum進行安裝
yum?install?mysql-server2、配置mysql
? ? 在其配置文件里面填寫如下內容/etc/my.cf,提前創建需要的目錄。
datadir=/mydata innodb_file_per_table=1五、corosync的安裝與配置
? ? 以下如果沒有特別說明,就是在node1和node2上面同時執行。
1、corosync和pacemaker的安裝
? ?RHEL6.x以后的版本中,直接集成了corosync和pacemaker,因此直接使用yum安裝即可。
yum?install?corosync?pacemaker?-y2、查看corosync安裝生成文件
# rpm -ql corosync
/etc/corosync??????#配置文件目錄 /etc/corosync/corosync.conf.example?????#配置事例文件 /etc/corosync/corosync.conf.example.udpu /etc/corosync/service.d /etc/corosync/uidgid.d /etc/dbus-1/system.d/corosync-signals.conf /etc/rc.d/init.d/corosync??????????#服務腳本 /etc/rc.d/init.d/corosync-notifyd /etc/sysconfig/corosync-notifyd /usr/bin/corosync-blackbox /usr/libexec/lcrso /usr/libexec/lcrso/coroparse.lcrso /usr/libexec/lcrso/objdb.lcrso /usr/libexec/lcrso/quorum_testquorum.lcrso /usr/libexec/lcrso/quorum_votequorum.lcrso /usr/libexec/lcrso/service_cfg.lcrso /usr/libexec/lcrso/service_confdb.lcrso /usr/libexec/lcrso/service_cpg.lcrso /usr/libexec/lcrso/service_evs.lcrso /usr/libexec/lcrso/service_pload.lcrso /usr/libexec/lcrso/vsf_quorum.lcrso /usr/libexec/lcrso/vsf_ykd.lcrso /usr/sbin/corosync /usr/sbin/corosync-cfgtool /usr/sbin/corosync-cpgtool /usr/sbin/corosync-fplay /usr/sbin/corosync-keygen???????????#集群間通訊秘鑰生成工具 /usr/sbin/corosync-notifyd /usr/sbin/corosync-objctl /usr/sbin/corosync-pload /usr/sbin/corosync-quorumtool /usr/share/doc/corosync-1.4.7 ……?……3、配置corosync
# cat corosync.conf
#?Please?read?the?corosync.conf.5?manual?page? compatibility:?whitetank totem?{????version:?2????#版本號,只能是2,不能修改?secauth:?on???#安全認證,當使用aisexec時,會非常消耗CPU?threads:?0????#線程數,根據CPU個數和核心數確定?interface?{?ringnumber:?0???#冗余環號,節點有多個網卡是可定義對應網卡在一個環內?bindnetaddr:?192.168.0.0??#綁定心跳網段?mcastaddr:?226.94.8.8?????#心跳組播地址?mcastport:?5405???????????#心跳組播使用端口?ttl:?1?}? }logging?{?fileline:?off???????#指定要打印的行?to_stderr:?no???????#是否發送到標準錯誤輸出?to_logfile:?yes?????#記錄到文件?to_syslog:?no???????#記錄到syslog?logfile:?/var/log/cluster/corosync.log?debug:?off?timestamp:?on???????#是否打印時間戳,利于定位錯誤,但會消耗CPU?logger_subsys?{?subsys:?AMF?debug:?off?}? }service?{ver:??1???????????????????name:?pacemaker???????? }注:ver: 1,當值為0時,啟動corosync時自動啟動pacemaker;當值為1時,手動啟動pacemaker。
? ? 前面測試的時候我使用自動啟動,但是使用crm的時候會報如下錯誤,而且日志里面也會有很多錯誤,后來改成手動啟動pacemaker之后問題變不再出現,具體問題出現在哪里我目前還不清楚。
4、生成密鑰文件
? ? 使用corosync生成key文件會默認調用/dev/random隨機數設備,一旦系統中斷的IRQS的隨機數不夠用,將會產生大量的等待時間,如果對安全不是要求太高,此過程可以使用偽隨機數,偽隨機數是有規律的,所以可能會被找到規律從而破解密鑰,因此,為了節約時間,我們在生成key之前講random替換成urandom,以便節約時間。
[root@node1?corosync]#?mv?/dev/{random,random.bak}???? [root@node1?corosync]#?ln?-s?/dev/urandom?/dev/random? [root@node1?corosync]#?corosync-keygen Corosync?Cluster?Engine?Authentication?key?generator. Gathering?1024?bits?for?key?from?/dev/random. Press?keys?on?your?keyboard?to?generate?entropy. Writing?corosync?key?to?/etc/corosync/authkey.? ? 然后把配置好的配置文件傳輸到領一臺設備上面
六、corosync的啟動與檢查
1、corosync的啟動
[root@node1?corosync]#?service?corosync?start? Starting?Corosync?Cluster?Engine?(corosync):???????????????[OK] [root@node1?corosync]#?service?pacemaker?start? Starting?Pacemaker?Cluster?Manager?????????????????????????[OK]?[root@node1?corosync]#?ssh?node2?'service?corosync?start'? Starting?Corosync?Cluster?Engine?(corosync):???????????????[OK] [root@node1?corosync]#?ssh?node2?'service?pacemaker?start'? Starting?Pacemaker?Cluster?Manager?????????????????????????[OK]2、查看啟動是否成功
# netstat -anpu
查看corosync引擎是否正常啟動
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
查看初始化成員節點通知是否正常發出
# grep ?TOTEM /var/log/cluster/corosync.log
查看pacemaker是否正常啟動
# grep pcmk_startup /var/log/cluster/corosync.log
五、集群資源管理軟件crm安裝與配置
1、安裝crmsh資源管理
? ? RHEL自6.4起不再提供集群的命令行配置工具crmsh,轉而使用pcs;如果想繼續使用crm命令,必須下載相關的程序包自行安裝才可。? ??
? ? 從pacemaker 1.1.8開始,crm發展成了一個獨立項目,叫crmsh。也就是說,我們安裝了pacemaker后,并沒有crm這個命令,我們要實現對集群資源管理,還需要獨立安裝crmsh。crmsh的rpm安裝可從如下地址下載:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/,根據自己操作系統的版本進行選擇下載。
? ? crmsh依賴于pssh,因此也需要通過上面地址下載pssh.rpm,pssh需要python-pssh,可以直接通過地址下載,也可以使用我附近進行安裝,我的是32位版的。
[root@node1?~]#?wget?http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/i686/crmsh-2.1-1.6.i686.rpm? [root@node1?~]#?wget?http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/i686/pssh-2.3.1-4.2.i686.rpm [root@node1?~]#?yum?install?crmsh-2.1-1.6.i686.rpm?pssh-2.3.1-4.2.i686.rpm?python-pssh-2.3.1-4.2.i686.rpm? ? 安裝完成,我們先通過crm status指令查看一下集群狀態。
[root@node1?yum.repos.d]#?crm?status Last?updated:?Fri?Dec?11?19:46:39?2015 Last?change:?Fri?Dec?11?18:29:51?2015 Stack:?classic?openais?(with?plugin) Current?DC:?node2.wzlinux.com?-?partition?with?quorum Version:?1.1.11-97629de 2?Nodes?configured,?2?expected?votes 0?Resources?configuredOnline:?[?node1.wzlinux.com?node2.wzlinux.com?]? ? 可以看到節點node1目前是主節點,已經在線。 ? ?
? ? 用crm status查看狀態時,如果報Could not establish cib_ro connection: Connection refused (111) ,說明本節點,連不上其他節點,可以重新corosync-keygen命令生成文件,要在修改主機名成功以后進行,盡量使用計算機熵池中的數據來生成。
2、crmsh基本介紹
? ?我們可以直接進入crm shell進行交互式操作,也可以在命令行直接操作,效果是一樣的,比如我們查看集群狀態,可以使用如下兩種方法。
注:如果不清楚某個命令的用法,都可以直接help查看幫助,TAB鍵也可以進行補全。
3、禁用stonith
? ? corosync默認啟用了stonith功能,而我們要配置的集群并沒有stonith設備,因此在配置集群的全局屬性時要對其禁用。
方法1:
[root@node1?corosync]#?crm crm(live)#?configure????????????#進入配置模式 crm(live)configure#?property?stonith-enabled=false???????#禁用stonith crm(live)configure#?verify?????????#驗證配置是否有誤 crm(live)configure#?commit?????????#配置提交到集群每個節點 crm(live)configure#?show???????????#查看當前配置 node?node1.wzlinux.com node?node2.wzlinux.com property?cib-bootstrap-options:?\dc-version=1.1.11-97629de?\cluster-infrastructure="classic?openais?(with?plugin)"?\expected-quorum-votes=2?\stonith-enabled=false方法2:
[root@node1?~]#?crm?configure?property?stonith-enabled=false???#直接提交到每個節點4、定義法定票數不夠時應該做忽略操作
? ? 法定票數(quorum,?票數)半數票數的集群成為滿足法定票數)是為了避免集群分裂而出現的。在集群通信故障時,為了避免資源搶占,所以進行投票操作,只有具有法定票數的一方才有資格做為集群,不滿足的一方就應該退出集群,但它放棄后并不代表服務停止,所以應該讓其釋放資源,關閉電源。stonith設備的用處就在于此。
方法1:
同上原理。
方法2:
[root@node1?~]#?crm?configure?property?no-quorum-policy=ignore5、添加資源
? ? ? corosync支持heartbeat,LSB和ocf等類型的資源代理,目前較為常用的類型為LSB和OCF兩類,stonith類專為配置stonith設備而用;
? ? ?可以通過如下命令查看當前集群系統所支持的類型:
? ? 如果想要查看某種類別下的所有資源代理的列表,可以使用類似如下命令實現:
[root@node1?~]#?crm?ra?list?ocf? ? 如果想要查看某個資源代理支持那些參數,可以使用如下命令?
[root@node1?~]#?crm?ra?info?ocf:heartbeat:IPaddr? ? 接下來要創建集群的一個IP地址資源,以在通過集群提供服務時使用;這可以通過如下方式實現:
添加VIP:
? ? 不要單個資源提交,等所有資源及約束一起建立之后提交。
crm(live)configure#?primitive?VIP?ocf:heartbeat:IPaddr?params?ip=192.168.0.18?op?monitor?interval="20"?timeout="20"?on-fail="restart" crm(live)configure#?verify????#驗證一下參數是否正確添加mysql服務:
crm(live)configure#?primitive?myserver?lsb:mysqld?op?monitor?interval="20"?timeout="20"?on-fail="restart" crm(live)configure#?verify添加drdb服務:
文件系統掛載服務:
把drbd設為主從資源:
定義排列約束:
定義資源啟動順序:
? ? 檢驗沒有錯誤之后我們就可以提交配置了。
? ? 從狀態里面可以看出所有服務都在Node1節點起來了。
六、結果檢驗
1、檢查VIP
2、檢查掛載
3、檢查mysql服務
4、創建數據庫
?? ?可以看出一切正常,那我們直接連入數據庫創建一個數據庫abc。
5、把node1切換為備節點,然后去node2數據庫登錄查看
? ?記得,切換為備節點之后節點就下線了,數據就不會再同步了,可以立刻在設置其為在線狀態。
6、node2登錄數據庫查看
從結果可以看到mysql的高可用服務搭建成功了。
問題:
DRBD 狀態始終是 Secondary/Unknown?
Ans:
1、可能是某個節點的drbd服務沒有啟動著,只有兩個節點服務都正常的時候才會數據同步,所以務必要兩節點都是online,可以使用crm status查看。
2、可能發生了腦裂行為,一般出現在ha切換時,解決方法:
? ? ? ? ? 在一節點執行:
? ? ? ? ? ? ? ? ? ? ?drbdadm secondary mydata
? ? ? ? ? ? ? ? ? ? ?drbdadm connect --discard-my-data mydata
? ? ? ? ? 另一節點執行:
? ? ? ? ? ? ? ? ? ? ?drbdadm connect mydata
總結
以上是生活随笔為你收集整理的Corosync+Pacemaker+DRBD实现Mysql服务的高可用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原创)INTERVAL分区表与RANG
- 下一篇: 构造方法 练习