前言
在眾多的高可用集群解決方案中,除了Heartbeat之外,Corosync也能提供類似于Heartbeat一樣的功能,而且目前RedHat官方提供的高可用集群解決方案的程序包都以Corosync為主,所以今后Corosync會逐漸取代Heartbeat。本文帶來的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解決方案。
相關介紹
Corosync
Corosync是從OpenAIS中分支出來的一個項目,它在傳遞信息的時候可以通過一個簡單的配置文件來定義信息傳遞的方式和協議等。Corosync識別節點是通過authkey來實現的,不同于heartbeat v1 v2,Corosync的authkey是通過corosync-keygen命令生成的,具有更高的安全性。
Corosync目前有兩個主流的版本:v1和v2,兩個版本差別較大,v1沒有有投票功能,需要借助cman實現,v2支持投票功能。
Pacemaker
Pacemaker是從heartbeat v3版本中分裂出來專門用于管理高可用集群的組件,功能十分強大。它利用集群基礎構件(OpenAIS 或heartbeat)提供的消息和成員管理能力來探測并從節點或資源級別的故障中恢復,以實現群集服務(亦稱資源)的最大可用性。
DRBD
DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。其實現方式是通過網絡來鏡像整個設備。可以把它看作是一種網絡RAID。
DRBD負責接收數據,把數據寫到本地磁盤,然后發送給另一個主機,另一個主機再將數據存到自己的磁盤中。
下面是DRBD的系統結構圖
高可用解決方案
實驗拓撲
實驗環境
node1:172.16.10.123 MariaDB DRBD CentOS6.6
node2:172.16.10.124 MariaDB DRBD CentOS6.6
VIP:192.168.1.121
配置過程
配置HA的前提:
時間同步、基于主機名互相通信、SSH互信
請確保兩個節點時間同步,可用ntpdate向時間服務器同步
[root@node1 ~]# ntpdate cn.pool.ntp.org
基于主機名互相通信
[root@node1 ~]# vim /etc/hosts 172.16.10.123 node1.scholar.com node1 172.16.10.124 node2.scholar.com node2 [root@node1 ~]# vim /etc/sysconfig/network HOSTNAME=node1.scholar.com [root@node1 ~]# uname -n node1.scholar.com #兩個節點都需如上操作
SSH互信
[root@node1 ~]# ssh-keygen -t rsa -P '' [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2 [root@node2 ~]# ssh-keygen -t rsa -P '' [root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1 [root@node1 ~]# date; ssh node2 'date' #測試 Wed Jun 10 16:27:47 CST 2015 Wed Jun 10 16:27:47 CST 2015
安裝所需程序包
#安裝corosync + pacemaker,pacemaker依賴于corosync,會一并安裝 [root@node1 ~]# yum install pacemaker -y #安裝pacemaker配置接口,crmsh依賴于pssh,單獨安裝需解決依賴關系,需suse官方源 [root@node1 ~]# yum install crmsh -y #安裝drbd [root@node1 ~]# yum install gcc gcc-c++ glibc flex kernel-devel kernel-headers -y [root@node1 ~]# tar xf drbd-8.4.3.tar.gz [root@node1 ~]# cd drbd-8.4.3 [root@node1 drbd-8.4.3]# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-km [root@node1 drbd-8.4.3]# make && make install [root@node1 drbd-8.4.3]# modprobe drbd #兩個節點都執行以上操作
Corosync配置
修改配置文件
[root@node1 ~]# cd /etc/corosync/ [root@node1 corosync]# mv corosync.conf.example corosync.conf [root@node1 corosync]# vim corosync.conf # Please read the corosync.conf.5 manual page compatibility: whitetank totem { #心跳信息傳遞層 version: 2 #版本 secauth: on #認證信息 threads: 0 #線程 interface { #定義心跳信息傳遞的接口 ringnumber: 0 bindnetaddr: 172.16.0.0 #綁定的網絡地址,寫網絡地址 mcastaddr: 226.94.1.1 #多播地址 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 #是否開啟時間戳 logger_subsys { subsys: AMF debug: off } } amf { mode: disabled } service { ver: 0 name: pacemaker #pacemaker作為corosync的插件進行工作 } aisexec { user: root group: root }
生成認證文件
[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. Press keys on your keyboard to generate entropy (bits = 736). ########此時拼命敲鍵盤產生隨機數###########
將配置文件及認證文件同步給另一個節點
安裝mysql
[root@node1 ~]# vim /etc/mysql/my.cnf datadir = /mydata/data log-bin=/mydata/binlogs/ #兩個節點都執行以上操作
DRBD配置
準備DRBD分區
[root@node1 ~]# fdisk sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +10G Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@node1 ~]# partx -a /dev/sdb #另一個節點也執行此操作
修改配置文件
[root@node1 ~]# vim /etc/drbd.d/global_common.conf global { 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 "mydrbdlab"; } syncer { rate 1000M; } } [root@node1 ~]# vim /etc/drbd.d/mydata.res #定義一個資源/etc/drbd.d/mydata.res,內容如下 resource mydata { on node1 { device /dev/drbd0; disk /dev/sdb1; address 172.16.10.123:7789; meta-disk internal; } on node2 { device /dev/drbd0; disk /dev/sdb1; address 172.16.10.124:7789; meta-disk internal; } }
將配置文件同步給另一個節點
初始化資源并啟動服務
[root@node1 ~]# drbdadm create-md mydata [root@node1 ~]# service drbd start #兩個節點都要執行以上操作
同步資源
#以上操作只在一個節點進行
格式化DRBD分區
#以上操作只在一個節點執行
掛載DRBD分區初始化數據庫
[root@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydat a/data/ --basedir=/usr/local/mysql #初始化操作只執行一次即可
測試數據是否同步
在另一個節點上測試
數據同步成功,接下來關閉所有服務
#另一個節點也關閉服務,確保開機不會自啟
配置corosync資源,實現高可用
定義DRBD資源
定義DRBD主從資源
定義mysql所需資源
定義組及各資源約束關系
查看所有資源信息
crm(live)configure# show node node1.scholar.com node node2.scholar.com primitive mydrbd ocf:linbit:drbd \ params drbd_resource=mydata \ op monitor role=Master interval=10s timeout=20s \ op monitor role=Slave interval=20s timeout=20s \ op start timeout=240s interval=0 \ op stop timeout=100s interval=0 primitive myfs Filesystem \ params device="/dev/drbd0" directory="/mydata" fstype=ext4 \ op monitor interval=20s timeout=60s \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 primitive myserver lsb:mysqld \ op monitor interval=30s timeout=20s primitive myvip IPaddr \ params ip=192.168.1.121 \ op monitor interval=30s timeout=20s group myservice myvip myfs myserver ms ms_mydrbd mydrbd \ meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true colocation myfs_with_ms_mydrbd_master inf: myfs ms_mydrbd:Master colocation myserver_with_myfs inf: myserver myfs order myfs_after_ms_mydrbd_master Mandatory: ms_mydrbd:promote myfs:start property cib-bootstrap-options: \ dc-version=1.1.11-97629de \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes=2 \ stonith-enabled=false \ no-quorum-policy=ignore \ last-lrm-refresh=1434014581
查看集群運行狀態
授權一個遠程用戶做測試
在其他主機登陸測試
此時模擬主節點故障
此時,資源被轉移到了node2上,繼續用遠程主機登陸測試
數據沒有受到任何影響,高可用目的實現,至此,基于Corosync + Pacemaker+DRBD的MySQL高可用集群實驗完成
The end
本次實驗就進行到這里了,實驗過程出現了一個奇葩問題,至今不知何故,朋友們如果配置過程中遇到問題歡迎留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5261