Corosync/Pacemaker+DRBD实现高可用集群与DRBD共享

作者: 魏延是反贼. 分类: Linux, 系统·安全·调优

配置前提:
1.节点的名字必须跟uname -n的名字相同,而且两个主机必须能通过主机名来访问。尽量不通过DNS来访问。
2.
双方的通信要必须通过SSL的无障碍通信机制
3.
双节点之间可以通过某个IP来提供连接,但是这只是通信Ip,我们需要VIP来对外提供服务。
4.
我采用虚拟机的方式实现配置,操作系统使用rhel5.4x86平台
5.
两个节点主机IP分别为172.16.19.11node1.weiyan.org,以及172.16.19.12node2.weiyan.org
6.
集群服务为apachehttpd服务
7.
提供Web服务的地址(VIP)172.16.19.1
8.
在两个节点上分别准备一块大小为2G的分区用于实现DRBD的共享。(本文使用新分区/dev/sda5)
9.本文中所提到的主要软件包corosync所用和drbd的软件包,都已经在文章最后给予提供

 


一:corosync的配置

1.准备工作
1)我们首先要保证两节点之间时间相差不应该超过1秒

  1. hwclock -s 

2)两台主机的主机名:node1.weiyan.org && node2.weiyan.org
3)分别在两个node节点上编辑/etc/hosts文件并加入

172.16.19.11   node1.weiyan.org   node1
172.16.19.12   node2.weiyan.org   node2

4)生成密钥,确保通信正常

  1. ## node1上: 
  2. ssh-keygen -t rsa 
  3. ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2.weiyan.org 
  4. ## node2上: 
  5. ssh-keygen -t rsa 
  6. ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1.weiyan.org 

5)安装所依赖的软件包,以及要用到的主程序包

这里我们创建环境所需要依赖到的软件包有:
libibverbs,librdmacm,lm_sensors,libtool-ltdl,openhpi-libs,openhpi,perl-TimeDate

安装corosync和pacemaker,下载主程序包,并将其放至单独目录方便安装:(这里为/root/corosync

cluster-glue、cluster-glue-libs、heartbeat、openaislib、resource-agents、corosync、heartbeat-libs、pacemaker、corosynclib、libesmtp、pacemaker-libs

下载地址:http://clusterlabs.org/rpm/。请根据硬件平台及操作系统类型选择对应的软件包;这里建议每个软件包都使用目前最新的版本。(本文最后提供了这些软件包,可以直接下载)

 

  1. ## 安装使用: 
  2. cd /root/corosync 
  3. yum -y –nogpgcheck localinstall *.rpm 

2.配置corosync(这阶段内容都在node1上进行)

  1. cd /etc/corosync/ 
  2. cp corosync.conf.example corosync.conf 

1)编辑corosync.conf使其含有如下内容

# Please read the corosync.conf.5 manual page

compatibility: whitetank
totem {               ##定义多个node节点之间实现心跳信息传递的相关协议详细信息
version: 2
        secauth: off  ##是否打开安全认证
        threads: 0
        interface {
                ringnumber: 0
                bindnetaddr: 172.16.19.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
}

    建立目录:mkdir /var/log/cluster

2)生成authkey

  1. corosync-keygen      ##自动生成认证密钥(默认情况下将会从熵池里拿随机数)  

3)将配置文件和authkey传递到node2

  1. scp -p authkey corosync.conf node2:/etc/corosync 
  2. ssh node2 ‘mkdir -v /var/log/cluster’ 

3.启动corosync并检查配置

  1. service corosync start  

1)验证错误

##查看corosync引擎是否正常启动
grep -e “Corosync Cluster Engine” -e “configuration file” /var/log/messages
应出现含有:[MAIN  ] Corosync Cluster Engine (‘1.2.7’): started and ready to provide service.

##查看初始化成员节点通知是否发出
grep TOTEM /var/log/messages
应出现含有:
[TOTEM ] The network interface [172.16.19.11] is now up.

##检查启动过程中是否有错误产生:
grep ERROR: /var/log/messages
应没有任何内容出现

##查看pacemaker是否正常启动:
grep pcmk_startup /var/log/messages
应出现含有:
[pcmk  ] info: pcmk_startup: Local hostname: node1.weiyan.org

3)当node1的检测正常之后,进行node2启动和验证

  1. ssh node2 ‘/etc/init.d/corosync start’  

4).查看当前集群状态

  1. crm status 
============
Last updated: Wed Sep 14 20:16:17 2011
Stack: openais
Current DC: node1.weiyan.org – partition WITHOUT quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
0 Resources configured.
============ 

Online: [ node1.weiyan.org node2.weiyan.org ]



二.定义高可用资源

1.我们里可以通过如下命令先禁用stonith:

  1. crm configure property stonith-enabled=false  

2.添加IP资源

  1. crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.19.1  

3.定义httpd资源

1)分别在两个节点上安装httpd

  1. yum install -y httpd 

2)添加网页以方便验证

  1. ## node1上输入: 
  2. echo “node1.weiyan.org” > /var/www/html/index.html 
  3. ## node2上输入: 
  4. echo “node2.weiyan.org” > /var/www/html/index.html 

3)手动停止其开机自动启动并确保当前没有启动中

  1. chkconfig httpd off 
  2. service httpd stop 

4)定义httpd集群资源

  1. crm configure primitive WebServer lsb:httpd 

4.查看状态并定义约束

1)查看当前资源状态

  1. crm status 
============
Last updated: Web Sep 14 20:29:31 2011
Stack: openais
Current DC: node2.weiyan.org – partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============ 

Online: [ node1.weiyan.org node2.weiyan.org ]

 WebIP    (ocf::heartbeat:IPaddr):  Started node1.weiyan.org
 WebServer     (lsb:httpd):       Started node2.weiyan.org


2)定义关联以及约束

  1. crm configure colocation WebServer-with-WebIP INFINITY: WebServer WebIP 
  2. crm configure order WebServer-after-WebIP mandatory: WebIP WebServer 
  3. crm configure location prefer-node1 WebServer rule 200: node1  

3)定义quorum运行方式

  1. crm configure property no-quorum-policy=ignore  

4)查看配置状态

  1. crm configure show 

 

node node1.weiyan.org \
attributes standby=”off
node node2.weiyan.org \
         attributes standby=”off
primitive WebIP ocf:heartbeat:IPaddr \
         params ip=”172.16.19.1
primitive WebServer lsb:httpd
colocation WebServer-with-WebIP inf: WebServer WebIP
order WebServer-after-WebIP inf: WebIP WebServer
property $id=”cib-bootstrap-options” \
         dc-version=”1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87” \
         cluster-infrastructure=”openais” \
         expected-quorum-votes=”2” \
         stonith-enabled=”false” \
         no-quorum-policy=”ignore
rsc_defaults $id=”rsc-options” \
resource-stickiness=”200


三,配置DRBD

1.安装drbd

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

2.配置drbd

1)复制样例配置文件为即将使用的配置文件:

  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;
        }

## handlers里的内容非常重要,防止DRBD脑裂,我们需要将所有的防止机制都开启
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;
}
}

3).定义一个新资源/etc/drbd.d/web.res,内容如下:

resource web {
  on node1.weiyan.org {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.19.11:7789;
    meta-disk internal;
  }

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

4).将配置文件同步至node2

  1. scp -r /etc/drbd.conf /etc/drbd.d/ node2:/etc/ 

4.初始化已定义的资源并启动服务:

1)初始化资源,在Node1和Node2上分别执行:

  1. drbdadm create-md web 

2)启动服务,在Node1和Node2上分别执行

  1. /etc/init.d/drbd start 

3)查看启动状态:

  1. cat /proc/drbd 
version: 8.3.8 (api:88/proto:86-94)

GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—-
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1959800

4)设置node1为主节点

  1. drbdsetup /dev/drbd0 primary –o 

5)而后再次查看状态,可以发现数据同步过程已经开始:

# drbd-overview
  0:web  SyncSource Primary/Secondary UpToDate/Inconsistent C r—-
         [====>……………] sync’ed: 28.0% (1413848/1959800)K delay_probe: 52

6)等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:

  1. drbd-overview 
  2.  0:web  Connected Primary/Secondary UpToDate/UpToDate C r—-

5、创建文件系统

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:

  1. mke2fs -j -L DRBD /dev/drbd0 ## 格式化为ext3 
  2. mkdir /mnt/drbd  ## 创建测试目录 
  3. mount /dev/drbd0 /mnt/drb ## 挂载至测试目录 

6、切换Primary和Secondary节点

对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:

  1. ## Node1上: 
  2. echo “drbd.weiyan.org” > /mnt/drbd/index.html  ##定义测试文件 
  3. umount /mnt/drbd  ## 卸载drbd 
  4. drbdadm secondary web ##设置node1为Secondary状态 
  5.  
  6. ##查看状态:则两节点都为Secondary状态 
  7. drbd-overview 
  8.   0:web  Connected Secondary/Secondary UpToDate/UpToDate C r—- 
  9.  
  10. ## Node2上: 
  11. drbdadm primary web ## 设置node2成为Primary状态 
  12. drbd-overview 
  13.   0:web  Connected Primary/Secondary UpToDate/UpToDate C r—- 
  14. mkdir /mnt/drbd 
  15. mount /dev/drbd0 /mnt/drbd ## 挂载至测试目录 

四:配置corosync使集群能争用DRBD资源。

版权声明:

第四步实现的过程文档为转载,原作者花费不少心血来实现并写成文档,请大家尊重原作者,下文原作者:马哥,博客地址:http://blog.chinaunix.net/space.php?uid=233544&do=blog&id=2427499

本人在实现这篇文档的时候发现文档内容有细微错误,在这里已将其纠正。并增加了注释。希望大家在实现的过程中发现问题请及时提出。

1.为了将DRBD定义成集群服务,我们首先要做以下工作

停止drbd服务,以及不能使其开机启动

  1. drbd-overview 
  2.  0:web Unconfigured . . . .  
  3. chkconfig drbd off  

2.配置drbd为集群资源:

小贴士:

提供drbd的RA目前由OCF归类为linbit,其路径为/usr/lib/ocf/resource.d/linbit/drbd。我们可以使用如下命令来查看drbd信息:

 crm ra info ocf:linbit:drbd

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

[root@node1 ~]# crm
crm(live)#
configure
crm(live)configure#
primitive webdrbd ocf:heartbeat:drbd params drbd_resource=web op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s
crm(live)configure#
master MS_Webdrbd webdrbd meta master-max=”1″ master-node-max=”1″ clone-max=”2″ clone-node-max=”1″ notify=”true”
crm(live)configure#
show webdrbd    ## 查看我们定义的Webdrbd资源

primitive WebDRBD ocf:heartbeat:drbd \
params drbd_resource=”web” \
op monitor interval=”50s” role=”Master” timeout=”30s” \
op monitor interval=”60s” role=”Slave” timeout=”30s”

crm(live)configure# show MS_Webdrbd  ## 查看定义的clone资源

ms MS_WebDRBD WebDRBD \
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

## 查看当前集群运行状态:

crm status

============
Last updated: Fri Jun 17 06:24:03 2011
Stack: openais
Current DC: node2.weiyan.org – partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ node2.weiyan.org node1.weiyan.org ]

 Master/Slave Set: MS_Webdrbd
Masters: [ node2.weiyan.org ]
 Slaves: [ node1.weiyan.org ]

由上面的信息可以看出此时的drbd服务的Primary节点为node2.a.org,Secondary节点为node1.a.org。当然,也可以在node2上使用如下命令验正当前主机是否已经成为web资源的Primary节点:

  1. drbdadm role web 
  2.     Primary/Secondary  ## 发现已经是主节点

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

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

此外,此自动挂载的集群资源需要运行于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 WebFS_on_MS_webdrbd inf: WebFS MS_Webdrbd:Master
crm(live)configure# order WebFS_after_MS_Webdrbd inf: MS_Webdrbd:promote WebFS:start
crm(live)configure# verify
crm(live)configure# commit

## 查看集群中资源的运行状态:

crm status

============
Last updated: Fri Jun 17 06:26:03 2011
Stack: openais
Current DC: node2.weiyan.org – partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ node2.weiyan.org node1.weiyan.org ]

 Master/Slave Set: MS_Webdrbd
 Masters: [ node2.weiyan.org ]
 Slaves: [ node1.weiyan.org ]

 WebFS (ocf::heartbeat:Filesystem): Started node2.weiyan.o


由上面的信息可以发现,此时WebFS运行的节点和drbd服务的Primary节点均为node2.a.org;我们在node2上复制一些文件至/www目录(挂载点),而后在故障故障转移后查看node1的/www目录下是否存在这些文件。

  1. cp /etc/rc./rc.sysinit /www 

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

以下命令在Node2上执行:

crm node standby   ##我们先让node2节点待命
crm status         ##查看状态

============
Last updated: Fri Jun 17 06:27:03 2011
Stack: openais
Current DC: node2.weiyan.org – partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Node node2.weiyan.org: standby
Online: [ node1.weiyan.org ]

 Master/Slave Set: MS_Webdrbd
 Masters: [ node1.weiyan.org ]
 Stopped: [ webdrbd:0 ]

 WebFS (ocf::heartbeat:Filesystem): Started node1.weiyan.org

由上面的信息可以推断出,node2已经转入standby模式,其drbd服务已经停止,但故障转移已经完成,所有资源已经正常转移至node1。

在node1可以看到在node2作为primary节点时产生的保存至/www目录中的数据,在node1上均存在一份拷贝。

让node2重新上线:

crm node online    ## 让node2上线
crm status    ## 查看状态,发现node2重新上线并成为主drbd

============
Last updated: Fri Jun 17 06:30:05 2011
Stack: openais
Current DC: node2.weiyan.org – partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ node2.weiyan.org node1.weiyan.org ]

 Master/Slave Set: MS_Webdrbd
 Masters: [ node1.weiyan.org ]
 Slaves: [ node2.weiyan.org ]
 WebFS (ocf::heartbeat:Filesystem): Started node1.weiyan.org

返回正文

您的留言是我最大的支持!