高可用的解決方案keepalived只是提供了最簡單的高可用功能,真正高級的功能keepalived很難完成。openAIS規範提供完善的解決方案,可是很重量級不少功能考慮的很全面、很細緻,瞭解這些咱們才能夠更加深刻的理解高可用的完整的體系,當遇到特殊的高可用場景咱們必須使用這些方案才能夠解決。node
OpenAIS規範的解決方案mysql
這個規範一直迭代到今天,造成的完整的體系如圖1.1sql
圖1.1數據庫
既然多個主機要組成一個集羣,那麼就要有一個軟件幫助多個主機間實現心跳信息通告,這個實現通告的在OpenAIS規範中被定義爲message layer。vim
整個集羣的服務管理須要一個軟件,被規範定義爲cluster resource manager集羣資源管理。這只是集羣資源管理,可是真正到執行操做的時候須要一個能夠管理主機服務的接口,這個接口軟件被規範定義爲location resource manager本地資源管理。這一層纔是真正執行操做的,產生這一層的緣由基本上全部的服務設計時都沒考慮被高可用,可是咱們有須要操控這些服務只好製造一個能夠調用其餘服務器的管理層。centos
message layer經常使用組件有:heartbeatv1,2,3,corosync(suse研發),cman(redhat)bash
cluster resource manager經常使用組件有:pacemaker(Redhat),heartbeatv1,2服務器
管理接口經常使用組件:crmsh(suse),pcs(Redhat)dom
網頁管理接口:hawk, LCMC, pacemaker-mgmtssh
centos6還有RHCS
高級功能
之因此說keepalived的功能簡單是由於如下這些
quorum投票功能
法定票數(大於總票數的一半也能夠設定不用大於一半) ,用來斷定集羣分裂的場景中,某些節點是否能夠繼續以集羣方式運行;
當偶數個機器組成的機器分裂,投票能夠藉助仲裁設備:
ping node
ping node group
quorum disk: qdisk
without quorum之時,如何採起對資源管控的策略:
stopped
ignore
freeze
suicide
資源隔離機制
當計算機故障,防止服務抖動和或者防止同時向共享存儲寫數據致使存儲破壞
節點級別:STONITH
電源交換機
服務硬件管理模塊
虛擬化軟件關閉虛擬機
資源級別:
共享存儲器禁止寫數據
資源粘性
資源傾向於留在當前的分數(-oo, +oo)
資源約束
位置約束:資源對某節點運行的傾向性(-oo, +oo)
inf: 正無窮
-inf: 負無窮
n:
-n:
排列約束:定義資源彼此間的傾向性(是否在一塊兒)
inf:
-inf:
n, -n
順序約束:屬於同一服務的多個資源運行在同一節點時,其啓動及關閉的次序約束;
A --> B --> C
C --> B --> A
資源組組:組內資源將會組內順序啓動和關閉
RA
resource Agent真正管理service的工具
大體有一下分類lsb,ocf,service,stonith,systemd
因爲資源能夠這樣靈活的組合配置,那麼咱們能夠打造一個極端的應用場景,五臺計算機提供四種不一樣的服務,咱們把五臺計算機直接組成一個集羣,根據資源粘性把四個服務分佈運行在不一樣的計算機上,而後留一臺計算機作給其餘四個計算機作backup。不只如此,當五臺計算機中兩臺計算機宕機,咱們可讓四種服務運行在三臺計算機之上。
corosync和pacemaker
實踐
目前有兩個比較經常使用的配置接口一個是crmsh一個pcs,這裏我首先使用crmsh構建一個mariadb高可用集羣,而後使用pcs構建一個haproxy集羣,這裏都使用雙節點。如圖1.2
圖1.2
如圖vip172.16.29.11在兩個node間流轉
準備配置
node1的配置
#下載crmsh的yum源的配置文件,覺得crmsh沒有被被收錄到源中 wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo -P /etc/yum.repos.d/ yum install pacemaker crmsh mariadb-server haproxy pcs -y
vim /etc/corosync/corosync.conf #配置文件事例 totem { version: 2 crypto_cipher: aes256 crypto_hash: sha1 interface { ringnumber: 0 #集羣主機所在的網段 bindnetaddr: 172.16.0.0 #多播地址 mcastaddr: 239.255.101.99 mcastport: 5405 ttl: 1 } } logging { fileline: off to_stderr: no to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: no debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } quorum { provider: corosync_votequorum } #配置組成集羣的兩個主機 nodelist { node { ring0_addr: 172.16.29.10 nodeid: 1 } node { ring0_addr: 172.16.29.20 nodeid: 2 } }
#使用這個命令生成corosync通訊的祕鑰 corosync-keygen vim /etc/hosts #添加域名解析 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.29.10 node1.org node1 172.16.29.20 node2.org node2 #主機間使用祕鑰通訊 ssh-keygen -t rsa #這個命令一路按回車就能夠了 ssh-copy-id -i .ssh/id_rsa.pub node2 #複製配置文件到node2,這一步須要在node2安裝pacemaker後執行 scp -p authkey corosync.conf node2:/etc/corosync/ scp /etc/hosts node2:/etc/
#開啓服務,並受權用戶登陸,建立數據庫jim systemctl start mariadb.service mysql <<eof grant all on *.* to 'tom'@'172.16.%.%' identified by '12345'; create database jim; eof #設置mariadb開機啓動,這一項是pacemaker控制systemd管理的服務根本 systemctl enable mariadb.service #啓動服務 systemctl start pacemaker.service corosync.service
node2的配置
#下載crmsh的yum源的配置文件,覺得crmsh沒有被被收錄到源中 wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo -P /etc/yum.repos.d/ yum install pacemaker crmsh mariadb-server pcs -y #開啓服務,並受權用戶登陸,建立數據庫tom,兩個主機的數據庫故意建立不同方便查看服務器遷移 systemctl start mariadb.service mysql <<eof grant all on *.* to 'tom'@'172.16.%.%' identified by '12345'; create database tom; eof #設置mariadb開機啓動,這一項是pacemaker控制systemd管理的服務根本 systemctl enable mariadb.service #啓動服務 systemctl start pacemaker.service corosync.service
mariadb集羣服務配置
mariadb集羣服務的配置使用crmsh配置,crmsh配置的集羣服務會自動同步到集羣的每個節點,同步的機制是配置信息是首先傳送到DC節點,而後通告給其餘節點。
crmsh的使用方法是輸入crm進入交互接口而後輸入配置,這個配置接口和交換機的配置接口使用相似,而且擁有強大的補全功能。具體怎麼使用我不介紹了,可使用help [command]查看幫助信息,幫助信息最底下還有事例。
crm configure #進入crm配置接口 property stonith-enabled=false #關閉stonith,由於咱們沒有具體的設備 property no-quorum-policy=ignore #不使用法定票數,由於咱們配置的是雙節點的集羣,一個節點故障另外一個節點擁有的票數就不會大於半數 primitive vip ocf:heartbeat:IPaddr params ip="172.16.29.11" #定義vip集羣資源 primitive mariadb systemd:mariadb #定義mariadb集羣資源 group dbservice vip mariadb #把vip和mariadb資源定義爲組,一羣兩個資源運行在同一臺主機之上 monitor vip 20s:20s #定義vip的監控,每20s監控一次,延遲20s monitor mariadb 20s:20s commit #保存配置,並使其生效
haproxy集羣服務配置
haproxy集羣配置使用pcs,pcs不是交互式管理接口,咱們能夠直接輸入管理命令管理
node1的配置
systemctl start pcsd.service #開啓pcsd進程 systemctl enable haproxy.service #設置haproxy開機啓動,這一項是pacemaker控制systemd管理的服務根本 vim /etc/haproxy/haproxy.cfg #在default中添加以下內容 stats enable stats hide-version stats uri /ha10
node2的配置
systemctl start pcsd.service #開啓pcsd進程 systemctl enable haproxy.service #設置haproxy開機啓動,這一項是pacemaker控制systemd管理的服務根本 vim /etc/haproxy/haproxy.cfg #在default中添加以下內容 stats enable stats hide-version stats uri /ha20
集羣的配置的配置
pcs resource create vip2 ocf:heartbeat:IPaddr params ip="172.16.29.12" op monitor interval=20s timeout=20 #定義vip2資源,並定義監控 pcs resource create haproxy systemd:haproxy op monitor interval=20s timeout=20 #定義haproxy資源,並定義監控 pcs constraint order set vip haproxy #使用順序約束把vip2和haproxy綁定在一塊兒
測試
而後咱們就能夠根據兩臺主機的ip地址狀況,測試高可用狀況了