Corosync/openais+pacemaker+DRBD+Web实现web+Drbd服务高可用集群

配置使用Corosync/openais+pacemaker+Drbd 来实现web+Drbd服务的高可用集群

一、准备工作

1、配置node1和node2的物理IP地址:|
node1:
ifconfig eth0 192.168.0.202/24

node2:
ifconfig eth0 192.168.0.204/24

2、配置两主机名,保证重启之后主机名不变

node1:
sed -i 's@\(HOSTNAME=\).*@\1node1.a.org@g'
hostname node1.a.org

node2:
sed -i 's@\(HOSTNAME=\).*@\1node2.a.org@g'
hostname node2.a.org

3、配置/etc/hosts文件,保证能够进行本地主机名解析
node1:
vim /etc/hosts 添加如下内容:
192.168.0.202 node1.a.org node1
192.168.0.204 node2.a.org node2
在node2上进行同样的配置

4、配置两个主机之间能够实现无密码访问

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

二、安装Corosync/openais+pacemaker

1、下载、安装软件包

我们只是为了验证这个解决方案,为了方便演示,使用rpm包进行安装

所需的软件包:

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
pacemaker-libs-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

将所有的软件包放到一个自建的目录yum中,方便安装

安装软件包
cd /yum
yum localinstall * --nogpgcheck -y

配置node1

2、配置node1的corosync

cd /etc/corosync/
cp corosync.conf.example corosync.conf 创建配置文件

修改配置文件

vim corosync.conf 添加如下内容:

service {
ver: 0
name: pacemaker
}

aisexec { 这个是安装了openais才需要添加的内容
user: root
group: root
}
并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址,我们这里的两个节点在192.168.0.0网络,因此这里将其设定为192.168.0.0;如下
bindnetaddr: 192.168.0.0
保存退出即可

创建所需要的日志目录

mkdir /var/log/cluster/

3、使用corosync-keygen 生成一个密钥,来进行同个集群主机的认证

corosync-keygen

4、将配置文件和密钥同步到node2上,并在node2上创建日志目录

scp –p corosync.conf authkey node2.a.org;/etc/corosync/
ssh node2 ‘mkdir –v /var/log/cluster’

5、启动node1的corosync服务

/etc/init.d/corosync start

6、验证是否成功启动了服务,在两个节点上进行同样的操作

(1)查看corosync引擎是否正常启动:

grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages 下面为输出信息

2011-09-15 12-01-06

(2)查看初始化成员节点通知是否正常发出:

grep TOTEM /var/log/messages

2011-09-15 11-59-18

(3)检查启动过程中是否有错误产生:

grep ERROR: /var/log/messages | grep -v unpack_resources    应该没有信息输出

(4)查看pacemaker是否正常启动:

grep pcmk_startup /var/log/messages

2011-09-15 12-02-56

如果上面命令执行均没有问题,接着可以执行如下命令启动node2上的corosync

ssh node2 -- /etc/init.d/corosync start

注意:启动node2需要在node1上使用如上命令进行,不要在node2节点上直接启动;

使用同样的方法验证node2是否成功启动

(5)使用Crm status命令, 查看两个节点的信息,看该服务是否已经同步

2011-09-14-11-57-14_thumb2

表示两个节点上的服务已经同步

三、安装DRBD

1、node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sda5,大小为1G;

2、安装软件包

安装drbd使用的软件包:

drbd83-8.3.8-1.el5.centos.i386.rpm  
kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

3、配置drbd

1)复制样例配置文件为即将使用的配置文件:
cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc

2)配置/etc/drbd.d/global_common.conf
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}

common {
protocol C;

handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; 
fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; 
split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; 
before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; 
after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}

startup {
wfc-timeout 120;
degr-wfc-timeout 120;
}

disk {
on-io-error detach;
fencing resource-only;
}

net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab";
}

syncer {
rate 100M;
}
}

4、定义我们要使用的web资源/etc/drbd.d/web.res,内容如下:
resource web {
  on node1.a.org {
         device /dev/drbd0; 定义drbd设备号
         disk /dev/sda5; 定义drbd设备所使用的磁盘
         address 192.168.0.202:7789; 此drbd设备监听的网络地址和端口
         meta-disk internal; 

on node2.a.org {
        device /dev/drbd0; 
        disk /dev/sda5;
        address 192.168.0.204:7789;
        meta-disk internal;
}
}

将这两个配置文件拷贝到node2上,以保证配置文件相同
cd /etc/drbd.d
scp web.res global_common.conf node2:/etc/drbd.d

scp /etc/drbd.conf node2:/etc/

5、在两个节点上初始化已定义的资源并启动服务:

1)初始化资源,在Node1和Node2上分别执行:
drbdadm create-md web

2011-09-15-00-34-14_thumb2

2)启动服务,在Node1和Node2上分别执行:
/etc/init.d/drbd start

2011-09-15-00-39-53_thumb1

3)查看启动状态:
cat /proc/drbd
2011-09-15-00-40-34_thumb4

也可以使用drbd-overview命令来查看:
drbd-overview
2011-09-15-00-41-50_thumb3

从上面的信息中可以看出此时两个节点均处于Secondary状态。我们要将其设定为Primary/Secondary模型,接下来需要将node1设置为Primary,在node1上执行如下命令:

drbdadm -- --overwrite-data-of-peer primary web 
         注:这个设置primary节点的命令只在第一次使用,以后就可以直接使用drbdadm primary web

而后再次查看状态,可以发现数据同步过程已经开始:
drbd-overview
2011-09-15-00-44-47_thumb1

此时我们还可以使用如下命令动态的查看同步过程
watch -n 1 'drbd-overview'
当数据同步完成以后再次查看状态
drbd-overview

2011-09-15-00-57-07_thumb1

可以发现节点已经为实时状态,且两节点已经成为Primary/Secondary模型

6、将两个节点上的/dev/drbd0设备进行格式化(只有为主节点上的drbd设备能够格式化,所以要通过改变节点的角色来实现)
     现在node1为主节点,所以可以直接进行格式化
      mke2fs -j /dev/drbd0

然后让node1成为从节点,node2称为主节点进行drbd设备的格式化
node1:
    drbdadm seconday web

node2:
    drbdadm primary web
    mke2fs -j /dev/drbd0

7、关闭drbd服务,并确保两节点上的drbd服务不会开机自动启动

/etc/init.d/drbd stop
ssh node2 -- '/etc/init.d/drbd stop'
chkconfig drbd off
ssh node2 -- 'chkconfig drbd off'

四、安装httpd

在node1和node2上分别安装httpd

Yum install httpd –y
chkconfig httpd off 保证web服务不会开机自动启动

五、配置web服务为高可用

1、查看当前集群的配置信息,确保已经配置全局属性参数为两节点集群所适用:

crm configure show

2011-09-15 14-17-46

确保有stonith-enabled和no-quorum-policy出现且其值与如上输出信息中相同。
否则,可以分别使用如下命令进行配置:
crm configure property stonith-enabled=false
crm configure property no-quorum-policy=ignore

2、设定web服务的基本资源

配置VIP资源

crm configure primitive http_IP ocf:heartbeat:IPaddr params ip=192.168.0.85
配置httpd资源

crm configure primitive httpd lsb:httpd 这个资源可是实现启用本节点的httpd服务

查看web服务资源的运行状态

crm status

2011-09-16 11-09-01

3、配置web服务的资源约束

web服务的这两个资源必须运行在同一个节点上才能保证web服务的正常运行,所以对这两资源进行排列约束

crm configure colocation http_IP_on_httpd inf: httpd http_IP

2011-09-16 11-16-27

由此可见,这两个资源已经运行到同一个节点上了

六、配置drbd服务为高可用

将已经配置好的drbd设备/dev/drbd0定义为集群服务;

1)配置drbd为集群资源:
drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多状态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。

[root@node1 ~]# crm
crm(live)# configure
crm(live)configure# primitive httpd_drbd_web ocf:heartbeat:drbd params drbd_resource=web op monitor role=Master interval=60s timeout=40s op monitor role=Slave interval=70s timeout=40s
crm(live)configure# master MS_Webdrbd httpd_drbd_web meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
crm(live)configure# verify
crm(live)configure# commit

查看关于httpd_drbd_web的配置
crm(live)configure# show httpd_drbd_web

2011-09-15-15-20-14_thumb1_thumb
查看资源的运行状态

crm status 显示如下:

2011-09-15-15-25-09_thumb1_thumb

由上面的信息可以看出此时的drbd服务的Primary节点为node1.a.org,Secondary节点为node2.a.org,我们在node1上使用如下命令验正当前主机是否已经成为web资源的Primary节点:
drbdadm role web
2011-09-15-15-29-22_thumb1_thumb

2)为Primary节点上的web资源创建自动挂载的集群服务

MS_Webdrbd的Master节点即为drbd服务web资源的Primary节点,此节点的设备/dev/drbd0可以挂载使用,且在某集群服务的应用当中也需要能够实现自动挂载。假设我们这里的web资源是为Web服务器集群提供网页文件的共享文件系统,其需要挂载至/var/www/html目录。

因为此自动挂载的集群资源需要运行于drbd服务的Master节点上,并且只能在drbd服务将某节点设置为Primary以后方可启动,所以还需要为这两个资源建立排列约束和顺序约束。

# crm
crm(live)# configure
crm(live)configure# primitive WebFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/www" fstype="ext3"
crm(live)configure# colocation drbd_webFS_on_MS_webdrbd inf: WebFS MS_Webdrbd:Master
crm(live)configure# order _after_MS_Webdrbd inf: MS_Webdrbd:promote WebFS:start
crm(live)configure# verify
crm(live)configure# commit

查看集群中资源的运行状态:
crm status
2011-09-15-16-21-17_thumb1

由上面的信息可以发现,此时WebFS运行的节点和drbd服务的Primary节点均为node1.a.org

3)测试

在node1的/var/www/html目录创建一个网页文件,而后在故障故障转移后查看node2的/var/www/html目录下是否存在这些文件。
echo node1 > /var/www/html/index.html

我们模拟node1节点故障,看此些资源可否正确转移至node2。

node1:
crm node standby

由于我们在/etc/drbd.d/global_common.conf配置文件中开启了资源隔离和脑列处理机制,所以在crm的配置文件cib中将会自动出现一个位置约束配置,当主节点宕机之后,禁止从节点变为主节点,以免当主节点恢复的时候产生脑列,进行资源争用,但是我们此时只是为了验证资源能够流转,所以将这个位置约束删除:

[root@node1 ~]# crm
crm(live)# configure
crm(live)configure# show 

2011-09-16 16-34-42
可以看到我们内有定义的一个以location开头的位置约束,

crm(live)configure# edit
使用VI编辑器打开这个配置文件,将这一行删除即可,保存退出,提交设置:

crm(live)configure# commit

然后在node2上进行状态查看
crm status

2011-09-15-16-45-18_thumb1

由上面的信息可以推断出node1停止服务,所有资源已经正常转移至node2。

在node2可以看到在node1作为primary节点时创建保存至/var/www/html目录中的数据,在node2上是否存在一份拷贝。

2011-09-15-16-50-41_thumb1

文件存在

让node1上线,看我们drbd资源是否会分布在两个节点上

2011-09-15-16-52-34_thumb1

可见drbd高可用服务的资源全部在node2上,也就是我们创建的约束条件得到了证实

到此使用Corosync/openais+pacemaker+DRBD实现DRBD服务高可用集群已经实现

七、将web高可用和drbd高可用的资源整合

web服务必须运行在drbd服务的主节点上,这样才能保证drbd可以存储web服务的数据

通过使用排列约束将web服务的资源运行在drbd服务的主节点上:
colocation httpd_on_drbd inf: http_IP_on_httpd MS_Webdrbd:Master

只有当drbd服务的所有资源启动之后才能启动web服务的资源,所以对web服务和drbd服务的资源配置次序约束

crm configure order httpd_after_drbd inf: drbd_web_FS_after_MS_Webdrbd:promote http_IP_on_httpd:start

查看资源的运行状态

2011-09-16 18-15-02

表示我们所有的资源都运行在了主节点node2上了

将主节点node2设置为standby,看所有的资源是否能够成功转移

当我们没有删除自动产生的位置约束的时候,运行状态如下图所示:

2011-09-16 18-18-59

刚开始时我们可以看到在主节点没有启动的时候,没有任何资源在运行,这表示我们配置的次序约束成功

然后我们删除自动产生的位置约束,继续查看运行状态:

2011-09-16 18-22-53

表示node1已经成为主节点所有的资源都转移到了node1上

八、测试

通过浏览器测试测试web+Drbd高可用集群是否实现

1、在此时的主节点上的drbd设备挂载目录内生成一个网页文件

echo node2 > /var/www/html/index.html

2、在浏览器中输入IP:192.168.0.85 看我们能否访问到页面
2011-09-16 13-19-55

此时我们将主节点node2设置为standby,看所有的资源是否能够成功转移
(注意:删除默认产生的位置约束)

node2:

crm node standby

这个同步的过程时间比较长,我们要耐心等待

2011-09-16 13-22-45

可见node1已经称为主节点,所有的资源都已经同步到主节点上,我们再次使用浏览器验证:

2011-09-16 13-28-57

可见数据在node1上成功同步

web+Drdb服务高可用集群已经成功实现

你可能感兴趣的:(Web,HA,drbd,pacemaker,corosync)