一、High availability Cluster
高可用集羣是保證服務穩定運行,給用戶一種服務從未中斷過的感覺,從而達到服務的高可用性。例如我們的網站後臺做了高可用性集羣,當我們的一臺web服務器宕機後,另一臺web服務器立馬接管它的服務,替代它的位置,實現用戶訪問網站時感覺網站從未中斷過服務一般。
最近一段時間有幾個門戶網站都出現了系統崩潰,服務中斷的事情,例如某易,某寶,某程;造成用戶一時無法登陸其網站訪問,損失無法估計,所以對於一個需要24小時不間斷提供服務的網站來講,高可用性集羣是多麼的重要。
實現高可用性的項目:
目前常用的有四個項目支持服務的高可用,分別是:
heartbeat ---------->linuxHA開源項目,以發展出三個版本;
corosync ---------->OpenAIS項目衍生出的一個項目,未來的HA方向;
cman ---------->redhat維護的HA開源項目;
keepalived --------->工作方式完全不同於以上三種,較輕量級;
二、corosync
corosync是從openais(開放性應用接口標準)中衍生出的一個分項目。第一版本的corosync只能提供節點間心跳的功能,無法提供管理資源的能力,需要藉助與cman或者heartbeat提供的資源管理能力。第二版的corosync功能已經完善,不需要藉助於第三方軟件就可以實現高可用集羣中的全部管理功能。
各個HA項目之間有不一樣的功能,具體的方案選擇要根據環境的實際需要來選擇。
常用的解決方案組合:
heartbeat v1 v2 + haresource //一般常用於CentOS 5.X
heartbeat v3 + pacemaker //一般常用於CentOS 6.X
corosync + pacemaker //最常用的組合
cman + rgmanager //紅帽集羣套件中的組件,還包括gfs2,clvm
keepalive + lvs //常用於lvs
三、HA cluster中使用到的名詞解釋:
1.HA------>High availability Cluster高可用性集羣;
2.resource----->資源,集羣中的每個元素都可以是資源,例如一臺web服務器,一個IP,一個httpd進程等;
3.node----->節點,集羣中的服務器;
4.DC------>主節點,是唯一的,對資源的修改,只能修改DC上的cib來實現,其他節點上的cib是不能同步的;
5.heartbeat------>心跳,各節點通過udp協議進行組播,其他節點能夠接受到此組播說明節點正常工作,一旦超過設定時間沒有接受到某節點發出的組播信號,就判斷此節點故障;
6.Split brain------->腦裂,又叫集羣分裂,由不確定的原因導致集羣中一些節點無法聯繫上另外的節點,導致集羣分裂爲兩個僞集羣的情況;
7.CCM----->Cluster Consensus Menbership Service集羣共享視圖,在全局級別構建節點關係視圖,判斷集羣發生分裂後哪些節點可以成爲活動節點,哪些節點將被判斷爲離線節點,並把這些消息傳遞給集羣資源管理層;
8.cib----->XML格式的全局配置文件,工作的時候常駐內存,只有DC才能對CIB進行修改,其他節點上的複製DC上的CIB而來。集羣的所有信息都會反饋在CIB中,要修改Cib要使用gui或命令行模式工具;
9.PE----->policy engine根據各節點的狀況生成決策,發送給TE執行;
10.TE----->transition engine將決策傳送給本地資源管理層LRM;
11.LRM----->調用資源代理,將資源需要執行的動作交給代理執行;
12.RA----->資源代理;
13.CRM----->集羣資源管理層,擁有管理集羣給各種資源的能力,提供了LRM,PE,TE,CIB等功能;
14.STONITH----->Shoot The Other Node in the Head,"爆頭",這種機制直接操作電源開關,控制故障節點的電源開關,通過暫時斷電又上電的方式,使故障節點重啓,這種方式需要硬件支持。
主節點在某一端時間由於某種原因,沒時間傳遞心跳信息,這個時候集羣會選取新的DC,從新分配資源提供服務,如果主節點服務器還沒有宕掉,這樣就會導致服務器分隔、資源爭用,這種情況被稱爲腦裂(brain-split)。此時,用戶能訪問,一旦有寫的操作,就會導致文件系統崩潰,損失慘重。爲避免這種情況,新的DC一旦產生,第一時間對主節點執行stonith,這種操作叫做資源隔離。
15.Resource isolation----->資源隔離
節點級別:這種就叫STONITH,直接把對方的電源給切斷,一般這種主機都是連接到電源交換機上的。
資源級別:同樣需要依賴一些硬件設備來完成。比如節點通過光纖交換機連接到共享存儲,通過把需要踢除出去的節點的光纖接口屏蔽來實現資源隔離。
16.Arbitration device----->仲裁設備
ping node:兩個節點的模式下,一旦其中一個節點發生故障,發生集羣分隔以後,無法判定哪個節點不正常,但工作正常的節點一定是可以連到互聯網,故正常的節點是可以跟前端路由通信,所以可以把前端路由當成第三個節點,如果可以ping通,那就說明自己是正常的,可以將對方隔離掉。
qdisk: RHCS不是使用ping節點來判斷,而是使用一個共享存儲的設備,節點按照心跳信息頻率每隔一個信息頻率時間就往磁盤裏寫一個數據位,如果設備每隔一個心跳時間間隔就更新一次數據位,就說明這個設備處於活動狀態的,可以將對方隔離掉。
四、HA的工作機制:
高可用集羣的工作原理是,在底層組成集羣的各個節點服務器上配置心跳傳遞機制,將各節點的活動狀態通過心跳機制傳遞出去,讓其他節點知道,一旦其中有一個節點發生故障或損壞導致服務不可用,心跳也將停止,其他節點收不到故障節點的心跳信息就判斷此節點故障,從而由上層的管理機制通過決策來指定一個節點加載故障節點上運行的服務,從而替代故障節點來工作。
1.HA工作模型中的四個層次
messaging and infrastructure layer
心跳傳輸層,主要用於節點之間傳遞心跳信息。節點之間傳遞心跳信息可以通過廣播,組播,單播等方式。
心跳信息:集羣中每一臺服務器都不停的將自己在線的信息通告給集羣中的其他主機。
心跳信息的傳遞是基於套接字通信的,通過軟件提供服務監聽套接字,實現數據發送、請求。必須安裝軟件,並開啓服務,這是實現高可用集羣的基礎。
membershio layer
CCM 用來統計集羣中所有節點的狀態的全局視圖,並把各種狀態通知CRM;
這層最重要的作用是通過Cluster Consensus Menbership Service(CCM)這種服務由Messaging層提供的信息,來產生一個完整的成員關係。
CCM 組件(Cluster Consensus Menbership Service):作用,承上啓下,監聽底層接受的心跳信息,當監聽不到心跳信息的時候就重新計算整個集羣的票數和收斂狀態信息,並將結果轉遞給上層,讓上層做出決定採取怎樣的措施。CCM 還能夠生成一個各節點狀態的拓撲結構概覽圖,以本節點做爲視角,保證該節點在特殊情況下能夠採取對應的動作。
resource allocation layer
資源管理器層,真正實現集羣服務的層。包含CRM(集羣資源管理器,cluster Resource Manager),CIB(集羣信息基庫,Cluster Infonation Base),PE(策略引擎,PolicyEngine),TE(實施引擎,Transition Engine), LRM(Local Resource Manager,本地資源管理器)。
CRM組件:核心組件,實現資源的分配和管理。每個節點上的CRM都維護一個CIB用來定義資源特定的屬性,哪些資源定義在同一個節點上。主節點上的CRM被選舉爲DC(Designated Coordinator指定協調員,主節點掛掉會選出新的DC),成爲管理者,它的工作是決策和管理集羣中的所有資源。
resource layer
任何資源代理都要使用同一種風格,接收四個參數:{start|stop|restart|status},每個種資源的代理都要完成這四個參數據的輸出。
工作機制:PE根據CIB獲取資源的配置信息(集羣上的所有信息都會收集到DC的CIB,同步到其它節點),而後做出決策,一旦做得決策就會進行資源的管理。PE藉助於本地的CCM通知給其它節點CIB來實現對某些資源管理信息的傳遞,比如說通告其它CRM要啓動某一資源了,收到信息後CRM並不負責啓動,轉由LRM(Local Resource Manager本地資源管理)啓動,而併發資源又藉助於RA(Resource Agent資源代理)實現資源管理。
2.HA工作模型圖
六、示例
corosync+pacemaker 基於NFS實現高可用的 mysql
1.網絡拓撲圖
2.規劃
(1)三臺主機分別爲node1;node2;node3
時間同步
基於主機名訪問
基於密鑰認證
(2)安裝corosync+pacemaker+crmsh+pssh
(3)修改配置文件
(4)開啓服務
(5)檢測服務可用性
(6)配置NFS主機,提供共享目錄
(7)各節點掛載nfs目錄
(8)各節點安裝mysql
(9)測試mysql可用性
(10)在任意一個節點上運行rcm,進行高可用規則配置
(11)測試mysql的高可用實現
七、實施
前期準備
1.配置node1和node2的時間同步、基於主機名訪問、ssh互聯
node1: hwclock -s ntpdate -u 172.16.0.1 crontab -e */3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null ssh-keygen -t rsa -f /root/.ssh/id_rsa -P '' ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] vim /etc/hosts 172.16.13.13 node1 172.16.13.14 node2 vim /etc/sysconfig/network HOSTNAME=node1.wuhf.com node2: hwclock -s ntpdate -u 172.16.0.1 crontab -e */3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null ssh-keygen -t rsa -f /root/.ssh/id_rsa -P '' ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] vim /etc/hosts 172.16.13.13 node1 172.16.13.14 node2 vim /etc/sysconfig/network HOSTNAME=node2.wuhf.com
2.配置nfs服務器
fdisk /dev/sda //創建一個大小爲10G 類型爲8e的分區 本文爲/dev/sda5 partx -a /dev/sda pvcreate /dev/sda5 vgcreate myvg /dev/sda5 lvcreate -L 10G -n mydata myvg mke2fs -t ext4 -L MYDATA /dev/myvg/mydata mkdir /mydata vim /etc/fstab LABEL=MYDATA /mydata ext4 defaults 0 0 mount -a groupadd -g 309 -r mysql //添加mysql用戶 useradd -r -g 309 -u 309 -s /sbin/nologin mysql chown -R mysql:mysql /mydata/ //讓mysql用戶對/mydata目錄有讀寫的權限 vim /etc/exports //通過nfs共享/mydata目錄 /mydata 172.16.13.13(rw,no_root_squash) 172.16.13.14(rw,no_root_squash) service nfs start showmount -e localhost Export list for localhost:/mydata 172.16.220.12,172.16.220.11
3.在node1和node2上驗證nfs共享目錄的讀寫權限
node1 node2: groupadd -r -g 309 mysql useradd -g 309 -u 309 -r mysql mkdir /mydata mount -t nfs 172.16.13.15:/mydata /mydata/ ls /mydata/ lost+found su - mysql //驗證mysql用戶是否對/mydata目錄有寫權限 su: warning: cannot change directory to /home/mysql: No such file or directory -bash-3.2$ cd /mydata -bash-3.2$ mkdir data //創建這個目錄,作爲mysql的數據目錄 -bash-3.2$ ls data lost+found
4.安裝maysql
node1 : mariadb-5.5.43-linux-x86_64.tar.gz //安裝此mysql tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv mariadb-5.5.43-linux-x86_64 mysql cd mysql chown -R mysql:mysql . //初始化mysql scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf //提供配置文件 vim /etc/my.cnf //在[mysql]下添加如下三行內容 datadir = /mydata/data innodb_file_per_table = on skip_name_resolve = on cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld //提供腳本 chkconfig --add mysqld service mysqld start Starting MySQL........ [ OK ] vim /etc/profile.d/mysql.sh //補全路徑 export PATH=/usr/local/mysql/bin:$PATH . /etc/profile.d/mysql.sh mysql //連上mysql \q //退出mysql service mysqld stop //停止服務 chkconfig mysqld off chkconfig --list mysqld //保證都是off umount /mydata //取消掛載 node2: tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv mariadb-5.5.43-linux-x86_64 mysql cd mysql chown -R root:mysql scp /etc/my.cnf node2:/etc/ //將node1上mysql配置文件複製一份給node2,此步驟要在node1上進行 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start Starting MySQL........ [ OK ] vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH . /etc/profile.d/mysql.sh mysql \q service mysqld stop chkconfig mysqld off chkconfig --list mysqld umount /mydata
5.安裝corosync+pacemaker
corosync-1.4.7-1.el6.x86_64.rpm //需要提前準備的安裝包 corosynclib-3.0.12-68.el6.x86_64.rpm pacemaker-1.1.12-4.el6.x86_64.rpm pacemaker-libs-1.1.12-4.el6.x86_64.rpm corosynclib-1.4.7-1.el6.x86_64.rpm libibverbs-1.1.8-3.el6.x86_64.rpm libqb-0.16.0-2.el6.x86_64.rpm librdmacm-1.0.18.1-1.el6.x86_64.rpm lm_sensors-libs-3.1.1-17.el6.x86_64.rpm net-snmp-libs-1:5.5-49.el6_5.3.x86_64.rpm pacemaker-cli-1.1.12-4.el6.x86_64.rpm pacemaker-cluster-libs-1.1.12-4.el6.x86_64.rpm perl-TimeDate-1:1.16-13.el6.noarch.rpm resource-agents-3.9.5-12.el6.x86_64.rpm yum install corosync pacemaker -y //因爲centos6.6上有,所以我直接使用yum安裝,node1和node2都要安裝 cd /etc/corosync cp corosync.conf.example corosync.conf vim corosync.conf //編輯corosync配置文件 compatibility withetank //兼容性選項 toten { secauth:on //安全認證功能開啓 threads:0 //多線程 interface{ ringnumber:0 //心跳回傳功能,一般不需要 bindnetaddr:172.16.0.0 //給網絡地址 mcastaddr:239.165.17.13 //多播地址 mcastport: 5405 //監聽端口,開啓服務後查看此項有沒有被corosync監聽 ttl:1 } } loggging { fileline:off to_stderr:no //日誌發往標準錯誤輸出,建議關閉 to_logfile:yes logfile:/var/log/cluster/corosync.log to_syslog:no debug:off timestamp:on //日誌記錄時間戳,建議關閉,影響性能,佔用資源 logger_subsys { subsys:AME debug:off } } service { //將pacemaker用作corosync的插件來運行,在配置文件中添加下面兩項; ver: 0 name: pacemaker # use_mgmtd: yes } aisexec { user: root group: root } corosync-keygen //會自動的在/etc/corosync目錄下生成一個key文件,是二進制格式的,權限爲400 scp -p authkey corosync.conf node2:/etc/corosync/ //將corosync和authkey複製至node2: service corosync start ssh node2 'service sorosync start' //同時在兩節點啓動corosync服務
6.安裝corosync的命令行接口crmsh
crmsh-2.1-1.6.x86_64.rpm //準備兩個安裝包 pssh-2.3.1-2.e16.x86_64.rpm yum --nogpgcheck install crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.e16.x86_64.rpm crm //使用crm工具進入命令行配置界面 >help >status >bye crm status //查看節點狀態
7.在node1上運行crmsh,配置高可用集羣規則
crm crm configure property stonith-enabled=false //禁用stonith crm configure property no-quorum-policy=ignore //修改忽略quorum不能滿足的集羣狀態檢查 crm configure rsc_defaults resource-stickiness=100 //爲資源指定默認黏性值 crm configure primitive myip ocf:heartbeat:IPaddr params ip=172.16.13.209 //配置VIP crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params device="172.16.13.15:/mydata" directory="/mydata" fstype="nfs" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s //配置自動掛載nfs目錄 crm(live)configure# primitive websql lsb:mysqld op monitor interval=10s timeout=15s //配置mysqld啓動 crm(live)configure# group sqlservice myip mynfs websql //定義組約束,使資源在一起 crm(live)configure# order webip_before_webstore Mandatory: myip mynfs websql //定義資源先後啓動順序 crm(live)configure# location myip_on_node1 sqlservice rule 100: #uname eq node1.wuhf.com //定義位置約束,資源更依賴於在哪一個節點上運行 crm(live)configure# verify //檢測 crm(live)configure# commit //提交,提交後配置信息自動同步到集羣個節點上 crm(live)configure# edit //編輯配置文件,可以在這裏面刪除或更改不需要的配置信息,操作同vim crm(live)resource# status //查看資源狀態 crm(live)resource# stop group //停止資源運行 crm(live)node# standby //將默認節點下線,查看資源有沒有轉移到另外一個節點 crm(live)node# online //將默認節點上線,查看資源有沒有返回當前節點上
8.測試mysql的高可用
crm status //可以看到node1目前是下線狀態,資源全都運行在node2上
crm onde online //現在node1上線了,因爲資源被定義爲更依賴於node1,所以資源全部回到了node1上運行
mysql> grant all on *.* to wuhf@'172.16.%.%' identified by 1234'; //在node1上爲mysql創建一個遠程連接用戶 mysql> flush privileges; mysql -uwuhf -h172.16.13.209 -p1234 //在nfs上安裝mysql,並測試連接遠程 mysq:l172.16.13.209 成功!
總結:
由於NFS提供的文件系統,容易在生產環境中成爲單點故障,所以生產實現mysql的高可用方案千萬別選擇NFS,我現在是測試環境,所以無所謂。
corosync是未來高可用解決方案中的主導項目,功能強大穩定,所以要掌握其命令和運行方式,主要在對於感念的理解上。
如果要做LAMP的高可用的話,就是多配一些規則,搞清楚規則的啓動先後順序罷了,道理都是一樣的。