通过corosync/pacemaker和drbd实现集群的高可用性和共享存储

 

说明:
1两个节点node1.a.rog和node2.a.org 相对应的 ip分别是
192.168.0.21   192.168.0.22 
     2两节点的名字必须与使用’ uname –n’显示的主机名 一致
     3保证两节点可以通过ssl以root身份 互相访问
     4 集群的服务为apache的http
     5 提供web服务的地址为192.168.0.100
     6 两个接点上分别创建2G 的分区作为drbd的共享设备
 前两篇博文已经介绍了corosync和drbd的配置过程,但是出于对工作的严谨 态度,这次我还做出详细的配置步骤
   
 
一: corosync 的配置:
1               配置ip ##########分别在两节点上进行
#Vim /etc/sysconfig/network-scripts/ifcfg-eth0
2 所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:#############分别在两节点上进行
192.168.0.5                node1.a.org node1
192.168.0.6      node2.a.org node2
配置主机名,是其域使用“ uname –n” 显示的一致
#Vim /etc/ sysconfig/network
退出然后在shell下为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:
#Hostname node1.a.org
3         设定两节点间可以基于密钥进行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
4         下载安装软件
安装 所需的软件包有:
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
下载 完成后 用yum 安装 ,当然安装前要设置好yum源
 #cd /root/cluster
 #yum -y --nogpgcheck localinstall *.rpm
5         配置corosync 以下命令在node1.a.rog上 执行
 #cd /etc/corosync
 #cp corosync.conf.example corosync.conf
接着编辑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
}
6         生成接点间通信时用到的认证密钥文件
  #corosync-keygen
这个命令执行后就会在/etc/corosync下生成authkey文件
将corosyn.conf和authkey复制至node2:
  #scp -p corosync authkey node2:/etc/corosync/   -p是保留文件的原有属性
分别为两个节点创建corosync生成的日志文件所在的目录
  #mkdir /var/log/cluster
  #ssh node2 'mkdir /var/log/cluster' ###########在node1上使用ssl为node2创建目录
7         尝试启动corosync   
    # /etc/init.d/corosync start      先在node1上执行 并以以下命令验证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
 
如果说以上命令没有出现任何问题的话,证明我们corosync的配置过程没有问题,下面就在node1上启动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设备,所以这个默认配置目前上不可用,我们可以通过一个检查语法或者逻辑错误的命令来 验证:
     # 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
出现如上信息说明有错误,因此我们就要禁用stonith来避免这种错误
       # 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.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" cluster-infrastructure="openais"
   expected-quorum-votes="2"
       stonith-enabled="false
显示的内容说明,stnoith已经被禁用
 
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) 定义关联以及约束
1.       Crm configure colocation Webserver-with-WebIP INFINITY: Webserver WebIP
2.       Crm configure order Webserver-after-WebIP mandatory: Webserver
3.       Crm configure location prefer-node1 Webserver
 
3)新建资源 WebSite
# crm configure primitive Webserver lsb:httpd
# crm configure commit #######提交生效
# crm configure show ############    显示资源的信息状态
# crm status    ##########可以看出新建的资源在node2上启动,这是集群尽量负载均衡资源的
     那么我们怎么把这两个资源在同一接点上运行呢?
       有两种方法:1把这两种资源配置组2将两个资源定义成约束(排列,次序)
3) 下面我们将这两种资源定义成组
#crm configure group Web WebIP Webserver #############其中Web是组名
# crm configure commit
# crm configure show
这样就将WebIP Webserver 添加到组Web中了。使他们在同一个接点上运行了。
这时,我们再查看下资源的运行 状态
# crm status
可以看出这两个起源都在node1上运行了
 
 
 
drbd 的配置
1 下载配安装置需要的软件包(安装前腰确保配置好了yum源)
 drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
      下载完成后我们直接用yum安装(注意我们要在两接点上都进行安装)
       [root@node1 ~]# yum localinstall -y --nogpgcheck drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
2 配置drbd (下面我们在node1上配置为例)
1)复制样例配置文件为即将使用的配置文件:
# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc
配置之前我们先看一下drbd的主配置文件,显示的内容如下:
     include "drbd.d/global_common.conf";
include "drbd.d/*.res";
这就说明,我们需要把主配置文件分成几个文件来进行配置这几个配置文件分别是/etc/drbd.d/global-common.conf 和/etc/drbd.d/web.res
2)配置/etc/drbd.d/global-common.conf ,添加内容并修改如下:
   global {
        usage-count no;###########是否打开count记录
        # 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;######### 发生io-error时拆掉磁盘
                                  fencing resource-only;###########仅在资源上做fence
        }
 
        net {
                                  cram-hmac-alg "sha1";##########使用sha1算法加密
                                  shared-secret "mydrbdlab";##########加密的密码
        }
 
        syncer {
                rate 100M;############双方同步的时候使用的带宽
        }
}
 
3)定义一个资源文件/etc/drbd.d/web.res,内容如下:
   resource web {
      on node1.a.org {
         device /dev/drbd0;   ##########创建完成后再本地表示的设备
         disk /dev/sda5; #########使用的设备
         address 192.168.0.21:7789; #########nodeIP 和监听的端口
         meta-disk internal; ######在本地磁盘分区上存储元数据
                      }
      on node2.a.org {
         device /dev/drbd0;
         disk /dev/sda5;
         address 192.168.0.22:7789;
         meta-disk internal;
                      }
}
   然后我们需要把这些配置文件cp到node2上去
[root@node1 ~]# scp -r /dec/drbd.conf /etc/drbd.d node2:/etc
 
3 在两个各节点上初始化已经定义的资源并启动服务
   1)初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md web
 Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
显示这些信息表示初始化完成
   2) 启动服务,在Node1和Node2上分别执行:
#/etc/init.d/drbd start
         3) 查看启动状态
             root@node1 ~]# cat /proc/drbd 也可以像下面那样查看
             [root@node1 ~]# drbd-overview
                 0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----
             由上边的显示结果可以看出,这是的接点架构不是主从的,两个节点均处于Secondary状态,于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:我们把node1设置为Primary
              [root@node1 ~]# drbdsetup /dev/drbd0 primary –o
              再次查看可以发现数据同步开始
              [root@node1 ~]# drbd-overview
               0:web SyncSource Primary/Secondary UpToDate/Inconsistent C r----
                 [=>..................] sync'ed: 14.1% (4108/4776)M delay_probe: 58
 
  待到数据同步完成后,再次查看状态,两节点已经有了主次
              [root@node1 ~]# drbd-overview
              0:web Connected Primary/Secondary UpToDate/UpToDate C r----
        4 创建文件系统 ,文件系统的穿将给只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
                [root@node1 ~]# mke2fs -t ext3 -L DRBD /dev/drbd0
                [root@node1 ~]# mkdir /web ###########创建目录用于挂载/dev/drbd0
                [root@node1 ~]# mount /dev/drbd0 /web ##############挂载/dev/drbd0
                然后cd到/web 下
                [root@node1 web]# ls
lost+found #############表明这急速和i一个新分区
[root@node1 web]# echo "hello,shrae" > indecx.html
然后分别在来那个node上使用命令”drbdadm role web”查看显示内容
      5   切换Primary和Secondary节点   
                对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
                [root@node1 ~]# umount /web ##########先卸载/web
                [root@node1 ~]# drbdadm secondary web #########设置为secondary节点
                [root@node1 ~]# drbd-overview
                 0:web Connected Secondary/Secondary UpToDate/UpToDate C r----
           然后在node2上
                [root@node2 ~]# mkdir /web   ########在node2上先创建/web
                [root@node2 ~]# drbdadm primary web #######node2设置为primary节点
[root@node2 ~]# drbd-overview
                 0:web Connected Primary/Secondary UpToDate/UpToDate C r----
                [root@node2 ~]# mount /dev/drbd0 /web
              
 [root@node2 web]# ls
index.html lost+found
[root@node2 web]# vim test.sh
[root@node2 ~]# umount /web
[root@node2 ~]# drbdadm secondary web
 
然后node1上启用为primary节点
[root@node1 ~]# drbdadm primary web
[root@node1 ~]# drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
[root@node1 ~]# mount /dev/drbd0 /web
[root@node1 web]# ls
index.html lost+found test.sh
这表明在node2上个创建的文件在node1上也能够看到,由此就简单实现了高可用的共享存储
      三:配置 corosync 是集群能争用drbd资源
        出于对于原作者的尊重,在此声明:这一部分的配置参考了
    作者马哥 http://blog.chinaunix.net的博文
1) 为了drbd
的集群服务能够定义成功,首先应该停止drbd服务并且使其不能开机自动 启动
/etc/init.d/drbd stop
Drbd-overview
0:web Unconfigured·····
Chekconfig drbd off
           2) 我们将drbd配置为集群资源
[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:linbit:drbd \
         params drbd_resource="web" \
         op monitor interval="15s"
 
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.a.org - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============
 
Online: [ node2.a.org node1.a.org ]
 
 Master/Slave Set: MS_Webdrbd
 Masters: [ node2.a.org ]
 Slaves: [ node1.a.org ]
 
由上面的信息可以看出此时的drbd服务的Primary节点为node2.a.org,Secondary节点为node1.a.org。当然,也可以在node2上使用如下命令验正当前主机是否已经成为web资源的Primary节点:
# drbdadm role web
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.a.org - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============
 
Online: [ node2.a.org node1.a.org ]
 
 Master/Slave Set: MS_Webdrbd
 Masters: [ node2.a.org ]
 Slaves: [ node1.a.org ]
 WebFS (ocf::heartbeat:Filesystem): Started node2.a.org
 
由上面的信息可以发现,此时WebFS运行的节点和drbd服务的Primary节点均为node2.a.org;我们在node2上复制一些文件至/www目录(挂载点),而后在故障故障转移后查看node1的/www目录下是否存在这些文件。    
# cp /etc/rc./rc.sysinit /www
4)下面我们模拟node2节点故障,看此些资源可否正确转移至node1。
  以下命令在Node2上执行:
# crm node standby
# crm status
============
Last updated: Fri Jun 17 06:27:03 2011
Stack: openais
Current DC: node2.a.org - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============
 
Node node2.a.org: standby
Online: [ node1.a.org ]
 
 Master/Slave Set: MS_Webdrbd
 Masters: [ node1.a.org ]
 Stopped: [ webdrbd:0 ]
 WebFS (ocf::heartbeat:Filesystem): Started node1.a.org
 由上面的信息可以推断出,node2已经转入standby模式,其drbd服务已经停止,但故障转移已经完成,所有资源已经正常转移至node1。
 
在node1可以看到在node2作为primary节点时产生的保存至/www目录中的数据,在node1上均存在一份拷贝。
 
让node2重新上线:
# crm node online
[root@node2 ~]# crm status
============
Last updated: Fri Jun 17 06:30:05 2011
Stack: openais
Current DC: node2.a.org - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
2 Resources configured.
============
 
Online: [ node2.a.org node1.a.org ]
 
 Master/Slave Set: MS_Webdrbd
 Masters: [ node1.a.org ]
 Slaves: [ node2.a.org ]
 WebFS (ocf::heartbeat:Filesystem): Started node1.a.org

你可能感兴趣的:(集群,职场,drbd,休闲,corosync)