您的位置:首页 > 运维架构 > 网站架构

通过corosync+pacemaker实现集群的高可用性

2011-09-15 14:26 465 查看




说明:
如图:

1 本实验有两个接点node1.a.rog node2.a.org 相对应的ip分别是
192.168.0.21   192.168.0.22
2 集群的服务时apache 的httpd服务
3 提供web服务的地址为192.168.0.100


配置过程:

1 配置ip (两节点都需配置,以节点一为例)
Vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.0.21
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=00:0c:29:a2:fa:bb


2 所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:#############分别在两节点上进行
192.168.0.21     node1.a.org node1
192.168.0.22     node2.a.org node2


3 配置主机名,使其与使用" uname –n" 显示的一致,分别在各节点执行如下的命令,使其生效
Hostname node1.a.org
Vim /etc/ sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.a.com


4 设定两节点间可以基于密钥进行ssh通信,并且可以不用密码以root身份互相访问
Node1:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2
Node2:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1


5 下载安装软件,安装所需的软件包有:
cluster-glue-1.0.6-1.6.el5.i386.rpm       libesmtp-1.0.4-5.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm openais-1.1.3-1.6.el5.i386.rpm
corosync-1.2.7-1.1.el5.i386.rpm           openaislib-1.1.3-1.6.el5.i386.rpm
corosynclib-1.2.7-1.1.el5.i386.rpm        pacemaker-1.0.11-1.2.el5.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm          perl-TimeDate-1.16-5.el5.noarch.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm     resource-agents-1.0.4-1.1.el5.i386.rpm
pacemaker-libs-1.0.11-1.2.el5.i386.rpm


Cd /root/cluster
yum -y --nogpgcheck localinstall *.rpm


配置corosync 。以下命令在node1.a.rog上执行
cd /etc/corosync
cp corosync.conf.example corosync.conf

vim corosync.conf

# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {               ##定义多个node节点之间实现心跳信息传递的相关协议详细信息
version: 2
secauth: off  ##是否打开安全认证
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.0.0      ##通过哪个网段进行通信
mcastaddr: 226.94.1.1         ##多播地址
mcastport: 5405               ##多播端口
}
}
logging {
fileline: off
to_stderr: no                ##是否将错误信息发送到标准错误输出
to_logfile: yes              ##是否写入日志文件
to_syslog: yes               ##是否写到系统日志进程上去
logfile: /var/log/cluster/corosync.log      ##需要手动去建立这个路径
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
service {
ver:0
name:pacemaker      ##表明我们要启动pacemaker
}
aisexec {
user:root           ##定义启动的身份和组
group:root
}


6 生成节点间通信时用到的认证密钥文件
corosync-keygen  ###在/etc/corosync下生成authkey文件
scp -p corosync authkey node2:/etc/corosync/
mkdir /var/log/cluster ##创建corosync生成的日志文件所在的目录
ssh node2 'mkdir /var/log/cluster' ##在node1上使用ssl为node2创建目录


7 启动corosync
/etc/init.d/corosync start

在node1上验证corosync配置的正确性,如下所示,证明我们corosync的配置过程没有问题
在node1上查看corsync引擎是否正常启动:
grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
查看初始化成员节点通知是否正常发出:
grep TOTEM /var/log/messages
检查启动过程中是否有错误产生:
grep ERROR: /var/log/messages | grep -v unpack_resources
查看pacemaker是否正常启动:
grep pcmk_startup /var/log/messages


启动node2的corosync
ssh node2 ‘/etc/init.d/corosync start’


node2 启动后,node1和node2就形成了群节点,使用下面的命令可以查看群节点的启动状态
#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 ]


8 配置集群的工作属性:
由于corosync默认启用了stonith,而当前集群没有相应的stonith设备,所以这个默认配置目前上不可用,我们可以通过一个检查语法或者逻辑错误的命令来验证,如出现以下信息说明有错误,因此我们就要禁用stonith来避免这种错误
# crm_verify –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


# crm configure property stonith-enabled=false
# commit     #########提交会立即生效

禁用stonith后我们可以查看下当前的配置信息
# crm configure show
node node1.a.org
node node2.a.org
property $id="cib-bootstrap-options"
dc-version="1.0.111554a83db0d3c3e546cfd3aaff6af1184f79ee87"
cluster-infrastructure="openais"
expected-quorum-votes="2"
stonith-enabled="false


9 下面就是为机群添加资源了
# crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.0.100   ##为web集群创建一个ip地址源,能够在通过集群提供web服务时使用
# crm status ##通过这个命令可以看出ip资源已经在node1.a.org上启动
============
Last updated: Tue Jun 14 19:31:05 2011
Stack: openais
Current DC: node1.a.org - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ node1.a.org node2.a.org ]

WebIP       (ocf::heartbeat:IPaddr): Started node1.a.org  ####ip资源已在node1上启用 ,当然也可以在node1 上执行ifconfig命令,eth0的别名的ip

在node2上停止node1的corosync服务会
# ssh node1 ‘/etc/init.d/corosync stop’
# crm status   再次查看集群的工作状态
============
Last updated: Tue Jun 14 19:37:23 2011
Stack: openais
Current DC: node2.a.org - partition WITHOUT quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ node2.a.org ]
OFFLINE: [ node1.a.org ]


通过上面的信息我们发现node1.a.org已经离线,但是Webip的资源却没有在node2.a.org上启动,因为这时候的集群状态是“without quorum",没有了quorum,node2就不能接管资源,集群就不能正常运行了。我们可以同过下面的命令忽略quorum不能满足集群状态的检查
# crm configure property no-quorum-policy=ignore
# crm configure rsc_defaults resource-stickiness=100#############
将Webip资源的黏性值设为100,这样可以使当node1出现故障时,资源流转到node2上,
当node1又恢复正常时,资源不会再流回到node1,避免了资源在流动过程中造成的无法正常访问,
保证了集群的高可用性


10 结合上面已经配置好的ip地址资源,将此集群配置成为一个active/passive模型的web(httpd)服务集群
1)在每个节点上安装httpd,并在每个节点上添加网页文件
node1:
Yum install -y httpd
echo "<h1>Node1.a.org</h1>" > /var/www/html/index.html
node2:
echo "<h1>Node2.a.org</h1>" > /var/www/html/index.html
chkconfig httpd off #######开机不会自动启动httpd


2) 新建资源 WebSite
# crm configure primitive Webserver lsb:httpd
# crm configure commit #######提交生效
# crm configure show ############   显示资源的信息状态
# crm status   ##########可以看出新建的资源在node2上启动,这是集群尽量负载均衡资源的


3)把这两个资源在同一接点上运行有两种方法:
1把这两种资源配置组
2将两个资源定义成约束(排列,次序)
下面我们将这两种资源定义成组
#crm configure group Web WebIP Webserver #############其中Web是组名
# crm configure commit
# crm configure show
这样就将WebIP Webserver 添加到组Web中了。使他们在同一个接点上运行了。
这时,我们再查看下资源的运行 状态
# crm status
可以看出这两个起源都在node1上运行了


11 验证集群的工作是否正常,在浏览器中输入http://192.168.0.100




在node2上关闭node1的corosync,再次在浏览器中输入ip查看显示的网页信息




这样就我们就简单实现web服务的高可用了·····
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息