集群:DRBD+corosync+pacemaker实现mysql服务高可用

 

在许多企业的应用中,mysql高可用集群环境应用广泛,而mysql+corosync+pacemaker+DRBD是配置mysql服务器的一套成熟方案,此方案实现了mysql主节点写操作的高可用性,是一个非常优越并且廉价的解决方案。
本文主要介绍的就是这种集群环境平台的搭建:
 
一,DRBD的介绍及配置过程
二,mysql的安装
三,corosync+pacemaker的安装配置
四,集群服务及所需资源的定义配置
 
本文的实验平台为:
redhat enterprise 5.4+mysql+DRBD+corosync+pacemaker
 
注意:
1,两个节点的系统,硬件时间要保持一致
2,凡是要定义为集群资源的服务都不能让他们启动,也不能开机自动启动,因为他们要被pacemaker管理
3,服务drbd,corosync,pacemaker都要依赖主机名进行定义,请一定要确保主机名配置正确
4,本文所用软件包都可以到互联网下载到
 
如下为本文的实验拓扑:

 
 
 
一,DRBD的介绍及配置过程:
 DRBD:(distributed replication block device)即分布式复制块设备。它的工作原理是:在A主机上有对指定磁盘设备写请求时,数据发送给A主机的kernel,然后通过kernel中的一个模块,把相同的数据传送给B主机的kernel中一份,然后B主机再写入自己指定的磁盘设备,从而实现两主机数据的同步,也就实现了写操作高可用。
DRBD一般是一主一从,并且所有的读写操作,挂载只能在主节点服务器上进行,,但是主从DRBD服务器之间是可以进行调换的。
 
下面为DRBD的配置过程:
1、准备工作
 
node1和node2两个节点上各提供了一个大小相同的分区作为DRBD设备,我们这里两个节点上均为/dev/sda3,大小根据实际情况而定。
对磁盘分区:
# fdisk /dev/sda  (分号区后不要格式化)
让kernel识别新建的分区:
# partprobe /dev/sda
 
每个节点的主机名称需要跟"uname -n“命令的结果保持一致。因此,需要保证两个节点上的/etc/hosts文件均为下面的内容(由于我们使用hosts文件来解析对方的FQDN,故也要把对方的ip和主机名对应关系写进来,当然也可以使用DNS):
# vim /etc/hosts
添加:
172.16.30.4 node1.magedu.com node1
172.16.30.6 node2.magedu.com node2
 
为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:
node1上操作:
# sed -i 's@\(HOSTNAME=\).*@\1node1.magedu.com@g' /etc/sysconfig/network
# hostname node1.magedu.com
 
node2上操作:
# sed -i 's@\(HOSTNAME=\).*@\1node2.magedu.com@g' /etc/sysconfig/network
# hostname node2.magedu.com
 
设定两个节点可以基于密钥进行ssh通信,这可以通过如下的命令实现:
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
 
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.4,因此需要同时安装内核模块和管理工具。我们这里选用最新的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.6/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
 
3、配置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的默认中进行继承而无须定义。
 
下面的操作在node1.magedu.com上完成
1)复制样例配置文件为即将使用的配置文件:
# cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc
 
2)配置/etc/drbd.d/global-common.conf,确保启用这些内容,#号为注释内容:
# vim /etc/drbd.d/global_common.conf
global {
        usage-count no;  不开启统计
}
 
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";
               
        }
 
        startup {
                wfc-timeout 120;   等待连接的超时时间
                degr-wfc-timeout 120;   等待降级的节点连接的超时时间
                如上这两个也可以不定义,有默认值
        }
 
        disk {
                on-io-error detach;  当出现I/O错误,节点要拆掉drbd设备
        }
 
        net {
cram-hmac-alg "sha1";  使用sha1加密算法实现节点认证
  shared-secret "mydrbdlab";  认证码,两个节点内容要相同
        }
 
        syncer {
                rate 1000M;  定义同步数据时的速率
        }
}
 
3、定义一个资源/etc/drbd.d/mysql.res,内容如下:
# vim /etc/drbd.d/mysql.res
添加如下内容:
resource mysql {
  on node1.magedu.com {
    device    /dev/drbd0;
    disk      /dev/sda3;
    address   172.16.30.4:7789;
    meta-disk internal;
  }
  on node2.magedu.com {
    device    /dev/drbd0;
    disk      /dev/sda3;
    address   172.16.30.6:7789;
    meta-disk internal;
  }
}
 
以上文件在两个节点node1,node2上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
# scp  -r /etc/drbd.*  node2:/etc
 
4、在两个节点上初始化已定义的资源并启动服务:
 
1)初始化资源,在node1和node2上分别执行:
# drbdadm create-md mysql
 
2)启动服务,在node1和node2上分别执行:
/etc/init.d/drbd start
 
3)查看启动状态:
使用drbd-overview命令来查看:
# drbd-overview 
  0:mysql  Connected Secondary/Secondary Inconsistent/Inconsistent C r----
 
从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary,这里将node1设置为主节点,故要在node1上执行如下命令:
# drbdsetup /dev/drbd0 primary –o
 
而后再次查看状态,可以发现数据同步过程已经开始:
# drbd-overview 
# drbd-overview 
  0:mysql  SyncSource Primary/Secondary UpToDate/Inconsistent C r---- 
[======>.............] sync'ed: 36.0% (636728/987928)K delay_probe: 27  
等数据同步完成以后再次查看状态,可以发现节点已经处于同步状态,且节点已经有了主次:
# drbd-overview 
  0:mysql  Connected Primary/Secondary UpToDate/UpToDate C r---- 
55555556
注:
Primary/Secondary 说明当前节点为主节点
Secondary/Primary 说明当前节点为从节点
 
5、创建文件系统
 
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
# mke2fs -j  /dev/drbd0
# mkdir /mydata
挂载设备:
# mount /dev/drbd0 /mydata
如果出现如下内容说明文件系统格式化完成:
# ls /mydata
  lost+found
 
6、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。
 
node1上操作:
先卸载:
# umount /mydata
把本节点设为从节点:
# drbdadm secondary mysql
查看状态:
# drbd-overview 
  0:mysql  Connected Secondary/Secondary UpToDate/UpToDate C r---- 
 
node2上操作:
设置本节点为主节点:
# drbdadm primary mysql
# drbd-overview 
  0:mysql  Connected Primary/Secondary UpToDate/UpToDate C r----
# mkdir /mydata
# mount /dev/drbd0 /mydata
# ls /mydata
  lost+found
卸载设备:
# umount /mydata
  
如上所有内容正常,说明我们的DRBD已经正常安装配置完成!
 
 
二,mysql的安装
 
1,node1上的配置:
添加用户和组:
# groupadd -r mysql
# useradd -g mysql -r mysql
 
由于主设备才能读写,挂载,故我们还要设置node1为主设备,node2为从设备:
node2上操作:
# drbdadm secondary mysql
node1上操作:
# drbdadm primary mysql
 
挂载drbd设备:
# mount /dev/drbd0 /mydata
# mkdir /mydata/data
data目录要用存放mysql的数据,故改变其属主属组:
# chown -R mysql.mysql /mydata/data/
查看:
# ls /mydata/
data  lost+found
 
mysql的安装;
# tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
# cd /usr/local/
# ln -sv mysql-5.5.20-linux2.6-i686  mysql
# cd mysql 
 
# chown -R mysql:mysql  .
 
初始化mysql数据库:
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# chown -R root  .
 
为mysql提供主配置文件:
# cp support-files/my-large.cnf  /etc/my.cnf
 
并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:
# vim /etc/my.cnf
thread_concurrency = 2
 
另外还需要添加如下行指定mysql数据文件的存放位置:
datadir = /mydata/data
 
为mysql提供sysv服务脚本,使其能使用service命令:
# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
 
node2上的配置文件,sysv服务脚本和此相同,故直接复制过去:
# scp /etc/my.cnf node2:/etc/
# scp /etc/rc.d/init.d/mysqld node2:/etc/rc.d/init.d
 
添加至服务列表:
# chkconfig --add mysqld
确保开机不能自动启动,我们要用CRM控制:
# chkconfig mysqld off
 
而后就可以启动服务测试使用了:
# service mysqld start
测试之后关闭服务:
# ls /mydata/data  查看其中是否有文件
# service mysqld stop
 
为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
输出mysql的man手册至man命令的查找路径:
# vim /etc/man.config
添加如下行即可:
MANPATH  /usr/local/mysql/man
 
输出mysql的头文件至系统头文件路径/usr/include,这可以通过简单的创建链接实现:
# ln -sv /usr/local/mysql/include  /usr/include/mysql
 
输出mysql的库文件给系统库查找路径:(文件只要是在/etc/ld.so.conf.d/下并且后缀是.conf就可以)
# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
 
而后让系统重新载入系统库:
# ldconfig
 
修改PATH环境变量,让系统所有用户可以直接使用mysql的相关命令:
#vim /etc/profile
PATH=$PATH:/usr/local/mysql/bin  (重新登录系统即可生效)
 
卸载drbd设备:
# umount /mydata
 
2,node2上的配置:
添加用户和组:
# groupadd -r mysql
# useradd -g mysql -r mysql
 
由于主设备才能读写,挂载,故我们还要设置node2为主设备,node1为从设备:
node1上操作:
# drbdadm secondary mysql
node2上操作:
# drbdadm primary mysql
挂载drbd设备:
# mount /dev/drbd0 /mydata
 
查看:
# ls /mydata/
data  lost+found
 
mysql的安装;
# tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
# cd /usr/local/
# ln -sv mysql-5.5.20-linux2.6-i686  mysql
# cd mysql 
 
一定不能对数据库进行初始化,因为我们在node1上已经初始化了:
# chown -R root:mysql  .
 
mysql主配置文件和sysc服务脚本已经从node1复制过来了,不用在添加。
 
添加至服务列表:
# chkconfig --add mysqld
确保开机不能自动启动,我们要用CRM控制:
# chkconfig mysqld off
 
而后就可以启动服务测试使用了:(确保node1的mysql服务停止)
# service mysqld start
测试之后关闭服务:
# ls /mydata/data  查看其中是否有文件
# service mysqld stop
 
为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行一些类似node1上的操作,由于方法完全相同,不再阐述!
 
卸载设备:
# umount /dev/drbd0
 
三,corosync+pacemaker的安装配置
安装corosync和pacemaker,首先下载所需要如下软件包至本地某专用目录(这里为/root/cluster):
cluster-glue
cluster-glue-libs
heartbeat
resource-agents
corosync
heartbeat-libs
pacemaker
corosynclib
libesmtp
pacemaker-libs
openais   (这个两个包做如下的实验没有用,可以不装)
openaislib
 
下载地址:http://clusterlabs.org/rpm/。请根据硬件平台及操作系统类型选择对应的软件包;这里建议每个软件包都使用目前最新的版本。
 
3,使用如下命令安装:
# cd corosync/  我的软件包都下载在这个目录中
# yum -y --nogpgcheck localinstall *.rpm  (配置好yum源为系统光盘,会对系统光盘中的软件包有依赖关系)
 
注意:两个节点都要进行软件包的安装,方法相同
 
4、配置corosync:(以下命令在node1.magedu.com上执行)
 
# cd /etc/corosync
# cp corosync.conf.example corosync.conf
 
接着编辑corosync.conf:
# vim corosync.conf
添加如下内容:
service {
ver:  0
name: pacemaker
use_mgmtd: yes
}
 
aisexec {
user: root
group:  root
}
 
开启安全验证功能,当有节点加入集群需要有验证密码串:
secauth: on
 
并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址,我们这里的两个节点在172.16.0.0网络,因此这里将其设定为172.16.0.0,如下(也可以是ip地址):
bindnetaddr: 172.16.0.0
 
设定多播地址,从224.0.0.0到239.255.255.255都可以设定:
mcastaddr: 229.94.1.1
 
生成节点间通信时用到的认证密钥文件:
# corosync-keygen
 
将corosync和authkey复制至node2:
# scp -p corosync.conf authkey  node2:/etc/corosync/
 
分别为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh node2  'mkdir /var/log/cluster'
 
5、尝试启动,(以下命令在node1上执行):
 
# /etc/init.d/corosync start
 
然后启动node2:
# ssh node2 "service corosync start"
 
过一会儿之后,显示node1和node2上线:
# crm status
============
Last updated: Wed Apr 18 05:16:57 2012
Stack: openais
Current DC: node1.magedu.com - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
0 Resources configured.
============
 
Online: [ node1.magedu.com node2.magedu.com ]
 
配置集群的工作属性
corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令先禁用stonith:
# crm configure property stonith-enabled=false
 
对于双节点的集群来说,我们要配置此选项来忽略quorum,即这时候票数不起作用,一个节点也能正常运行:
# crm configure property no-quorum-policy=ignore
 
定义资源的粘性值,使资源不能再节点之间随意的切换,因为这样是非常浪费系统的资源的。
资源黏性值范围及其作用:
0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;
-INFINITY:资源总是移离当前位置;
我们这里可以通过以下方式为资源指定默认黏性值:
# crm configure rsc_defaults resource-stickiness=100
 
四,集群服务及所需资源的定义配置(node1上的操作)
1、查看当前集群的配置信息,确保已经配置全局属性参数为两节点集群所适用:
# crm configure show
node node1.magedu.com
node node2.magedu.com
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="100"
 
2、将已经配置好的DRBD设备/dev/drbd0定义为集群服务;
 
1)按照集群服务的要求,首先确保两个节点上的drbd服务已经停止,且不会随系统启动而自动启动:
# service drbd stop
# chkconfig drbd off
# # ssh node2 "service drbd stop"
# ssh node2 "chkconfig drbd off"
 
# drbd-overview
drbd not loaded
 
2)配置drbd为集群资源:
 
提供drbd的RA目前由OCF归类为linbit,其路径为/usr/lib/ocf/resource.d/linbit/drbd。我们可以使用如下命令来查看此RA及RA的meta信息:
 
# crm ra classes
heartbeat
lsb
ocf / heartbeat linbit pacemaker
stonith
 
# crm ra list ocf 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 mysqldrbd ocf:heartbeat:drbd params drbd_resource="mysql" op monitor role="Master" interval="30s"  op monitor role="Slave" interval="31s" op start timeout="240s" op stop timeout="100s"
 
crm(live)configure# ms MS_mysqldrbd mysqldrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify="true"
 
crm(live)configure# show mysqldrbd
primitive mysqldrbd ocf:heartbeat:drbd \
params drbd_resource="mysql" \
op monitor interval="30s" role="Master" \
op monitor interval="31s" role="Slave" \
op start interval="0" timeout="240s" \
op stop interval="0" timeout="100s"
crm(live)configure# show MS_mysqldrbd
ms MS_mysqldrbd mysqldrbd \
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(live)configure# exit
 
查看当前集群运行状态:
# crm status
============
Last updated: Sat Apr 21 02:01:37 2012
Stack: openais
Current DC: node1.magedu.com - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
1 Resources configured.
============
 
Online: [ node1.magedu.com node2.magedu.com ]
 
 Master/Slave Set: MS_mysqldrbd
     Masters: [ node1.magedu.com ]
     Slaves: [ node2.magedu.com ]
 
由上面的信息可以看出此时的drbd服务的Primary节点为node1.magedu.com,Secondary节点为node2.magedu.com。当然,也可以在node1上使用如下命令验正当前主机是否已经成为web资源的Primary节点:
# drbdadm role mysql
Primary/Secondary
 
我们实现将drbd设置自动挂载至/mydata目录。此外,此自动挂载的集群资源需要运行于drbd服务的Master节点上,并且只能在drbd服务将某节点设置为Primary以后方可启动。
 
确保两个节点上的设备已经卸载:
# umount /dev/drbd0
 
以下还在node1上操作:
# crm
crm(live)# configure
crm(live)configure# primitive MysqlFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext3"  op start timeout=60s op stop timeout=60s
crm(live)configure# commit
crm(live)configure# exit
 
3,mysql资源的定义(node1上操作)
先为mysql集群创建一个IP地址资源,通过集群提供服务时使用,这个地址就是客户端访问mysql服务器使用的ip地址;
# crm configure primitive myip ocf:heartbeat:IPaddr params ip=172.16.30.1
 
配置mysqld服务为高可用资源:
# crm configure primitive mysqlserver lsb:mysqld
# crm status
============
Last updated: Sat Apr 21 02:03:24 2012
Stack: openais
Current DC: node1.magedu.com - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
4 Resources configured.
============
 
Online: [ node1.magedu.com node2.magedu.com ]
 
 Master/Slave Set: MS_mysqldrbd
     Masters: [ node1.magedu.com ]
     Slaves: [ node2.magedu.com ]
 MysqlFS (ocf::heartbeat:Filesystem): Started node1.magedu.com
 myip (ocf::heartbeat:IPaddr): Started node2.magedu.com
 mysqlserver (lsb:mysqld): Started node1.magedu.com
 
4,配置资源的各种约束:
集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:
1)Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行
2)Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行
3)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序
 
定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。INFINITY(无穷大)目前定义为 1,000,000。加减无穷大遵循以下3个基本规则:
1)任何值 + 无穷大 = 无穷大
2)任何值 - 无穷大 = -无穷大
3)无穷大 - 无穷大 = -无穷大
 
定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。
 
我们要定义如下的约束:
# crm
crm(live)# configure 
crm(live)configure# colocation MysqlFS_with_mysqldrbd inf: MysqlFS MS_mysqldrbd:Master myip mysqlserver
crm(live)configure# order MysqlFS_after_mysqldrbd inf: MS_mysqldrbd:promote MysqlFS:start 
crm(live)configure# order myip_after_MysqlFS mandatory: MysqlFS myip
crm(live)configure# order mysqlserver_after_myip  mandatory: myip mysqlserver
验证是否有错:
crm(live)configure# verify
提交:
crm(live)configure# commit
crm(live)configure# exit
 
查看配置信息:
# crm configure show
node node1.magedu.com \
attributes standby="off"
node node2.magedu.com \
attributes standby="off"
primitive MysqlFS ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/mydata" fstype="ext3" \
op start interval="0" timeout="60s" \
op stop interval="0" timeout="60s"
primitive myip ocf:heartbeat:IPaddr \
params ip="172.16.30.1"
primitive mysqldrbd ocf:heartbeat:drbd \
params drbd_resource="mysql" \
op monitor interval="30s" role="Master" \
op monitor interval="31s" role="Slave" \
op start interval="0" timeout="240s" \
op stop interval="0" timeout="100s"
primitive mysqlserver lsb:mysqld
ms MS_mysqldrbd mysqldrbd \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
colocation MysqlFS_with_mysqldrbd inf: MysqlFS MS_mysqldrbd:Master myip mysqlserver
order MysqlFS_after_mysqldrbd inf: MS_mysqldrbd:promote MysqlFS:start
order myip_after_MysqlFS inf: MysqlFS myip
order mysqlserver_after_myip inf: myip mysqlserver
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="100"
 
查看运行状态:
# crm status
============
Last updated: Sat Apr 21 02:05:49 2012
Stack: openais
Current DC: node1.magedu.com - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
4 Resources configured.
============
 
Online: [ node1.magedu.com node2.magedu.com ]
 
 Master/Slave Set: MS_mysqldrbd
     Masters: [ node1.magedu.com ]
     Slaves: [ node2.magedu.com ]
 MysqlFS (ocf::heartbeat:Filesystem): Started node1.magedu.com
 myip (ocf::heartbeat:IPaddr): Started node1.magedu.com
 mysqlserver (lsb:mysqld): Started node1.magedu.com
 
可见,服务现在在node1上正常运行:
在node1上的操作,查看mysql的运行状态:
# service mysqld status
MySQL running (25651)                                      [  OK  ]
查看目录:
# ls /mydata/
data  lost+found
 
 
继续测试:
在node1上操作,让node1下线:
# crm node standby
查看集群运行的状态:
# crm status
============
Last updated: Sat Apr 21 02:07:40 2012
Stack: openais
Current DC: node1.magedu.com - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, 2 expected votes
4 Resources configured.
============
 
Node node1.magedu.com: standby
Online: [ node2.magedu.com ]
 
 Master/Slave Set: MS_mysqldrbd
     Masters: [ node2.magedu.com ]
     Stopped: [ mysqldrbd:1 ]
 MysqlFS (ocf::heartbeat:Filesystem): Started node2.magedu.com
 myip (ocf::heartbeat:IPaddr): Started node2.magedu.com
 mysqlserver (lsb:mysqld): Started node2.magedu.com
 
可见我们的资源已经都切换到了node2上:
查看node2的运行状态:
# service mysqld status
MySQL running (7585)                                       [  OK  ]
查看目录:
# ls /mydata
data  lost+found
 
ok,现在一切正常,我们可以验证mysql服务是否能被正常访问:
我们定义的是通过VIP:172.16.30.1来访问mysql服务,现在node2上建立一个可以让某个网段主机能访问的账户(这个内容会同步drbd设备同步到node1上):
mysql> grant all on *.* to jia@'172.16.%.%' identified by '123456';
Query OK, 0 rows affected (0.08 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
然后我们通过另一台主机进行访问:
# mysql -ujia -h172.16.30.1 -p123456
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.20-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>
 
显示我们的登陆完全正常,那么我们的实验就大功告成!
注:我们可以让node2下线,node1上线资源自动转移到node1上,然后再用一台mysql客户端使用jia这个账号来访问mysql服务器,同样也能访问,这就是我们drbd设备的作用,实现了写操作的高可用!而corosync+pacemaker的安装,实现了mysql服务的健康状态监测,实现mysql服务的高可用性!
 
 

你可能感兴趣的:(集群,drbd配置,配置高可用mysql)