使用Openais 创建一个高可用集群
1, 节点的信息,和项目的目的
两个node1 ip 192.168.0.140 192.168.10.140
node2 192.168.0.141
集群服务为apache的httpd服务
提供web服务的地址为192.168.0.142
+> 表示在档中增加,或者修改某行为后面的内容
、安装如下软件包:
libibverbs, librdmacm, lm_sensors, libtool-ltdl, openhpi-libs, openhpi, perl-TimeDate
2、安装corosync和pacemaker,首先下载所需要如下软件包至本地某专用目录(这里为/root/cluster):
cluster-glue
cluster-glue-libs
heartbeat
openaislib
resource-agents
corosync
heartbeat-libs
pacemaker
corosynclib
libesmtp
pacemaker-libs
下载地址:http://clusterlabs.org/rpm/。请根据硬件平台及操作系统类型选择对应的软件包;这里建议每个软件包都使用目前最新的版本。
配置node1
#vim /etc/sysconfig/network
+> HOSTNAME=node1.z.org
#hostname node1.z.org
#vim /etc/hosts
+> 192.168.0.140 node1.z.org node1 编辑hosts档使得可以进行功能变量名称解析
+> 192.168.0.141 node2.z.org node2
#cd /etc/sysconfig/network-scripts/ 给节点一个静态的地址
#vim ifcfg-eth0
+>BOOTPROTO=static
IPADDR=192.168.0.140
NETMASK=255.255.255.0
GETWAY=192.168.0.254
# ssh-keygen -t rsa 生成一对密钥档
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 把密钥传送给node2,这次需要输入密码
#lftp 192.168.0.254
Cd pub/Sources
Mirror corosync
#cd corosync/
#rpm -ivh libesmtp-1.0.4-5.e
#yum -y --nogpgcheck localinstall *.rpm
配置node2
#vim /etc/sysconfig/network
+> HOSTNAME=node2.z.org
#vim /etc/sysconfig/network-scripts/ifcfg-eth0
+>BOOTPROTO=static
IPADDR=192.168.0.142
NETMASK=255.255.255.0
GETWAY=192.168.0.254
#ssh-keygen -t rsa
Node1
#ssh-copy-id -i .ssh/id_rsa.pub root@node2
#scp /etc/hosts node2:/etc
#ssh-copy-id -i .ssh/id_rsa.pub root@node1 在node2上把密钥档
#yum -y --nogpgcheck localinstall *.rpm 在node2上安装软件包
#cd /etc/corosync/
#cp corosync.conf.example corosync.conf
+> bindnetaddr:192.168.0.0
Mcastaddr: 多播的地址
Mcastport 端口
Compatibility:whitetank 支持
Totem 定义两个节点之间通过什么协议通信
Logging 定义日志信息
Logfile :/var/log/cluster/corosync.log 需要手动创建目录
+> aisexec {
+> User:root
+> Group:root
} 不是必须的
+> service {
+> ver:0
+> name:pacemaker
} 必须加上
生成认证档
#mkdir -v /var/log/cluster
#corosync-keygen 在当前目录下叫 authkey
#scp -p corosync.conf authkey node2:/etc/corosync
#mkdir -v /var/log/cluster 在node2s上
#/etc/init.d/corosync start
———————————————————————————————————————
日志信息
# grep -e "Corosync Cluster Engine " -e "configuration file" /var/logmessage 查看corosync引擎是否启动
Jun 14 19:02:08 node1 corosync[5103]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Jun 14 19:02:08 node1 corosync[5103]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
Jun 14 19:02:08 node1 corosync[5103]: [MAIN ] Corosync Cluster Engine exiting with status 8 at main.c:1397.
Jun 14 19:03:49 node1 corosync[5120]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Jun 14 19:03:49 node1 corosync[5120]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
#grep TOTEM /var/log/messages 查看初始化成员节点通知是否正常发出
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: CRM: Initialized
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] Logging: Initialized pcmk_startup
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Service: 9
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Local hostname: node1.a.org
#grep ERROR: /var/log/message | grep -v unpack_
#grep pcmk_startup /var/log/messages 查看pacemaker是否正常启动
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: CRM: Initialized
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] Logging: Initialized pcmk_startup
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Service: 9
Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Local hostname: node1.a.org
#crm status 查看节点是否正常运行
#ssh node1 -- /etc/init.d/corosync stop
#crm status
============
Last updated: Tue Jun 14 19:07:06 2011
Stack: openais
Current DC: node1.a.org - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ node1.a.org node2.a.org ]
#crm 一个命令用于管理节点 所有的命令可以在shell中运行完
Exit
配置一个资源
正常启动node1.a.org后,集群资源WebIP很可能会重新从node2.a.org转移回node1.a.org。资源的这种在节点间每一次的来回流动都会造成那段时间内其无法正常被访问,所以,我们有时候需要在资源因为节点故障转移到其他节点后,即便原来的节点恢复正常也禁止资源再次流转回来。这可以通过定义资源的黏性(stickiness)来实现。在创建资源时或在创建资源后,都可以指定指定资源黏性。
定义资源约束
1) 资源位置约束
2) 资源排列约束 多个资源是否在同一个节点上运行,或者两个资源不能再同一个节点上运行。
3) 资源顺序约束
定义约束时候要制定分数,分数越大资源
资源黏性
默认为0,会自动转移互相流动,基本等同于故障回复,资源可能移动到非之前的活动节点上。
大于0表示,留在当前的位置,但是如果有更合适的节点可用时会移动,越高表示越愿意呆在当前的位置。
小于0表示,资源离开当前位置,绝对值越高表示越愿意来开当前位置。
多以要定义默认,黏性值禁用恢复。
)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;
定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。INFINITY(无穷大)目前定义为 1,000,000。加减无穷大遵循以下3个基本规则:
1)任何值 + 无穷大 = 无穷大
2)任何值 - 无穷大 = -无穷大
3)无穷大 - 无穷大 = -无穷大
定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。
#crm ra classes 资源类型的种类
Heartbeat
Lsb
Ocf / heartbeat pacemaker
Stonith
#crm ra list ocf heartbeat 查看资源代理类型
# crm ra list heartbeat 里面的资源
#crm ra info heartbeat:IPaddr 查看某个资源的参数
# crm ra info heartbeat:IPaddr2 两个不一样,这个是用IP命令查看的
#crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.0.143
会报错,是stonish的错误 提示我们是否继续,选择否
#crm_vierify -L 查看是否有错误
crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
-V may provide more details
会报错 stonith的原因
默认启用stonith 可以使用命令禁用
#crm configure property stonith-enalbed=false 禁用stonith
#crm_vierify -L 这时就不会报错
#crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.0.143 启动资源,这个时候就不会报错了
#crm status 查看资源是否已经启动
#ifconfig 查看资源启动的那个主机上得eht0的别名是否生效
#crm configure property no-quorm-policy= ignore 继续运行,即使不满足条件
#crm_vierfiy -L
#crm configure show 查看集群的配置档,是否加上配置的参数
#ssh node1 -- /etc/init.d/corosync stop 在node2上停止node1 查看是否资源可以转过去
#crm configure show 查看集群的配置档
node node1.a.org
node node2.a.org
property $id="cib-bootstrap-options" \
dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false 表示stonith已经被禁用
#
#ssh node1 --/etc/init.d/corosync stop
#crm status
#crm configure rsc_defaults resource-stickiness=100 定义默认的资源黏性
#ssh node1 --/etc/init.d/corosync stop
#crm status 查看资源是否流动
#yum -y install httpd 装上服务,两个节点上都,安装httpd服务
#/etc/init.d/httpd start 测试下httpd服务是否可用
#/etc/init.d/httpd stop 停止服务
#chkconfig httpd stop 禁止服务开机自动启动
#crm ra list lsb 查看是否有脚本,其中存在httpd
#crm ra list ocf heartbeat 查看ocf中的脚本,其中为apache,和服务不太匹配
#crm ra info lsb:httpd 查看lsbl类型的httpd资源的语法格式:
lsb:httpd
Apache is a World Wide Web server. It is used to serve \
HTML files and CGI.
Operations' defaults (advisory minimum):
start timeout=15
stop timeout=15
status timeout=15
restart timeout=15
force-reload timeout=15
monitor interval=15 timeout=15 start-delay=15
#crm configure primitive WebSite lsb:httpd [parms op monitor] 定义资源
#crm status 查看资源的状态 ,服务时在两个节点上运行的
#echo " web1" > /var/www/html/index.html
所以需要强行的把两个资源在一个节点上运行
#crm configure group web WebIP WebSite 把两个资源定义成为一个组,让资源在一个节点上运行
或者执行
#crm configure
Group web WebIP WebSite
Commit 提交
Bye
#crm_verify -L 检查是否存在语法错误
#crm status 是在一个节点上运行的了
#ssh node1 --/etc/init.d/corosync stop
停止一个节点之后,查看是否查看是否资源转移
因此,对于前述的WebIP和WebSite可能会运行于不同节点的问题,可以通过以下命令来解决:
# crm configure colocation website-with-ip INFINITY: WebSite WebIP
接着,我们还得确保WebSite在某节点启动之前得先启动WebIP,这可以使用如下命令实现:
# crm configure order httpd-after-ip mandatory: WebIP WebSite
此外,由于HA集群本身并不强制每个节点的性能相同或相近,所以,某些时候我们可能希望在正常时服务总能在某个性能较强的节点上运行,这可以通过位置约束来实现:
# crm configure location prefer-node1 WebSite rule 200: node1
这条命令实现了将WebSite约束在node1上,且指定其分数为200;
----------------------------------------------------------------------------------------------------------------------