一、corosync、pacemaker介紹
corosync是用於高可用環境中的提供通訊服務的,它位於高可用集群架構中的底層(Message Layer),扮演著為各節點(node)之間提供心跳信息傳遞這樣的一個角色;
pacemaker是一個開源的高可用資源管理器(CRM),位於HA集群架構中資源管理、資源代理(RA)這個層次,它不能提供底層心跳信息傳遞的功能,它要想與對方節點通信需要借助底層的心跳傳遞服務,將信息通告給對方。通常它與corosync的結合方式有兩種:
pacemaker作為corosync的插件運行;
pacemaker作為獨立的守護進程運行;
corosync與pacemaker組成的是高可用的容器,需要高可用的服務,可隨時添到容器中,或者從容器中刪除。靈活性很強。
heartbeat我也用過,請參考:heartbeat mysql雙機互備實現高可用 安裝配置,
用過corosync與pacemaker後,個人推薦corosync與pacemaker。
二,服務器說明
192.168.10.130 虛擬ip
192.168.10.103 node1
192.168.10.219 node2
三,安裝配置corosync,pacemaker,crmsh
1,node1和node2上安裝
代碼如下
# yum install corosync pacemaker python-dateutil redhat-rpm-config pssh
# rpm -ivh http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/crmsh-2.1-1.6.x86_64.rpm
2,node1和node2,修改主機名
代碼如下
# vim /etc/sysconfig/network
HOSTNAME=node1 //103機器node1,219機器就是node2
# vim /etc/hosts //添加以下內容
192.168.10.103 node1
192.168.10.219 node2
# /etc/init.d/network restart //重啟網絡
3,node1配置corosync
代碼如下
[root@node1 corosync]# cp corosync.conf.example corosync.conf
[root@node1 corosync]# cat /etc/corosync/corosync.conf |awk '{if($0 !~ /^$/ && $0 !~ /#/) {print $0}}'
compatibility: whitetank //兼容08.以前的版本
totem { //totem定義集群內各節點間是如何通信的,totem本是一種協議,專用於corosync專用於各節點間的協議,協議是有版本的
version: 2 //totme 的版本
secauth: off //安全認證是否打開,最好打開
threads: 0 //用於安全認證開啟並行線程數
interface {
ringnumber: 0 //環號碼,如果一個主機有多塊網卡,避免心跳信息回流
bindnetaddr: 192.168.10.0 //網絡地址(節點所在的網絡地址段)
mcastaddr: 239.255.1.1 //廣播地址(系統自帶的廣播地址,沒作任何修改)
mcastport: 5405 //多播占用的端口
ttl: 1 //只向外一跳心跳信息,避免組播報文環路
}
}
logging {
fileline: off
to_stderr: no //日志信息是否發往錯誤輸出(否)
to_logfile: yes //是否記錄日志文件
to_syslog: yes //是否記錄於syslog日志-->此類日志記錄於/var/log/message中
logfile: /var/log/cluster/corosync.log //日志存放位置
debug: off //只要不是為了排錯,最好關閉debug,它記錄的信息過於詳細,會占用大量的磁盤IO.
timestamp: on //記錄日志的時間戳
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
service {
ver:0
name:pacemaker //corosync啟動後會自動啟動pacemaker
}
aisexec { //啟用ais功能時以什麼身份來運行,默認為root,aisexec區域也可以不寫
user :root
group:root
}
4,node1上用corosync-keygen命令來生成密鑰
[root@node1 corosync]# corosync-keygen //在/etc/corosync目錄下生成一個文件,authkey
網上查資料時,很多資料都說要,配置各節點ssh互信(就是ssh不要密碼登錄),經證實根本不需要,多此一舉。
5,將node1上配置文件復制到node2,nodeN上
代碼如下
[root@node1 corosync]# scp authkey corosync.conf root@node2:/etc/corosync/
...
[root@node1 corosync]# scp authkey corosync.conf root@nodeN:/etc/corosync/ //如果有很多節點都要copy
6,node1和node2,啟動並查看
代碼如下 # chkconfig nginx off //關閉開機啟動用crm status查看狀態時,如果報Could not establish cib_ro connection: Connection refused (111) ,說明本節點,連不上其他節點,經個人測試,解決辦法如下:
1,安全配置有問題,如iptables和selinux,配置成功前最好關閉iptables和selinux
2,corosync-keygen命令生成文件,要在修改主機名成功以後
重啟,關閉不了,一直處於Waiting for corosync services to unload:..........,這個問題,我在網上查一了,要到官方網站上下個補丁打一下,補丁我也打了,沒成功。解決辦法如下:pkill -9 corosync,在這裡要注意,這個問題很影響用戶體驗,如果不把corosync關閉,直接關機要很長很長時間才能關閉,坑爹
7,在node1上配置crmsh
代碼如下
# crm configure property stonith-enabled=false //禁用stonith-enable
# crm configure property no-quorum-policy=ignore //忽略投票規則
/**
* primitive:定義一資源所使用的命令
* webip:為資源起一個名字
* ocf:heartbeat;IPaddr:所使用資源代理的類別,由誰提供的那一個代理程序
* op monitor 對webip做監控
* interval:間隔時間
* timeout:超時時間
* on-fail:失敗自起
*/
# crm configure primitive webip ocf:heartbeat:IPaddr params ip=192.168.10.130 op monitor interval=30s timeout=20s on-fail=restart
# crm configure primitive nginx_res lsb:nginx //那些在/etc/init.d/*的腳本就是屬於lsb的
/**
* 定義排列約束
* colocation:排列約束命令
* nginx_web : 約束名
* inf:#(可能性,inf表示永久在一起,也可以是數值)
* webip nginx_res:#資源名稱
*/
# crm configure colocation nginx_web inf: nginx_res webip
/**
* 定義資源啟動順序
* order : 順序約束的命令
* nginx_after_ip : 約束ID
* mandatory: #指定級別(此處有三種級別:mandatory:強制, Optional:可選,Serialize:序列化)
* webip nginx_res:#資源名稱,這裡書寫的先後順序相當重要
*/
# crm configure order nginx_after_ip mandatory: webip nginx_res
# crm configure verify //審核
# crm configure commit //提交
# crm configure show //顯示
===================上為shell命令下操作,下為crm命令行下操作,功能一樣,看下圖============================
property stonith-enabled=false
no-quorum-policy=ignore
primitive webip ocf:heartbeat:IPaddr params ip=192.168.10.130 op monitor interval=30s timeout=20s on-fail=restart
primitive nginx_res lsb:nginx
colocation nginx_web inf: nginx_res webip
order nginx_after_ip mandatory: webip nginx_res
verify
commit
show
corosync pacemaker高可用的難點就是crmsh的命令行操作,子命令太多,下一篇文章,會詳細的說一下crmsh的命令,以及參數
crm 命令對比
crm 命令對比
四,測試corosync,pacemaker高可用
1,查看一下各節點是否online狀態
代碼如下
# crm status //查看各節點狀態
Last updated: Wed Nov 26 23:46:23 2014
Last change: Wed Nov 26 22:27:00 2014
Stack: classic openais (with plugin)
Current DC: node2 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
2 Resources configured
Online: [ node1 node2 ]
webip (ocf::heartbeat:IPaddr): Started node1
nginx_res (lsb:nginx): Started node1
2,建立測試文件
代碼如下
# vim /var/www/html/index.php //node1測試文件
<?php
echo "this is node1";
?>
# vim /var/www/html/index.php //node2測試文件
<?php
echo "this is node2";
?>
3,訪問虛擬ip:192.168.10.130,如果請求在node1上
代碼如下
# crm node standby //將node1上運行,將node1停用,看請求會不會轉到node2上面
在訪問192.168.10.130,你會發現請求轉到node2上去了。下面我們返過來操作。
# crm node standby //node2上運行,使用node2停用
# crm node online //在node1上運行,激活node1
在訪問192.168.10.130,你會發現,請求轉到node1上去了。