drbd+mysql+Corosync来实现mysql的高可用性

 实验前提:
1)本配置共有两个测试节点,分别ha1.xsl.com和ha2.xsl.com,相的IP地址分别为192.168.108.199和192.168.108.201;
2)ha1.xsl.com和ha2.xsl.com两个节点上各提供了一个大小相同的分区作为drbd设备;我们在两个节点上的分区均为/dev/sda6,大小为2G;
3)系统为rhel5.8,x86平台;

 

1、准备工作

两个节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:
192.168.108.199 ha1.xsl.com
192.168.108.201 ha2.xsl.com

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

ha1.xsl.com:
# sed -i ‘s@\(HOSTNAME=\).*@\1ha1.xsl.com@g‘
# hostname ha1.xsl.com

ha2.xsl.com:
# sed -i ‘s@\(HOSTNAME=\).*@\1ha2.xsl.com@g‘
# hostname ha2.xsl.com

 

2、安装软件包

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

目前在用的drbd版本主要有8.0、8.2和8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。各版本的功能和配置等略有差异;我们实验所用的平台为x86且系统为rhel5.8,因此需要同时安装内核模块和管理工具。我们这里选用最新的8.3的版本(drbd83-8.3.8-1.el5.centos.i386.rpm和kmod-drbd83-8.3.8-1.el5.centos.i686.rpm),下载地址为:http://mirrors.sohu.com/centos/5/extras/i386/RPMS/

实际使用中,您需要根据自己的系统平台等下载符合您需要的软件包版本,这里不提供各版本的下载地址。

下载完成后直接安装即可:
# yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

 

一、配置drbd

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的默认中进行继承而无须定义。

 

下面的操作在ha1.xsl.com上完成。

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

 

 

2)配置/etc/drbd.d/global-common.conf
global {
        usage-count no;  #DRBD用于统计应用各个版本的信息。当新的版本的drbd被安装就会和http server进行联系。当然也可以禁用该选项,默认情况下是启用该选项的。
        # 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 1000M;
        }
}

 

 

3、定义一个资源/etc/drbd.d/web.res,内容如下:
resource web {
  on ha1.xsl.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   192.168.108.199:7789;
    meta-disk internal;
  }
  on ha2.xsl.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   192.168.108.201:7789;
    meta-disk internal;
  }
}

以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
# scp  /etc/drbd.*  ha2.xsl.com:/etc

 

 

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

1)初始化资源,在ha1.xsl.com和ha2.xsl.com上分别执行:
# drbdadm create-md web

 

2)启动服务,在ha1.xsl.com和ha2.xsl.com上分别执行:
/etc/init.d/drbd start

 

3)查看启动状态:
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 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:505964

也可以使用drbd-overview命令来查看:
# drbd-overview
  0:web  Connected Secondary/Secondary Inconsistent/Inconsistent C r----

从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
# drbdsetup /dev/drbd0 primary –o

  注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
     # drbdadm -- --overwrite-data-of-peer primary web

而后再次查看状态,可以发现数据同步过程已经开始:
# drbd-overview
  0:web  SyncSource Primary/Secondary UpToDate/Inconsistent C r----
    [============>.......] sync‘ed: 66.2% (172140/505964)K delay_probe: 35
   
等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:
# drbd-overview
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r----

 

 

5、创建文件系统

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
# mke2fs -j -L DRBD /dev/drbd0
# mkdir /mnt/drbd
# mount /dev/drbd0 /mnt/drbd

 

 

6、切换Primary和Secondary节点

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

节点ha1.xsl.com上的设置:
# cp -r /etc/drbd.* /mnt/drbd 
# umount /mnt/drbd
# drbdadm secondary web    将资源所在的设备设置为从节点

 

再次查看节点状态,发现此时两个节点都同时处于secondary状态:
# drbd-overview
  0:web  Connected Secondary/Secondary UpToDate/UpToDate C r----

节点ha2.xsl.com上的设置:
# drbdadm primary web     将资源所在的设备设置为主节点
# drbd-overview
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r----
# mkdir /mnt/drbd
# mount /dev/drbd0 /mnt/drbd

 

使用下面的命令查看在此前在主节点上复制至此设备的文件是否存在:
# ls /mnt/drbd


由于在这种模式下,主节点和从节点相互转化需要手动进行,而且资源也需要手动进行切换,因此,一旦其中的一个节点发生故障就不能保证服务的连续性了。因此,为了保证资源和节点可以在发生故障时可以自动进行切换,我们可以把drbd作为高可用集群的RA,整体配置如下:
首先drbd作为高可用集群的RA,确保该资源不能开启启动,因此,需要在两个节点上分别执行如下命令:
#chkconfig  drbd  off

还需要在主节点上卸载文件系统和停止drbd服务,需要执行如下命令:
#umount /mnt/drbd
#service  drbd  stop

 

 

二、安装配置mysql
编译安裝mysql-5.5.28
编译安裝mysql:
#tar  xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local
#cd /usr/local
#ln -sv mysql-5.5.28-linux2.6-i686/ mysql
 
#cd   mysql
#chown -R root:mysql  .
 
初始化mysql:
 
#scripts/mysql_install_db --user=mysql --datadir=/mnt/drbd  只需要在节点ha1.xsl.com上面进行,在节点ha2.xsl.com上面不需要进行初始化
 
#cp support-files/my-large.cnf  /etc/my.cnf   #根据服务器的内存大小选择相应的配置文件
vim /etc/my.cnf 
thread_concurrency = 2   #根据自己的cpu核数修改相应的值
datadir = /mnt/drbd    #指定数据存储的位置
 
添加服务到/etc/init.d/目录下:
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld  
 
关闭开启自动启动功能:
#chkconfig  mysqld  off

启动mysql服务:
#service mysqld start
 

 

三、配置corosync
在这里我们使用corosync+pacemaker来实现高可用集群
安装corosync和pacemaker,首先下载所需要如下软件包至本地某专用目录(这里为/root/cluster):
cluster-glue
cluster-glue-libs
heartbeat
resource-agents
corosync
heartbeat-libs
pacemaker
corosynclib
libesmtp
pacemaker-libs

下载地址:http://clusterlabs.org/rpm/。请根据硬件平台及操作系统类型选择对应的软件包;这里建议每个软件包都使用目前最新的版本。
  32bits rpm包下载地址:   http://clusterlabs.org/rpm/epel-5/i386/
  64bits rpm包下载地址:   http://clusterlabs.org/rpm/epel-5/x86_64/

 

使用如下命令安装:
# yum -y --nogpgcheck localinstall *.rpm

配置corosync,(以下命令在ha1.xsl.com上执行)

# cd /etc/corosync
# cp corosync.conf.example corosync.conf

接着编辑corosync的配置文件,且配置如下:
#vim  corosync.conf
compatibility: whitetank

totem {
 version: 2
 secauth: on
 threads: 0
 interface {
  ringnumber: 0
  bindnetaddr: 192.168.108.0
  mcastaddr: 225.100.1.1
  mcastport: 5405
 }
}

logging {
 fileline: off
 to_stderr: no
 to_logfile: yes
 to_syslog: no
 logfile: /var/log/cluster/corosync.log
 debug: off
 timestamp: on
 logger_subsys {
  subsys: AMF
  debug: off
 }
}

amf {
 mode: disabled
}
service {
 ver:0
 name:pacemaker
}

aisexec {
 user:root
 group:root
}

并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址,我们这里的两个节点在192.168.108.0网络,因此这里将其设定为192.168.108.0;如下
bindnetaddr: 192.168.108.0

生成节点间通信时用到的认证密钥文件:
# corosync-keygen

将corosync和authkey复制至ha2.xsl.com:
# scp -p corosync authkey  ha2.xsl.com:/etc/corosync/

 

分别为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh ha2.xsl.com  ‘mkdir /var/log/cluster‘

尝试启动,(以下命令在ha1.xsl.com上执行):

# /etc/init.d/corosync start


查看corosync引擎是否正常启动:
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
Jun 14 19:02:08 ha1.xsl.com corosync[5103]:   [MAIN  ] Corosync Cluster Engine (‘1.2.7‘): started and ready to provide service.
Jun 14 19:02:08 ha1.xsl.com corosync[5103]:   [MAIN  ] Successfully read main configuration file ‘/etc/corosync/corosync.conf‘.
Jun 14 19:02:08 ha1.xsl.com corosync[5103]:   [MAIN  ] Corosync Cluster Engine exiting with status 8 at main.c:1397.
Jun 14 19:03:49 ha1.xsl.com corosync[5120]:   [MAIN  ] Corosync Cluster Engine (‘1.2.7‘): started and ready to provide service.
Jun 14 19:03:49 ha1.xsl.com corosync[5120]:   [MAIN  ] Successfully read main configuration file ‘/etc/corosync/corosync.conf‘.

 

查看初始化成员节点通知是否正常发出:
# grep  TOTEM  /var/log/cluster/corosync.log
Jun 14 19:03:49 ha1.xsl.com corosync[5120]:   [TOTEM ] Initializing transport (UDP/IP).
Jun 14 19:03:49 ha1.xsl.com corosync[5120]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [TOTEM ] The network interface [192.168.108.199] is now up.
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [TOTEM ] A processor joined or left the membership and a new membership was formed.

 

检查启动过程中是否有错误产生:
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources

 

查看pacemaker是否正常启动:
# grep pcmk_startup /var/log/messages
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [pcmk  ] info: pcmk_startup: CRM: Initialized
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [pcmk  ] Logging: Initialized pcmk_startup
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [pcmk  ] info: pcmk_startup: Service: 9
Jun 14 19:03:50 ha1.xsl.com corosync[5120]:   [pcmk  ] info: pcmk_startup: Local hostname: ha1.xsl.com

 

如果上面命令执行均没有问题,接着可以执行如下命令启动ha2.xsl.com上的corosync
# ssh ha2.xsl.com -- /etc/init.d/corosync start

注意:启动ha2.xsl.com需要在ha1.xsl.com上使用如上命令进行,不要在ha2.xsl.com节点上直接启动;


使用如下命令查看集群节点的启动状态:
# crm status
============
Last updated: Tue Jun 14 19:07:06 2011
Stack: openais
Current DC: ha1.xsl.com - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
0 Resources configured.
============

Online: [ ha1.xsl.com ha2.xsl.com ]

从上面的信息可以看出两个节点都已经正常启动,并且集群已经处于正常工作状态。

执行ps auxf命令可以查看corosync启动的各相关进程。
root      4665  0.4  0.8  86736  4244 ?        Ssl  17:00   0:04 corosync
root      4673  0.0  0.4  11720  2260 ?        S    17:00   0:00  \_ /usr/lib/heartbeat/stonithd
101       4674  0.0  0.7  12628  4100 ?        S    17:00   0:00  \_ /usr/lib/heartbeat/cib
root      4675  0.0  0.3   6392  1852 ?        S    17:00   0:00  \_ /usr/lib/heartbeat/lrmd
101       4676  0.0  0.4  12056  2528 ?        S    17:00   0:00  \_ /usr/lib/heartbeat/attrd
101       4677  0.0  0.5   8692  2784 ?        S    17:00   0:00  \_ /usr/lib/heartbeat/pengine
101       4678  0.0  0.5  12136  3012 ?        S    17:00   0:00  \_ /usr/lib/heartbeat/crmd

 

配置集群的工作属性,禁用stonith

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

使用如下命令查看当前的配置信息:
# crm configure show
node ha1.xsl.com
node ha2.xsl.com
property $id="cib-bootstrap-options" \
  dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \
  cluster-infrastructure="openais" \
  expected-quorum-votes="2" \
  stonith-enabled="false
 
从中可以看出stonith已经被禁用。
上面的crm,crm_verify命令是1.0后的版本的pacemaker提供的基于命令行的集群管理工具;可以在集群中的任何一个节点上执行。

为集群添加集群资源
在这里我们将drbd配置成高可用集群的资源

执行如下命令,查看drbd可以被哪些提供商支持:
#crm  ra  providers  drbd
heartbeat linbit
drbd是由linbit公司研发的,heartbeat也可以支持。

首先将drbd配置成为主资源
由于drbd是主从类资源,而所有的主从类资源在定义前,必须先定义主资源
#crm  configure
crm(live)configure# primitive mysqldrbd ocf:linbit:drbd params drbd_resource=‘web‘ op start timeout=240 op stop timeout=100

 


将drbd配置成为主从资源
crm(live)configure# master ms_mysqldrbd   mysqldrbd meta master-max=1  master-node-max=1  clone-max=2  clone-node-max=1 notify=‘true‘=‘true‘1 notify=‘true‘
其中这些参数意思如下:
master是用来定义主从资源的,后面的ms_mysqldrbd为主从资源的名称,mysqldrbd为主资源的名称
meta用来定义主从类资源的属性
master-max   定义最多有几个主资源
master-node-max  定义主节点上最多运行多少个资源

执行如下命令,发现drbd已经被配置成为了一个主从类资源
crm(live)configure# end
crm(live)# status
============
Last updated: Sat Feb 21 16:38:46 2015
Stack: openais
Current DC: ha1.xsl.com - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ ha1.xsl.com ha2.xsl.com ]

 Master/Slave Set: ms_mysqldrbd
     Masters: [ ha1.xsl.com ]
     Slaves: [ ha2.xsl.com ]
 
 
定义文件系统资源
crm(live)configure
crm(live)configure# primitive FSystem  ocf:heartbeat:Filesystem  params device=‘/dev/drbd0‘  directory==‘/mnt/drbd‘ fstype=ext3 op start timeout=60  op stop timeout=60
此外自动挂载的集群资源需要运行于drbd服务的Master节点上,并且只能在drbd服务将某节点设置为Primary以后方可启动。因此,还需要为这两个资源建立排列约束和顺序约束。需要执行如下命令:
crm(live)configure# colocation FSystem_with_ms_mysqldrbd  inf: FSystem ms_mysqldrbd:Master 
crm(live)configure# order FSystem_after_ms_mysqldrbd inf: ms_mysqldrbd:promote FSystem:start

定义mysql资源
crm(live)configure# primitive MYsql  lsb:mysqld
将mysql资源和文件系统资源绑定在一起,并且定义只有当文件系统挂载后才可以启动mysql服务,这可以通过排列约束和顺序约束来实现,需要执行如下命令:
crm(live)configure# colocation MYsql_with_FSystem inf: MYsql FSystem
crm(live)configure# order  MYsql_after_FSystem mandatory: FSystem MYsql
 
定义ip资源
crm(live)configure# primitive Mysqlip   ocf:heartbeat:IPaddr  params ip=192.168.108.100 nic=eth0 cidr_netmask=24 op start timeout=90 op stop timeout=100
将ip资源和mysqld服务绑定在一起,需要通过排列约束来实现:
crm(live)configure# colocation Mysqlip_with_MYsql inf: Mysqlip MYsql 


通过上述步骤,Corosync+drbd+mysql结合工作就可以实现mysql的高可用集群解决方案了。

 

 

四、测试:
由于这是一个高可用集群解决方案,因此,当其中的一台节点发生故障时,其资源将会自动转移到另一个节点上。从而保证服务的连续性。这样才可以说明是一个成功的解决方案。
在这里我们可以进行模拟测试:
1、在节点ha1.xsl.com上的执行命令:
[root@ha1 ~]# crm
crm(live)# status
============
Last updated: Sun Feb 22 11:25:17 2015
Stack: openais
Current DC: ha1.xsl.com - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Online: [ ha1.xsl.com ha2.xsl.com ]

 Master/Slave Set: ms_mysqldrbd
     Masters: [ ha1.xsl.com ]
     Slaves: [ ha2.xsl.com ]
 FSystem (ocf::heartbeat:Filesystem): Started ha1.xsl.com
 MYsql (lsb:mysqld): Started ha1.xsl.com
 Mysqlip (ocf::heartbeat:IPaddr): Started ha1.xsl.com
上述输出结果表明。节点ha1.xsl.com是masters节点,其资源都在ha1.xsl.com上。

在节点ha1上,创建一个数据库为worldnice
mysql> create database worldnice;
Query OK, 1 row affected (0.01 sec)

查看mysql的数据目录下是否有这个数据库
[root@ha1 ~]# ls /hello/
baidu            ha2.xsl.com.err  mysql             mysql-bin.000006  mysql-bin.000012  mysql-bin.000018    worldnice
corotest         hel              mysql-bin.000001  mysql-bin.000007  mysql-bin.000013  mysql-bin.000019    yousha.txt
drbd.conf        ibdata1          mysql-bin.000002  mysql-bin.000008  mysql-bin.000014  mysql-bin.000020
drbd.d           ib_logfile0      mysql-bin.000003  mysql-bin.000009  mysql-bin.000015  mysql-bin.index
ha1.xsl.com.err  ib_logfile1      mysql-bin.000004  mysql-bin.000010  mysql-bin.000016  performance_schema
ha1.xsl.com.pid  lost+found       mysql-bin.000005  mysql-bin.000011  mysql-bin.000017  test
这里可以看出mysql的数据目录下有worldhello这个数据库

 

2、将节点ha1.xsl.com切换成slaves节点
crm(live)# node
crm(live)node# standby

 

3、查看节点ha2.xsl.com的集群状态
[root@ha2 ~]# crm status
============
Last updated: Sun Feb 22 11:32:06 2015
Stack: openais
Current DC: ha1.xsl.com - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Node ha1.xsl.com: standby
Online: [ ha2.xsl.com ]

 Master/Slave Set: ms_mysqldrbd
     Masters: [ ha2.xsl.com ]
     Stopped: [ mysqldrbd:0 ]
 FSystem (ocf::heartbeat:Filesystem): Started ha2.xsl.com
 MYsql (lsb:mysqld): Started ha2.xsl.com
 Mysqlip (ocf::heartbeat:IPaddr): Started ha2.xsl.com
 
上述结果表明,此时节点ha2.xsl.com为masters节点,且所有资源都在节点ha2上。

4、查看节点ha2上的mysql的数据目录下是否有worldhello数据库,并且还要保证节点ha2上的数据目录下的文件和ha1上的数据目录下的文件要一样。
ha2上的数据目录也是/hello
[root@ha2 ~]# ls /hello/
baidu            ha2.xsl.com.pid  mysql             mysql-bin.000006  mysql-bin.000012  mysql-bin.000018    test
corotest         hel              mysql-bin.000001  mysql-bin.000007  mysql-bin.000013  mysql-bin.000019    worldnice
drbd.conf        ibdata1          mysql-bin.000002  mysql-bin.000008  mysql-bin.000014  mysql-bin.000020    yousha.txt
drbd.d           ib_logfile0      mysql-bin.000003  mysql-bin.000009  mysql-bin.000015  mysql-bin.000021
ha1.xsl.com.err  ib_logfile1      mysql-bin.000004  mysql-bin.000010  mysql-bin.000016  mysql-bin.index
ha2.xsl.com.err  lost+found       mysql-bin.000005  mysql-bin.000011  mysql-bin.000017  performance_schema
 
上述结果表明含有worldnice这个数据库,对比一下可以发现上面的文件和节点ha1上的数据目录下的文件是一致的。这说明高可用集群搭建成功了。

实验过程中遇到的错误:
错误1:在执行/etc/init.d/drbd   start后出现提示Starting DRBD resources: Can not load the drbd module.
解决办法:就可能是当前系统不支持drbd这个模块。于是我就将/boot/grub/grub.conf中的内核启动顺序换了一下。
之前的/boot/grub/grub.conf文件中的配置为:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda1
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu

title CentOS (2.6.18-402.el5.centos.plus)
 root (hd0,0)
 kernel /vmlinuz-2.6.18-402.el5.centos.plus ro root=LABEL=/ rhgb quiet
 initrd /initrd-2.6.18-402.el5.centos.plus.img
title CentOS (2.6.18-402.el5.centos.plusxen)
 root (hd0,0)
 kernel /xen.gz-2.6.18-402.el5.centos.plus
 module /vmlinuz-2.6.18-402.el5.centos.plusxen ro root=LABEL=/ rhgb quiet
 module /initrd-2.6.18-402.el5.centos.plusxen.img
title Red Hat Enterprise Linux Server (2.6.18-308.el5xen)
 root (hd0,0)
 kernel /xen.gz-2.6.18-308.el5
 module /vmlinuz-2.6.18-308.el5xen ro root=LABEL=/ rhgb quiet
 module /initrd-2.6.18-308.el5xen.img

 

改变之后的配置文件为:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda1
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-308.el5xen)
 root (hd0,0)
 kernel /xen.gz-2.6.18-308.el5
 module /vmlinuz-2.6.18-308.el5xen ro root=LABEL=/ rhgb quiet
 module /initrd-2.6.18-308.el5xen.img
title CentOS (2.6.18-402.el5.centos.plus)
 root (hd0,0)
 kernel /vmlinuz-2.6.18-402.el5.centos.plus ro root=LABEL=/ rhgb quiet
 initrd /initrd-2.6.18-402.el5.centos.plus.img
title CentOS (2.6.18-402.el5.centos.plusxen)
 root (hd0,0)
 kernel /xen.gz-2.6.18-402.el5.centos.plus
 module /vmlinuz-2.6.18-402.el5.centos.plusxen ro root=LABEL=/ rhgb quiet
 module /initrd-2.6.18-402.el5.centos.plusxen.img

在重新启动后,重新执行/etc/init.d/drbd   start
在执行
[root@ha1 ~]# drbd-overview 
0:web  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
可以发现drbd已经启动了。
 

 
错误2:在做实验过程中出现了集群脑裂状况,两个集群节点之间无法识别对方,且两个节点都处于StandAlone模式,这可以通过查看两个节点上的日志信息和集群状态来说明:
节点ha1.xsl.com上的日志信息:
[root@ha1 ~]# tail /var/log/messages
Feb 22 10:25:08 ha1 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0
Feb 22 10:25:08 ha1 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0 exit code 0 (0x0)
Feb 22 10:25:08 ha1 kernel: block drbd0: conn( WFReportParams -> Disconnecting )
Feb 22 10:25:08 ha1 kernel: block drbd0: error receiving ReportState, l: 4!
Feb 22 10:25:08 ha1 kernel: block drbd0: asender terminated
Feb 22 10:25:08 ha1 kernel: block drbd0: Terminating drbd0_asender
Feb 22 10:25:08 ha1 kernel: block drbd0: Connection closed
Feb 22 10:25:08 ha1 kernel: block drbd0: conn( Disconnecting -> StandAlone )
Feb 22 10:25:08 ha1 kernel: block drbd0: receiver terminated
Feb 22 10:25:08 ha1 kernel: block drbd0: Terminating drbd0_receiver

 

节点ha1.xsl.com上的集群状态:
[root@ha1 ~]# drbd-overview
  0:web  StandAlone Primary/Unknown UpToDate/DUnknown r----- /hello ext3 1.9G 66M 1.7G 4%

 

节点ha2.xsl.com上的日志信息: 
[root@ha2 ~]# tail /var/log/messages
Feb 22 10:23:43 ha2 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0 exit code 0 (0x0)
Feb 22 10:23:43 ha2 kernel: block drbd0: conn( WFReportParams -> Disconnecting )
Feb 22 10:23:43 ha2 kernel: block drbd0: error receiving ReportState, l: 4!
Feb 22 10:23:43 ha2 kernel: block drbd0: meta connection shut down by peer.
Feb 22 10:23:43 ha2 kernel: block drbd0: asender terminated
Feb 22 10:23:43 ha2 kernel: block drbd0: Terminating drbd0_asender
Feb 22 10:23:43 ha2 kernel: block drbd0: Connection closed
Feb 22 10:23:43 ha2 kernel: block drbd0: conn( Disconnecting -> StandAlone )
Feb 22 10:23:43 ha2 kernel: block drbd0: receiver terminated
Feb 22 10:23:43 ha2 kernel: block drbd0: Terminating drbd0_receiver 

 

节点ha2.xsl.com上的集群状态:
[root@ha2 ~]# drbd-overview
  0:web  StandAlone Secondary/Unknown UpToDate/DUnknown r-----

解决办法:
1、在节点ha1.xsl.com上手动设置为primary节点并挂载资源进行测试 
[root@ha1 ~]# drbdadm primary web 
[root@ha1 ~]# mount /dev/drbd0 /mnt/drbd/
查看/mnt/drbd目录下是否有mysql的相关数据:
[root@ha1 ~]# ls /mnt/drbd/
corotest         hel          mysql             mysql-bin.000005  mysql-bin.000010  mysql-bin.000015    yousha.txt
drbd.conf        ibdata1      mysql-bin.000001  mysql-bin.000006  mysql-bin.000011  mysql-bin.000016
drbd.d           ib_logfile0  mysql-bin.000002  mysql-bin.000007  mysql-bin.000012  mysql-bin.index
ha1.xsl.com.err  ib_logfile1  mysql-bin.000003  mysql-bin.000008  mysql-bin.000013  performance_schema
ha1.xsl.com.pid  lost+found   mysql-bin.000004  mysql-bin.000009  mysql-bin.000014  test
这个目录下有数据表示挂载成功

 

2、在节点ha2.xsl.com上手动设置为secondary节点:
[root@ha2 ~]# drbdadm secondary web
设置为secondary之后,还需要丢弃该节点上的资源数据,这个操作需要执行如下命令:
[root@ha2 ~]# drbdadm -- --discard-my-data connect web

 

3、在节点ha1.xsl.com上手动连接资源,需要执行如下命令:
[root@ha1 ~]# drbdadm connect web

 

4、在两个节点上分别查看此时的集群状态
[root@ha1 ~]# drbd-overview
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt/drbd ext3 1.9G 66M 1.7G 4%
 
[root@ha2 ~]# drbd-overview
  0:web  Connected Secondary/Primary UpToDate/UpToDate C r-----
上面显示,两个节点彼此都可以识别对方了,集群状态也恢复正常了。

 

5、两个节点恢复正常了,别忘记了将刚刚测试过程中挂载的文件系统给卸载掉。否则又会出现错误的。
[root@ha1 ~]# umount /mnt/drbd/

因为在做Corosync+drbd+mysql这个实验过程中,之前做过了由Corosync来实现高可用集群的实验,且是在Corosync实验的基础上进行修改完成的,所有出现脑裂这种情况有可能是受到之前实验的影响导致的。

 

 

 

 

 

本文出自 “linux学习之路” 博客,请务必保留此出处http://xslwahaha.blog.51cto.com/4738972/1620649

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。