基於heartbeat v1、V2實現mysql的高可用

一、heartbeat v1簡介

heartbeat v1的架構是:heartbeat + haresource 來實現高可用的。heartbeat 
作爲message layer層,haresource作爲CRM管理資源,RA可以有LSB,OSF,heartbeat legacy提供。

######################################1、Heartbeat的控制信息:
“心跳”信息: (也稱爲狀態信息)僅150 bytes大小的廣播、組播或多播數據包。可爲以每個節點配
置其向其它節點通報“心跳”信息的頻率,以及其它節點上的heartbeat進程爲了確認主節點出節點出
現了運行等錯誤之前的等待時間。 

集羣變動事務(transition)信息:ip-request和ip-request-rest是相對較常見的兩種集羣變動信息
,它們在節點間需要進行資源遷移時爲不同節點上heartbeat進程間會話傳遞信息。比如,當修復了主
節點並且使其重新“上線”後,主節點會使用ip-request要求備用節點釋放其此前從因主節點故障而
從主節點那裏接管的資源。此時,備用節點則關閉服務並使用ip-request-resp通知主節點其已經不再
佔用此前接管的資源。主接點收到ip-request-resp後就會重新啓動服務。 

重傳請求:在某集羣節點發現其從其它節點接收到的heartbeat控制信息“失序”(heartbeat進程使
用序列號來確保數據包在傳輸過程中沒有被丟棄或
出現錯誤)時,會要求對方重新傳送此控制信息。 Heartbeat一般每一秒發送一次重傳請求,以避免洪泛。 

上面三種控制信息均基於UDP協議進行傳送,可以在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播
地址(使用以太網連接的情況下)。 

此外,除了使用“序列號/確認”機制來確保控制信息的可靠傳輸外,Heartbeat還會使用MD5或SHA1爲
每個數據包進行簽名以確保傳輸中的控制信息的安全性。

######################################2、Heartbeat的配置文件:
/etc/ha.d/ha.cf  定義位於不同節點上的heartbeat進程間如何進行通信;
/etc/ha.d/haresources  定義對某個資源來說哪個服務器是主節點,
      以及哪個節點應該擁有客戶端訪問資源時的目標IP地址。
/etc/ha.d/authkeys 定義Heartbeat包在通信過程中如何進行加密。

當ha.cf或authkeys文件發生改變時,需要重新加載它們就可以使用之生效;
而如果haresource文件發生了改變,則只能重啓heartbeat服務方可使之生效。

儘管Heartbeat並不要求主從節點間進行時鐘同步,但它們彼此間的時間差距不能超過1分鐘,
 否則一些配置爲高可用的服務可能會出異常。

Heartbeat當前也不監控其所控制的資源的狀態,比如它們是否正在運行,是否運行良好以
及是否可供客戶端訪問等。要想監控這些資源,要使用額外的Mon軟件包來實現。

######################################3、ha.cf配置文件部分參數詳解:
autojoin    none	#集羣中的節點不會自動加入
logfile /var/log/ha-log	#指名heartbaet的日誌存放位置
keepalive 2	#指定心跳使用間隔時間爲2秒(即每兩秒鐘在eth1上發送一次廣播)
deadtime 30	#指定備用節點在30秒內沒有收到主節點的心跳信號後,則立即接管主節點的服
                務資源
warntime 10	#指定心跳延遲的時間爲十秒。當10秒鐘內備份節點不能接收到主節點的心跳
          信號時,就會往日誌中寫入一個警告日誌,但此時不會切換服務
initdead 120	#在某些系統上,系統啓動或重啓之後需要經過一段時間網絡才能正常工作,
         該選項用於解決這種情況產生的時間間隔。取值至少爲deadtime的兩倍。
udpport 694	#設置廣播通信使用的端口,694爲默認使用的端口號。
baud    19200	#設置串行通信的波特率       
#bcast   eth0	# Linux  指明心跳使用以太網廣播方式,並且是在eth0接口上進行廣播。
#mcast eth0 225.0.0.1 694 1 0	#採用網卡eth0的Udp多播來組織心跳,一般在備用節點不止一臺
時使用。Bcast、ucast和mcast分別代表廣播、單播和多播,是組織心跳的三種方式,任選其一即可。
#ucast eth0 192.168.1.2	#採用網卡eth0的udp單播來組織心跳,後面跟的IP地址應爲雙機對方的IP
 地址
auto_failback on	#用來定義當主節點恢復後,是否將服務自動切回,heartbeat的兩臺主機
  分別爲主節點和備份節點。主節點在正常情況下佔用資源並運行所有的服務,遇到故障時把資源交
  給備份節點並由備份節點運行服務。在該選項設爲on的情況下,一旦主節點恢復運行,則自動獲取
  資源並取代備份節點,如果該選項設置爲off,那麼當主節點恢復後,將變爲備份節點,而原來的備
  份節點成爲主節點
#stonith baytech /etc/ha.d/conf/stonith.baytech	# stonith的主要作用是使出現問題的節點從集
  環境中脫離,進而釋放集羣資源,避免兩個節點爭用一個資源的情形發生。保證共享數據的安全性
  和完整性。
#watchdog /dev/watchdog	#該選項是可選配置,是通過Heartbeat來監控系統的運行狀態。使用該特
   性,需要在內核中載入"softdog"內核模塊,用來生成實際的設備文件,如果系統中沒有這個內核
   模塊,就需要指定此模塊,重新編譯內核。編譯完成輸入"insmod softdog"加載該模塊。然後輸入
   "grep misc /proc/devices"(應爲10),輸入"cat /proc/misc |grep watchdog"(應爲130)。最後
   ,生成設備文件:"mknod /dev/watchdog c 10 130" 。即可使用此功能
node node2.example.com  #主節點主機名,可以通過命令“uname –n”查看。
node node3.example.com  #備用節點主機名
ping 172.16.0.1	#選擇ping的節點,ping 節點選擇的越好,HA集羣就越強壯,可以選擇固定的路由
  器作爲ping節點,但是最好不要選擇集羣中的成員作爲ping節點,ping節點僅僅用來測試網絡連接
#ping_group group1 192.168.12.120 192.168.12.23  #類似於ping  ping一組ip地址
apiauth pingd  gid=haclient uid=hacluster
respawn hacluster /usr/local/ha/lib/heartbeat/pingd -m 100 -d 5s	
  #該選項是可選配置,列出與heartbeat一起啓動和關閉的進程,該進程一般是和heartbeat集成的插
  件,這些進程遇到故障可以自動重新啓動。最常用的進程是pingd,此進程用於檢測和監控網卡
  狀態,需要配合ping語句指定的ping node來檢測網絡的連通性。其中hacluster表示啓動pingd
  進程的身份。

#下面的配置是關鍵,也就是激活crm管理,開始使用v2 style格式
# crm respawn   
#注意,還可以使用crm yes的寫法,但這樣寫的話,如果後面的cib.xml配置有問題
#會導致heartbeat直接重啓該服務器,所以,測試時建議使用respawn的寫法

#下面是對傳輸的數據進行壓縮,是可選項
compression     bz2
compression_threshold 2


####################################4、haresources配置文件介紹
主從節點上的/etc/ra.d/raresource文件必須完全相同。文件每行通常包含以下組成部分:
1、服務器名字:指正常情況下資源運行的那個節點(即主節點),後跟一個空格或tab;
  這裏指定的名字必須跟某個節點上的命令"uname -n"的返回值相同;
2、IP別名(即額外的IP地址,可選):在啓動資源之前添加至系統的附加IP地址,
  後跟空格或tab;IP地址後面通常會跟一個子網掩碼和廣播地址,彼此間用“/”隔開;
3、資源腳本:即用來啓動或停止資源的腳本,位於/etc/init.d/或/etc/ha.d/resourcd.d目錄中;
  如果需要傳遞參數給資源腳本,腳本和參數之間需要用兩個冒號分隔,多個參數時彼此間也需要用兩個冒號分隔;如果有
多個資源腳本,彼此間也需要使用空格隔開;

格式如下:
primary-server [IPaddress[/mask/interface/broadcast]]  resource1[::arg1::arg2]  \
resource2[::arg1::arg2]
 
例如:
node2.example.com 172.16.10.20/16/eth0/172.16.255.255 \
Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld

######################################5、authkeys配置文件介紹
auth 1  # 指明認證類型
1 md5 6c781b5034b1f6b9379b # 指明對應的認證類型和隨機字符串


######################################6、補充資料:組播IP地址
組播IP地址用於標識一個IP組播組。IANA(internet assigned number authority)把D類地址
  空間分配給IP組播,其範圍是從224.0.0.0到239.255.255.255。如下圖所示(二進制表示),
  IP組播地址前四位均爲1110八位組⑴ 八位組⑵ 八位組⑶ 八位組⑷1110
  
XXXX XXXXXXXX XXXXXXXX XXXXXXXX組播組可以是永久的也可以是臨時的。組播組地址中,
  有一部分由官方分配的,稱爲永久組播組。永久組播組保持不變的是它的ip地址,組中的成
  員構成可以發生變化。永久組播組中成員的數量都可以是任意的,甚至可以爲零。那些沒有
  保留下來供永久組播組使用的ip組播地址,可以被臨時組播組利用。
224.0.0.0~224.0.0.255爲預留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址
  供路由協議使用。
224.0.1.0~238.255.255.255爲用戶可用的組播地址(臨時組地址),全網範圍內有效。
239.0.0.0~239.255.255.255爲本地管理組播地址,僅在特定的本地範圍內有效。常用的預留組播地
  址列表如下:
224.0.0.0 基準地址(保留)
224.0.0.1 所有主機的地址
224.0.0.2 所有組播路由器的地址
224.0.0.3 不分配
224.0.0.4dvmrp(Distance Vector Multicast Routing Protocol,距離矢量組播路由協議)路由器
224.0.0.5 ospf(Open Shortest Path First,開放最短路徑優先)路由器
224.0.0.6 ospf dr(Designated Router,指定路由器)
224.0.0.7 st (Shared Tree,共享樹)路由器
224.0.0.8 st主機
224.0.0.9 rip-2路由器
224.0.0.10 Eigrp(Enhanced Interior Gateway Routing Protocol,增強網關內部路由線路協議)路
   由器 224.0.0.11 活動代理
224.0.0.12 dhcp服務器/中繼代理
224.0.0.13 所有pim (Protocol Independent Multicast,協議無關組播)路由器
224.0.0.14 rsvp (Resource Reservation Protocol,資源預留協議)封裝
224.0.0.15 所有cbt 路由器
224.0.0.16 指定sbm(Subnetwork Bandwidth Management,子網帶寬管理)
224.0.0.17 所有sbms
224.0.0.18 vrrp(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議)
239.255.255.255 SSDP協議使用

二、heartbeat v1 + nfs 實現對mysql的高可用

1

實驗步驟:

#########################在172.16.10.9上:
#################提供nfs服務
一、安裝nfs管理工具
yum install nfs-utils -y

二、創建共享目錄並共享
mkdir /mysqldata
# vim /etc/exports 添加以下內容:
/mysqldata/ 172.16.0.0/16(rw,no_root_squash)

setfacl -m u:26:rwx /mysqldata (uid=26是使用rpm方式安裝的mysql時的mysql用戶的uid)

# 注意:上面的 no_root_squash 選項是爲了在安裝 mysql 時方便,安裝完成後,應去掉此選項。

三、啓動nfs服務
/etc/init.d/nfs start

############################################配置主節點和備節點
第一步:設置主機名
#########################在172.16.10.22上:
# vim /etc/sysconfig/netwoek中的HOSTNAME:
HOSTNAME=node2.example.com
#########################在172.16.10.33上:
# vim /etc/sysconfig/netwoek中的HOSTNAME:
HOSTNAME=node3.example.com

第二步:設置主機名解析
#########################在172.16.10.22上:
# vim /etc/hosts文件,添加:
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3
#########################在172.16.10.33上:
# vim /etc/hosts文件,添加:
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3

第三步:實現 node2 和 node3 之間基於ssh祕鑰認證
#########################在172.16.10.22上:
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub node3.example.com
#########################在172.16.10.33上:
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub node2.example.com

第四步:node2 和 node3 之間實現時間同步
1、可以使用相同的時間服務器來同步時間
2、可以手動設置是時間同步

驗證以上配置結果:

2

3

上面的配置正確的話,可以繼續進行如下配置:

第一步:安裝 mysql 服務,並配置
#########################在172.16.10.22上:
yum install mysql mysql-server
mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
# 啓動 mysql 並初始化 mysql,設置用戶密碼等
/etc/init.d/mysqld start
#########################在172.16.10.33上:
yum install mysql mysql-server
mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql
/etc/init.d/mysqld start

驗證以上配置結果:

4

5

注意:以上結果在測試時,mysqld服務只能在一個節點上啓動。當然,這裏需要授權給遠程用戶172.16.10.20的權限。完成這些配置後,可以繼續進行以下配置。

第一步:安裝heartbeat之前的工作
#########################在172.16.10.22,172.16.10.33上:
mysql>GRANT ALL ON *.* TO root@'172.16.10.20' IDENTIFIED BY 'guoting';
/etc/init.d/mysqld stop
umount /var/lib/mysql
chkconfig mysqld off

第二步:安裝heartbeat v1版本軟件
#########################在172.16.10.22,172.16.10.33上:
yum install perl-TimeDate net-snmp-libs libnet PyXML    # 注意:libnet是在epel倉庫中的,需要實現配置好。也可以手動編譯,下載地址:http://search.cpan.org/dist/libnet/
rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm # 這是由heartbeat 自己製作的rpm包

第三步:配置heartbeat
#########################在172.16.10.22
cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/

# vim /etc/ha.d/ha.cf 修改以下內容:
mcast eth0 226.10.10.10 694 1 0 
auto_failback on
node	node2.example.com
node	node3.example.com
ping 172.16.0.1

# vim /etc/ha.d/haresources 添加以下內容:
node2.example.com 172.16.10.20/16/eth0/172.16.255.255  \
Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld

# vim /etc/ha.d/authkeys 添加以下內容:
auth 1
1 md5 6c781b5034b1f6b9379b

chmod 600 /etc/ha.d/authkeys

#########################在172.16.10.33
scp -p node2.example.com:/etc/ha.d/{ha.cf,haresources,authkeys} /etc/ha.d

第四步:啓動服務
#########################在172.16.10.22
/etc/init.d/heartbeat start;ssh node3 '/etc/init.d/heartbeat start'

驗證以上結果:

6

7

8

此時模擬,主節點出現故障:

9

此時,從節點可以正常接管資源,用戶可以正常訪問。

10

11

此時,如果主節點重新上線,主節點會接管現有資源。(auto_failback on的緣由)

wKiom1QQQC_R3kC9AAF_oz5Hl1k926.jpg

三、heartbeat v2 + nfs 實現對mysql的高可用

實驗拓撲圖和上面一致。

第一步:修改ha.cf配置文件
#########################在172.16.10.22上:
crm on
scp /etc/ha.d/ha.cf node3:/etc/ha.d/

第二步:修改ha.cf配置文件
#########################在172.16.10.22、172.16.10.33上:
rpm -ivh rpm -ivh heartbeat2/heartbeat-gui-2.1.4-12.el6.x86_64.rpm 

第三步:啓動heartbeat服務
#########################在172.16.10.22、172.16.10.33上:
/etc/init.d/heartbeat start

配置完成後,可以驗證結果:

wKioL1QR0CeA7uGBAAGGilyztW4405.jpg

以上結果正確後,可以繼續以下實驗:

第一步:在主節點上設置ha_gui圖形化管理接口的密碼
# 默認登陸賬號是 hacluster 本地賬號
passwd hacluster

第二步:啓動圖形化接口工具配置
hb_gui &

圖形化管理接口界面:

wKioL1QR2VuBLK00AAFomHfkDIw015.jpg

添加組資源:

wKiom1QR2UzCJgpIAAEWldTqZPE630.jpg

wKioL1QR2VzyIcR2AAEYvTcYeeM701.jpg

在組中添加vip,storage,mysqld資源:

wKiom1QR2U3D8iJ0AAK7YXXpx-Y781.jpg

wKioL1QR2V6CQrO2AAJOZPYlh1M207.jpg

wKiom1QR2U-SzutlAAKyEz-gnjk092.jpg

wKiom1QR2VCgjzExAAHbYaVZfHg060.jpg

客戶端測試:

wKioL1QR2WDzipLVAAGhqapKKkE164.jpg

實現資源遷移:

wKiom1QR2VKQ8xpTAAG_B7odRo8833.jpg

wKioL1QR2WKRU_X9AAEPsjiuDmo656.jpg

wKiom1QR2VOyE0vIAAF0-RqXVf8395.jpg

wKioL1QR2WOyFKCFAAFmRYGIU1Y333.jpg

當然,這裏也可以使用資源約束來定義資源的粘性,啓動順序等。

至此,配置已全部完成。


以上內容是自己對知識的理解,如有偏差,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章