概述
Heartbeat 項目是Linux-HA 工程的一個組成部分,它實現了一個高可用集羣系統。心跳服務和集羣通信是高可用集羣的兩個關鍵組件,在 Heartbeat 項目裏,由heartbeat 模塊實現了這兩個功能
Heartbeat是Linux-HA工程的一個組件,自1999年開始到現在,發佈了衆多版本,是目前開源Linux-HA項目最成功的一個例子,Linux-HA的全稱是High-Availability Linux;這個開源項目的目標是:通過社區開發者的共同努力,提供一個增強Linux可靠性(reliability)、可用性(availavility)和可服務性(serviceability) RAS的集羣解決方案
工作原理
Heartbeat(Linux-HA)的工作原理:heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗餘鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未收到對方發送的報文,那麼就認爲對方失效,這時需啓動資源接管模塊來接管運行在對方主機上的資源或者服務
高可用集羣
高可用集羣是指一組通過硬件和軟件連接起來的獨立計算機,它們在用戶面前表現爲一個單一系統,在這樣的一組計算機系統內部的一個或者多個節點停止工作,服務會從故障節點切換到正常工作的節點上運行,不會引起服務中斷。從這個定義可以看出,集羣必須檢測節點和服務何時失效,何時恢復爲可用。這個任務通常由一組被稱爲“心跳”的代碼完成。在Linux-HA裏這個功能由一個叫做heartbeat的程序完成
系統規劃:
這裏都是使用Centos 6.4_x86_64操作系統,nod1與nod2主機有兩塊網卡,eth0用於連接外部網絡,eth1用於連接兩臺Mysql服務器節點,作爲心跳線監控;nod3作爲共享存儲"NFS",只有一塊網卡;
節點類型 | IP地址 | 主機名 | IP工作類型 |
主節點服務器 | eth0:172.16.14.2 | nod1.allen.com | 外部通信IP |
eth1:192.168.14.2 | 心跳線連接IP | ||
eth0:0 172.16.14.10 | 虛擬IP | ||
備用節點服務器 | eth0:172.16.14.4 | nod2.allen.com |
外部通信IP |
eth1:192.168.14.4 | 心跳線連接IP | ||
NFS服務器 | eth0:172.16.14.3 | nod3.allen.com | 外部通信IP |
網 關 | 172.16.0.1 | 也用於仲裁 |
拓撲圖如下:
如上所示:eth0:0 172.16.14.10爲虛擬IP地址,提供外網訪問;172.16.0.1爲出口網關,同時爲了避免兩個節點爭搶資源,出口網關做爲仲裁IP;當nod1對NFS服務器操作時,nod2只是監聽狀態不能對NFS服務器做操作;如果nod1掛了,這時nod2會自動啓動自己的Mysql服務,同時對NFS服務器上面的數據有操作權限;如果nod1恢復正常工作,服務會自動切換回nod1上面
基本配置
1、配置IP地址;eth0網卡爲橋接,eth1爲VMnet3;並設置好IP地址
1
2
3
4
|
nod1 [root@localhost ~] # ifconfig eth0 |grep "inet addr:";ifconfig eth1 | grep "inet addr:"
inet addr:172.16.14.2 Bcast:172.16.255.255 Mask:255.255.0.0
inet addr:192.168.14.2 Bcast:192.168.14.255 Mask:255.255.255.0 |
1
2
3
4
|
nod2 [root@localhost ~] # ifconfig eth0 |grep "inet addr:";ifconfig eth1 | grep "inet addr:"
inet addr:172.16.14.4 Bcast:172.16.255.255 Mask:255.255.0.0
inet addr:192.168.14.4 Bcast:192.168.14.255 Mask:255.255.255.0 |
1
2
3
|
nod3 [root@localhost ~] # ifconfig eth0 | grep "inet addr:"
inet addr:172.16.14.3 Bcast:172.16.255.255 Mask:255.255.0.0 |
2、修改主機名稱
1
2
3
4
5
6
7
8
|
######在各個主機上配置主機名稱,編輯配置文件永久有效,須重啓系統 [root@localhost ~] # vim /etc/sysconfig/network HOSTNAME=nod1.allen.com [root@localhost ~] # vim /etc/sysconfig/network HOSTNAME=nod2.allen.com [root@localhost ~] # vim /etc/sysconfig/network HOSTNAME=nod3.allen.com ######如果不想編輯配置文件可以使用"hostname"命令設置主機名,但重啓後失效如:hostname nod1.allen.com |
3、配置各主機之間能相互解析到主機名,修改"/etc/hosts"文件,各主機的hosts文件相同,這裏只做一次介紹如:
1
2
3
4
5
6
7
|
######添加如下記錄在nod1、nod2、nod3節點上 [root@nod1 ~] # vim /etc/hosts 192.168.14.2 nod1.allen.com 192.168.14.4 nod2.allen.com 172.16.14.2 nod1.allen.com 172.16.14.4 nod2.allen.com 172.16.14.3 nod3.allen.com |
4、配置時間同步,在每臺服務器上做任務計劃使用"ntpdate"命令指定時間服務器自動更新時間如:
1
2
3
|
[root@nod1 ~] # crontab -e ######每分鐘同步一次,在nod1 nod2 nod3服務器上都做 * /1 * * * *
/usr/sbin/ntpdate 172.16.0.1 &>
/dev/null |
5、配置nod1與nod2雙機信任如:
1
2
3
4
5
6
7
8
9
10
|
######在nod1服務器上生成密鑰,一直按回車鍵生成密鑰即可 [root@nod1 ~] # ssh-keygen -t rsa ######將生成的公鑰上傳到nod2服務器上 [root@nod1 ~] # ssh-copy-id -i .ssh/id_rsa.pub 172.16.14.4 ========================================================= ######在nod2服務器上生成密鑰 [root@nod2 ~] # ssh-keygen -t rsa ######將生成的公鑰上傳到nod1服務器上 [root@nod2 ~] # ssh-copy-id -i .ssh/id_rsa.pub 172.16.14.2 註釋:做完信任後,測試是否還需要使用密碼,這裏不在演示 |
配置NFS存儲服務器NFS詳細介紹點此處
1、配置好YUM並安裝NFS軟件
1
2
3
4
5
6
7
|
[root@nod3 ~] # yum -y install nfs-utils rpcbind ######查看已安裝的NFS軟件 [root@nod3 ~] # rpm -qa | grep nfs nfs-utils-1.2.3-36.el6.x86_64 nfs-utils-lib-1.1.5-6.el6.x86_64 [root@nod3 ~] # rpm -q rpcbind rpcbind-0.2.0-11.el6.x86_64 |
2、由於NFS用戶驗證是靠用戶ID來做驗證,創建用戶用於nod1與nod2服務器掛載NFS文件系統使用
1
2
|
######創建的用戶UID爲300,在nod1與nod2服務器上面創建用戶請保持UID相同 [root@nod3 ~] # useradd -r -u 300 mysql |
3、創建NFS共享目錄
1
|
[root@nod3 ~] # mkdir -p /mydata/data |
4、修改主配置文件,共享NFS目錄;並啓動NFS服務
1
2
3
4
5
6
7
8
9
|
[root@nod3 ~] # vim /etc/exports /mydata/data 172.16.14.2(rw,no_root_squash) 172.16.14.4(rw,no_root_squash) [root@nod3 ~] # service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Stopping RPC idmapd: [ OK ] Starting RPC idmapd: [ OK ] Starting NFS daemon: [ OK ] |
安裝MysqlMysql編譯安裝點此
1、在nod1上面安裝Mysql服務,這裏直接使用通用二進制包來安裝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
######解壓縮Mysql [root@nod1 ~] # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@nod1 ~] # cd /usr/local/ ######創建軟鏈接 [root@nod1
local ] # ln -s mysql-5.5.33-linux2.6-x86_64 mysql [root@nod1
local ] # cd mysql ######爲Mysql提供Sysv服務腳本 [root@nod1 mysql] # cp support-files/mysql.server /etc/rc.d/init.d/mysqld ######添加執行權限並加入到系統服務 [root@nod1 mysql] # chmod +x /etc/rc.d/init.d/mysqld [root@nod1 mysql] # chkconfig --add mysqld ######提供Mysql主配置文件 [root@nod1 mysql] # cp support-files/my-large.cnf /etc/my.cnf ######修改主配置文件數據存放目錄位置 [root@nod1 mysql] # vim /etc/my.cnf datadir =
/data ######添加Mysql的PATH環境變量 [root@nod1 mysql] # echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile [root@nod1 mysql] # . /etc/profile ######添加Mysql的庫文件 [root@nod1 mysql] # echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf [root@nod1 mysql] # ldconfig ######添加Mysql頭文件信息 [root@nod1 mysql] # ln -s /usr/local/mysql/include /usr/include/mysql ######創建數據存放目錄,並掛載NFS文件系統 [root@nod1 mysql] # mkdir /data [root@nod1 ~] # mount -t nfs 172.16.14.3:/mydata/data /data ######創建Mysql用戶與NFS服務器上面的用戶UID相同,初始化數據庫並啓動 [root@nod1 mysql] # useradd -r -u 300 mysql [root@nod1 ~] # cd /usr/local/mysql [root@nod1 mysql] # ./scripts/mysql_install_db --user=mysql --datadir=/data/ [root@nod1 mysql] # service mysqld start Starting MySQL.... [ OK ] ######登錄Mysql,授權一個用戶爲方便後面測試 [root@nod1 mysql] # mysql [root@nod1 mysql] # mysql> grant all on *.* to 'root'@'172.16.%.%' identified by 'mypass'; ######禁止Mysqld開機自啓動並停止服務,因爲要使用heartbeat來管理Mysqld [root@nod1 mysql] # chkconfig mysqld off [root@nod1 mysql] # service mysqld stop |
2、在nod2服務器上面安裝Mysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[root@nod2 ~] # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/ [root@nod2 ~] # cd /usr/local/ [root@nod2
local ] # ln -s mysql-5.5.33-linux2.6-x86_64 mysql [root@nod2
local ] # cd mysql [root@nod2 mysql] # cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@nod2 mysql] # chmod +x /etc/rc.d/init.d/mysqld [root@nod2 mysql] # chkconfig --add mysqld [root@nod2 mysql] # cp support-files/my-large.cnf /etc/my.cnf [root@nod2 mysql] # mkdir /data [root@nod2 mysql] # vim /etc/my.cnf datadir =
/data [root@nod2 mysql] # echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile [root@nod2 mysql] # . /etc/profile [root@nod2 mysql] # echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf [root@nod2 mysql] # ldconfig [root@nod2 mysql] # ln -s /usr/local/mysql/include /usr/include/mysql [root@nod2 ~] # cd /usr/local/mysql [root@nod2 mysql] # useradd -r -u 300 mysql
######在啓動前需要把nod1上面的Mysql服務停止,否則不能啓動,這裏不需要初始化數據庫 [root@nod2 mysql] # service mysqld start Starting MySQL... [ OK ] [root@nod2 mysql] # chkconfig mysqld off [root@nod2 mysql] # service mysqld stop Shutting down MySQL. [ OK ] |
安裝Heartbeat
1、在nod1與nod2服務器上安裝Heartbeat
1
2
3
4
5
6
7
|
######在nod1服務器上安裝Heartbeat依賴環境 [root@nod1 ~] # yum -y install PyXML libnet ipvsadm net-snmp-libs ######這裏使用rpm包安裝 [root@nod1 ~] # rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm ######在nod2服務器上安裝Heartbeat依賴環境 [root@nod2 ~] # yum -y install PyXML libnet ipvsadm net-snmp-libs [root@nod2 ~] # rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm |
2、在nod1服務器上面配置Heartbeat認證文件、主配置文件與資源文件並拷貝到nod2服務器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
######切換目錄爲Heartbeat提供配置文件 [root@nod1 ~] # cd /usr/share/doc/heartbeat-2.1.4/ [root@nod1 heartbeat-2.1.4] # cp ha.cf authkeys haresources /etc/ha.d/ ######切換到Heartbeat配置文件目錄 [root@nod1 heartbeat-2.1.4] # cd /etc/ha.d/ ######生成一個隨機數 [root@nod1 ha.d] # openssl rand -hex 4 dca1f0ac ######修改認證文件 [root@nod1 ha.d] # vim authkeys auth 3 #啓用的哪一個認證,就把下面所對應的認證開啓 #1 crc #2 sha1 HI! 3 md5 dca1f0ac ==================================================================== ######修改主配置文件 [root@nod1 ha.d] # vim ha.cf logfile /var/log/ha-log #日誌文件開啓 #logfacility local0 #與上面日誌文件開啓任意一個即可 keepalive 2 #發送通知頻率 mcast eth0 225.14.2.1 694 1 0 #組播 auto_failback on #開啓此項爲如果主節點從故障恢復到正常狀態是否把服務自動切換到主節點 node nod1.allen.com #節點主機名稱,把所有節點都需要加入 node nod2.allen.com ping
172.16.0.1 #仲裁IP地址 compression bz2 #啓用壓縮 compression_threshold 2 #大於多少KB啓用壓縮,默認2KB ==================================================================== ######修改資源文件 [root@nod1 ha.d] # vim haresources ######設置資源類型 nod1.allen.com IPaddr::172.16.14.10 /16/eth0 Filesystem::172.16.14.3: /mydata/data :: /data ::nfs
mysqld 註釋: nod1.allen.com:爲主節點主機名稱 IPaddr:虛擬IP地址 Filesystem: 要掛載的文件系統資源:掛載點:文件系統類型 mysqld:服務類型,爲哪個服務做高可用 ==================================================================== ######拷貝Mysqld的服務腳本到Heartbeat資源目錄 [root@nod1 ha.d] # cp /etc/rc.d/init.d/mysqld resource.d/ ######將配置文件拷貝到nod2一份 [root@nod1 ha.d] # scp -p authkeys ha.cf haresources 172.16.14.4:/etc/ha.d |
3、在nod1服務器上面啓動Heartbeat服務並查看Heartbeat與Mysqld是否啓動
1
2
3
4
5
|
[root@nod1 ~] # service heartbeat start [root@nod1 ~] # netstat -naput|grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 36711 /mysqld [root@nod1 ~] # netstat -naput|grep 694 udp 0 0 225.14.2.1:694 0.0.0.0:* 35926 /heartbeat : wr |
4、啓動nod2服務器上面的Heartbeat服務並查看Heartbeat啓動
1
2
3
4
|
[root@nod1 ~] # ssh nod2.allen.com 'service heartbeat start' [root@nod1 ~] # ssh nod2.allen.com 'netstat -naput|grep 694' udp 0 0 225.14.2.1:694 0.0.0.0:* 39592 /heartbeat : wr 註釋:在nod2服務器Mysqld不會啓動,如果把nod1服務器的Heartbeat服務停止,這裏會自動運行Mysqld服務 |
5、在nod1服務器上創建數據庫並查看,然後停止Heartbeat服務
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@nod1 ~] # mysql -e 'create database allen;' [root@nod1 ~] # mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | allen | | log | | mysql | | performance_schema | | test | +--------------------+ [root@nod1 ~] # service heartbeat stop |
6、查看nod2服務器上面的Mysqld服務是否啓動,然後連接到數據庫查看數據庫
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@nod1 ~] # ssh nod2.allen.com 'netstat -naput|grep 3306' tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 40473 /mysqld [root@nod1 ~] # mysql -h 172.16.14.4 -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | allen | | log | | mysql | | performance_schema | | test | +--------------------+ |
7、假設把nod1服務器已經修復,啓動Heartbeat服務,查看Mysqld是否能自動切換到nod1服務器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@nod1 ~] # mysql -h 172.16.14.4 -e 'create database allen_yang;' [root@nod1 ~] # service heartbeat start ######查看數據庫,能查看到說明已經啓動 [root@nod1 ~] # mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | allen | | allen_yang | | log | | mysql | | performance_schema | | test | +--------------------+ |
8、測試使用客戶端工具使用虛擬IP“172.16.14.10”連接Mysqld服務
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
使用CRM圖形化界面來管理集羣資源
1、在nod1服務器上面修改Heartbeat主配置文件並拷貝到nod2服務器,使用兩臺服務器配置保持一致
1
2
3
4
5
6
7
8
|
######切換到Heartbeat配置文件目錄 [root@nod1 ~] # cd /etc/ha.d/ ######修改主配置文件 [root@nod1 ha.d] # vim ha.cf ######添加如下內容;下面兩個任選其一配置即可 crm respawn | crm on ######在啓動CRM圖形管理界面時會需要此用戶的密碼,所以先爲此用戶添加密碼 [root@nod1 ha.d] # echo hacluster | passwd --stdin hacluster |
2、啓動圖形化配置界面並連接到服務器
1
|
[root@nod1 ha.d] # hb_gui & |
3、創建資源組用於統一管理
4、設置組名及組的屬性
5、添加虛擬IP資源
5、添加虛擬IP的其他屬性
6、確定添加虛擬IP資源
7、添加文件系統資源並選擇添加的資源類型
8、確定添加文件系統資源
9、添加數據庫資源
10、啓動資源如下
11、已經成功在nod2服務器上運行
12、使用客戶端工具測試連接虛擬IP
13、已以成功連接到數據庫
14、暫停nod2服務器上的資源,測試是否會切換到nod1服務器
15、資源已經成功切換到nod1服務器
16、再次使用客戶端工具測試使用虛擬IP連接Mysqld
17、已經成功連接到Mysqld
到此Mysql高可用集羣就此結束;後面將會介紹其他開源集羣軟件的安裝配置及使用;敬請期待...