corosync+pacemker的高可用集羣,html
能夠分爲幾層:從下往上,分爲Messaging Layer(信息傳遞層或基礎架構層,用來傳遞心跳信息等的程序),Resoure Layer(資源管理器層(全局的),管理資源),Local Resouce Manager(本地資源管理器),在上面是資源代理,node
這種形式的高可用集羣,一旦分區,須要quorum(擁有法定票數) > total/2(總數),擁有法定票數多的一方表明集羣進行工做python
vote system: (投票系統)mysql
少數服從多數:quorum> total/2web
withquorum: 擁有法定票數sql
withoutquorum: 不擁有法定票數shell
兩個節點(偶數個節點):vim
Pingnode後端
qdiskcentos
若是是兩個節點的後端服務器,須要加仲裁機制,才能讓集羣正常的工做
資源管理層用來定義和管理資源,資源之間有位置關係(也叫約束)
資源類型:
primitive:主資源,原始資源;在集羣中只能運行一個實例;
clone:克隆資源,在集羣中可運行多個實例;匿名克隆、全局唯一克隆、狀態克隆(主動、被動)
multi-state(master/slave):克隆資源的特殊實現;多狀態資源;
group: 組資源;
啓動或中止;
資源監視
相關性:
資源屬性:
priority: 優先級;
target-role:started,stopped, master;
is-managed:是否容許集羣管理此資源;
resource-stickiness:資源粘性;
allow-migrate:是否容許遷移;
約束:score
位置約束:資源對節點的傾向性;
(-oo,+oo):
任何值+無窮大=無窮大
任何值+負無窮大=負無窮大
無窮大+負無窮大=負無窮大
排列約束:資源彼此間是否能運行於同一節點的傾向性;
順序約束:多個資源啓動順序依賴關係,即誰先啓動,誰後啓動;
CentOS7中,使用的是corosync v2(帶有投票系統) + pacemaker (獨立服務)
集羣的全生命週期管理工具:
pcs:agent(pcsd)
crmsh:agentless (pssh)
配置集羣的前提:
(1)時間同步;
(2)基於當前正在使用的主機名互相訪問;
(3)是否會用到仲裁設備;
配置兩節點的集羣服務,首先安裝pcs,安裝pcs會自動安裝corosync和pacmaker
示例:pcs的方式配置集羣,用pcs管理集羣
兩個節點都安裝pcs,時間要同步,要能基於主機名進行訪問,須要修改/etc/hosts文件(ansible的使用,若有疑問能夠查看本人的ansible的博客)
而後在每一個節點啓動pcsd.service,並讓開機自啓動
systemctl start pcsd.service
systemctl enable pcsd.service
使用ansible進行啓動
ansible websrvs -m service -a 'name=pcsdstate=started enabled=yes'
websrvs裏包括172.16.249.115 172.16.249.159
能夠使用systemctl status pcsd 來查看
而後給hacluster這個用戶設置密碼
ansible websrvs -m shell -a 'echo"mageedu" | passwd --stdin hacluster'
而後配置corosync 在其中的任意一個節點上進行配置(pcs help 能夠查看pcs的命令)
pcs cluster auth centos71 centos72 作認證
這樣驗證就經過了,你要保證每一個節點的hacluster的用戶的信息是同樣的,
在另外一個節點上測試下
而後設定集羣
pcs cluster setup --name mycluster centos71centos72
若是你之前作過corosync集羣,加個選項–force強制從新生成下
而後進入/etc/corosync/裏面會有一個corosync.conf配置文件,這個文件默認是不存在的
能夠修改配置文件(/etc/corosync/ corosync.conf),把日誌的存放位置改下
而後其餘節點也須要修改,
這個不須要修改就能夠啓動,這裏爲了查看日誌方便,才修改的
而後啓動集羣任意節點中pcs cluster start - - all 由於這裏只有一個集羣,因此使用all,若是有多個,能夠指定集羣名來啓動
而後檢查集羣啓動的狀態
檢查各節點通訊狀態(顯示爲no faults即爲OK):
corosync-cfgtool -s
能夠看到沒問題
檢查集羣成員關係及Quorum API:
corosync-cmapctl | grep members
這樣集羣就沒問題了
還能夠使用 pcs status 來查看集羣狀態
這裏有個警告,須要修改集羣的全局屬性stonith-enabled=false就能夠了,
Current DC是集羣中用來決策的節點
crm_verify -L –V這個命令能夠查看集羣是否有問題
配置集羣全局屬性,pcs property set stonith-enabled=false,而後在檢查就沒問題了
pcs resource describe 能夠查看資源的配置命令格式
查看一個詳細資源的配置信息
pcs resource describe 資源名 例:pcs resourcedescribe ocf:heartbeat:IPaddr
這樣就能夠查看這個資源的怎樣配置的了
定義資源,pcs resource create webip ocf:heartbeat:IPaddrip="172.16.36.88" op monitor interval=20s timeout=10s
刪除資源,pcs resource delete webip 這樣就能夠刪除
而後定義下一個資源
pcs resource create webserver systemd:httpdop monitor interval=30s timeout=20s
查看狀態
要把這兩個資源綁到一塊,使用約束,或者定義成組,這裏定義成組
pcs resource group add webservice webipwebserver
在看狀態
這樣資源就在一個節點上了
測試下
而後把這個節點狀態改成standby,資源就會到另外一個節點上了
pcs cluster standby centos71
能夠看到在另外一個節點上了,測試下
示例:手動配置 corosync + pacemaker 使用crmsh來管理集羣
首先在三個節點上172.16.249.195(centos7),172.16.249.115(centos71),172.16.249.159(centos72),安裝httpd服務,
設置測試頁
[root@centos7 ansible_playbooks]# echo"<h1>This is node1</h1>" >/var/www/html/index.html
[root@centos7 ansible_playbooks]# ansible172.16.249.159 -m shell -a'echo "<h1>This is node3</h1>">/var/www/html/index.html'
172.16.249.159 | success | rc=0 >>
[root@centos7 ansible_playbooks]# ansible172.16.249.115 -m shell -a'echo "<h1>This is node2</h1>">/var/www/html/index.html'
172.16.249.115 | success | rc=0 >>
而後測試服務是否都沒問題了,把服務停掉,而後把服務加入到列表中
而後作corosync+pacemaker集羣服務
首先安裝 corosync和 pacemaker, 使用ansible
建立一個installcpk.yml,而後加入內容以下:
- hosts: websrvs
remote_user: root
tasks:
- name: install corosync pacemaker
yum: name=corosync state=present
yum: name=pacemaker state=present
而後使用 ansible-playbook installcpk.yml
這樣就安裝好了
使用多播的形式來進行heartbeat的信息交互,而後crmsh認證
首先複製配置文件
cd /etc/corosync/
[root@centos7 corosync]# ls
corosync.conf.example corosync.conf.example.udpu corosync.xml.example uidgid.d
[root@centos7 corosync]# cp corosync.conf.example corosync.conf
而後修改配置文件
作安全認證
由於開啓認證了,因此要生成認證文件
corosync-keygen
而後把配置文件和認證文件,複製給其餘節點
scp -p authkey corosync.confcentos71:/etc/corosync/
scp -p authkey corosync.conf centos72:/etc/corosync/
而後驗證沒有問題的話,就能夠啓動了
寫一個ansible劇本,
vim startcpk.yml
- hosts: websrvs
remote_user: root
tasks:
- name: start corosync
service: name=corosync state=started
而後執行就好了
使用這個命令corosync-cfgtool –s驗證如下
其餘節點也都驗證一下
使用這個命令corosync-cmapctl也能夠驗證,裏面有下面這些信息就能夠了
而後啓動pacemaker ,配置文件在/etc/sysconfig/pacemaker裏,通常不用改,若是想單獨生成日誌文件,打開下面這一項
寫入到剛纔的ansible劇本里,而後執行
使用ps aux 查看下
而後使用crm_mon來監控集羣服務
能夠看到,節點都啓動成功了,就是沒有資源定義
下面來定義資源,能夠使用crmsh和pcs等,也能夠直接使用二進制的接口命令也能夠設置
下面使用crmsh,只須要在一個節點安裝crmsh就好了,而後在這個節點進行配置
使用crm_verify -L –V 能夠查看集羣的狀態,這裏顯示錯誤,是由於咱們沒有STONITH設備,但默認開啓了這一項,因此須要修改這一項stonith-enabled爲false
安裝crmsh來進行修改和定義資源
首先下載,
crmsh-2.1.4-1.1.x86_64.rpmpssh-2.3.1-4.2.x86_64.rpm python-pssh-2.3.1-4.2.x86_64.rpm
這幾個rpm包,而後yum -y install *.rpm(你要保證當前目錄下,就只有這三個rpm包)
而後就能夠使用crm工具了
而後就行資源的定義,修改STONITH這一項crm(live)# configure property stonith-enabled=false
而後在crm_verify -L -V檢查集羣就沒問題了,下面開始配置資源
show能夠查看已定義的資源,而後定義IP這個資源,使用verify能夠檢查錯誤,若是出錯會提示,若是出錯,能夠使用delete webip這個資源
primitive webip ocf:heartbeat:IPaddr paramsip="172.16.36.88" op monitor interval=30s timeout=20s
primitive webserver systemd:httpd opmonitor interval=30s timeout=20s
colocation webserver_with_webip inf:webserver webip 這是定義這兩個資源在一塊兒,排列約束
order webserver_afterwebip Mandatory: webipwebserver定義順序約束
而後提交commit
使用show xml 能夠看到配置的配置文件,定義好提交,而後在使用status就能夠查看集羣的狀態了,從上圖能夠看出,資源已經啓動了
查看下ip地址
地址加上了,而後訪問下
而後把第一個節點變爲備用
而後使用這個命令crm node standby
而後在查看狀態
能夠看到遷移了,
而後去centos71上看下,而後在訪問下
沒問題了,而後再把節點一還原回來,看下資源會不會切換來
能夠看到資源沒有動,咱們能夠定義位置約束,只要這個節點在,就會把資源移動到這個節點上
location webservice_pref_centos7 webip 100:centos7 定義位置約束
而後commit同步
能夠看到資源回到cemtos7上了
下面把web的頁面放在nfs服務器上,而後修改資源進行操做
首先在nfs服務器上建立一個目錄,mkdir /www/htdocs -pv
而後寫一個測試頁echo "<h1>Test Page on NFS Server</h1>" >/www/htdocs/index.html
而後把這個目錄輸出出去,編輯/etc/exports
而後執行service nfs start,而後確保沒有被iptables阻斷
而後chkconfig nfs on 讓其能開機啓動
而後測試一下,
在其餘主機上使用showmount -e 172.16.249.248
能夠看到沒問題了
而後掛載上,訪問測試下
而後使用crmsh定義nfs資源
而後把剛定義的順序和綁定的約束刪掉
delete webserver_with_webip
delete webserver_afterwebip
而後定義資源
primitive webstore ocf:heartbeat:Filesystemparams device="172.16.249.248:/www/htdocs"directory="/var/www/html" fstype="nfs" op start timeout=60sop stop timeout=60s op monitor interval=20s timeout=40s
colocation webserver_with_webstore_and_wibipinf: webserver (webip webstore)
order webstore_after_webip Mandatory: webipwebstore
order webserver_after_webstore Mandatory:webstore webserver
commit,
status
而後測試就好了
使用corosync + pacemaker作mysql集羣
首先設置nfs
而後在nfs共享的目錄裏,建立一個data目錄,屬主屬組改成mysql 權限766
負載mysql服務
而後在節點主機裏,建立一個/mydata/data/目錄屬主屬組改成mysql權限766
修改/etc/my.cnf的datadir=/mydata/data 而後重啓mariadb,若是能正常啓動沒有問題的話
就把上面作的資源修改下就能夠實現mysql集羣了。(這個之後有時間在演示)