基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

实验系统:CentOS 6.6_x86_64

实验前提:

1)提前准备好编译环境,防火墙和selinux都关闭;

2)本配置共有两个测试节点,分别coro1和coro2,对应的IP地址分别为192.168.19.55和192.168.19.98;

3)集群服务为nginx服务;

  4)提供web服务的地址为192.168.19.150,即VIP;

实验软件:corosync-0:1.4.7-1.el6 pacemaker-0:1.1.12-4.el6 crmsh-2.1-1.6 drbd-8.4.4 php-5.6.11 mariadb-10.0.20 tengine-2.1.0

软件下载

------------------------------------------分割线------------------------------------------

具体下载目录在 /2015年资料/7月/25日/基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群/

------------------------------------------分割线------------------------------------------

注意事项:单主机操作会有标注,除此之外的是两台主机都要完成的

实验拓扑:

 基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

一、准备工作

1.所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟“uname -n”命令的结果保持一致。因此,需要保证两个节点上的/etc/hosts文件均添加了下面的内容:

     基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

2.为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:

coro1上:

1 sed -i 's@\(HOSTNAME=\).*@\1coro1@g'  /etc/sysconfig/network
2 hostname coro1

coro2上:

1 sed -i 's@\(HOSTNAME=\).*@\1coro2@g'  /etc/sysconfig/network
2 hostname coro2

3.设定两个节点可以基于密钥进行ssh通信,并测试:

coro1上:

1 ssh-keygen -t rsa
2 ssh-copy-id -i ~/.ssh/id_rsa.pub root@coro2

coro2上:

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@coro1

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

4.两个节点时间必须同步:一般使用ntpdate进行操作,这里不再演示。

二、安装corosync和pacemaker并配置

1.安装epel源:

1 yum -y install epel*

2.安装corosync和pacemaker:

1 yum -y install corosync pacemaker

3.在coro1上编辑/etc/corosync.conf

 
1 cd /etc/corosync/
 2 cp corosync.conf.example corosync.conf
 3 vim corosync.conf
 4 ------------------------------------
 5 bindnetaddr: 192.168.19.0        //为你的网卡所在网络的网络地址
 6 mcastaddr: 239.255.19.1          //组播地址
 7 service {                       //添加此部分
 8   ver:  0
 9   name: pacemaker
10   # use_mgmtd: yes
11 }

4.在coro1上生成节点间通信时用到的认证密钥文件:

1 corosync-keygen

5.将corosync.conf和authkey复制至coro2上:

1 scp -p corosync.conf authkey coro2:/etc/corosync/

三、安装crmsh并启动corosync

1.安装crmsh,需要提前下好rpm包:

1 yum -y install crmsh-2.1-1.6.x86_64.rpm

2.启动corosync(在coro1上执行):

1 service corosync start

3.查看corosync引擎是否正常启动:

1 grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

4.查看初始化成员节点通知是否正常发出:

1 grep TOTEM /var/log/cluster/corosync.log

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

5.检查启动过程中是否有错误产生。下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务,此处可安全忽略:

1 grep ERROR: /var/log/cluster/corosync.log

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

6.查看pacemaker是否正常启动:

1 grep pcmk_startup /var/log/cluster/corosync.log

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

7.如果上面命令执行均没有问题,接着可以在coro1上执行如下命令启动coro2上的corosync:

1 ssh coro2 'service corosync start'

8.如果安装了crmsh,可使用如下命令查看集群节点的启动状态。从下面的信息可以看出两个节点都已经正常启动,并且集群已经处于正常工作状态:

1 crm status

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

四、编译安装drbd并配置

drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。

1.安装用户空间工具:

 
1 tar xf drbd-8.4.4.tar.gz 
2 cd drbd-8.4.4
3 ./configure --prefix=/usr/local/drbd --with-km
4 make KDIR=/usr/src/kernels/2.6.32-504.30.3.el6.x86_64      //换成自己的内核版本
5 make install
6 mkdir -pv /usr/local/drbd/var/run/drbd
7 cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
8 chkconfig --add drbd
9 chkconfig drbd off                            //一会作为corosync的资源,所以不要开机自动启动

2.安装drbd模块:

1 cd drbd
2 make clean
3 make KDIR=/usr/src/kernels/2.6.32-504.30.3.el6.x86_64      //换成自己的内核版本
4 cp drbd.ko /lib/modules/`uname -r`/kernel/lib
5 depmod

3.给主机分区,大小为5G。这里不再给出具体步骤,两台主机的/dev/sda7为一会要使用的分区:

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

4.配置drbd(在coro1上操作):

drbd的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d/目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。

    在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
    注意:由于本试验中drbd是编译安装的,因此默认配置文件所在路径为:/usr/local/drbd/etc
 
1 cd /usr/local/drbd/etc/drbd.d/
 2 vim global_common.conf
 3 --------------------------------------
 4 global {
 5         usage-count no;
 6         # minor-count dialog-refresh disable-ip-verification
 7 }
 8 
 9 common {
10         protocol C;
11 
12         handlers {
13                 # These are EXAMPLE handlers only.
14                 # They may have severe implications,
15                 # like hard resetting the node under certain circumstances.
16                 # Be careful when chosing your poison.
17 
18                 # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /p
19 roc/sysrq-trigger ; reboot -f";
20                 # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /p
21 roc/sysrq-trigger ; reboot -f";
22                 # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-
23 trigger ; halt -f";
24 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
25                 # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
26                 # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
27                 # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
28                 # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
29         }
30 
31         startup {
32                 # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
33         }
34 
35         options {
36                 # cpu-mask on-no-data-accessible
37         }
38 
39         disk {
40                 #on-io-error detach;
41                 # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
42                 # disk-drain md-flushes resync-rate resync-after al-extents
43                 # c-plan-ahead c-delay-target c-fill-target c-max-rate
44                 # c-min-rate disk-timeout
45         }
46         net {
47                 #cram-hmac-alg "sha1";
48                 #shared-secret "mydrbd";
49                 # protocol timeout max-epoch-size max-buffers unplug-watermark
50                 # connect-int ping-int sndbuf-size rcvbuf-size ko-count
51                 # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
52                 # after-sb-1pri after-sb-2pri always-asbp rr-conflict
53                 # ping-timeout data-integrity-alg tcp-cork on-congestion
54                 # congestion-fill congestion-extents csums-alg verify-alg
55                 # use-rle
56         }
57 }

5.定义一个资源,web是资源名,可以自己改:

 
1 vim /usr/local/drbd/etc/drbd.d/web.res
 2 --------------------------------------
 3 resource web {
 4   on coro1 {
 5     device    /dev/drbd0;
 6     disk      /dev/sda7;
 7     address   192.168.19.55:7789;
 8     meta-disk internal;
 9   }
10   on coro2 {
11     device    /dev/drbd0;
12     disk      /dev/sda7;
13     address   192.168.19.98:7789;
14     meta-disk internal;
15   }
16 }

6.以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至coro2节点:

1 scp /usr/local/drbd/etc/drbd.d/* coro2:/usr/local/drbd/etc/drbd.d/

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

1 drbdadm create-md web
2 service drbd start

8.查看启动状态,从下面的信息中可以看出此时两个节点均处于Secondary状态:

1 cat /proc/drbd

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

   9.我们接下来需要将其中一个节点设置为Primary,在要设置为Primary的节点上执行如下命令,这里在coro1上操作:

1 drbdadm primary --force web
2 cat /proc/drbd

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

而后再次查看状态,可以发现数据同步过程已经开始。等数据同步完成以后再次查看状态,可以发现主次位置显示是不一样的。斜线前面的代表当前主机,后面的代表对方主机。

在coro1上查看:

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

在coro2上查看:

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

10.创建文件系统并挂载:

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

1 mke2fs -t ext4 -L DRBD /dev/drbd0
2 mkdir /mydata                         //创建挂载点
3 mount /dev/drbd0 /mydata/
4 mkdir /mydata/www                     //创建网页目录
5 mkdir /mydata/data                   //创建数据库目录

11.切换Primary和Secondary节点:

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

在coro1上:

1 umount /mydata/
2 drbdadm secondary web                //变为secondary节点

在coro2上:

1 drbdadm primary web                   //变为primary节点
2 cat /proc/drbd
3 mkdir /mydata                         //创建挂载点
4 mount /dev/drbd0 /mydata/
5 ls /mydata/

可以看到,coro2已经成为了Primary,之前在coro1上创建的目录也能够访问到。测试完成后,再次将coro1变为Primary并挂载。

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

基于Corosync+Pacemaker+DRBD+LNMP实现Web服务器高可用集群

相关推荐