corosync+pacemaker+drbd 实现mysql的高可用
实验原理:有两个节点,一个为inode1,另一个为inode2。把drbd作为集群资源,可以在两个节点之间流动。再把mysql服务作为资源,把mysql的数据目录放到drbd的设备上。实现mysql的高可用。
corosync所需软件包:放置在/root/corosync
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
pacemaker-libs-1.0.11-1.2.el5.i386.rpm resource-agents-1.0.4-1.1.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
drbd所需的软件包:放置在/root/drbd
drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
其实corosync和drbd单独的安装配置已经在作者的博客《基于corosync/openais+pacemaker构建高可用集群》和《DRBD的简单配置》中介绍过了,这里再稍微整理一下吧。
前提:ip,主机名,/etc/hosts文件都已经配置好了。
node1:192.168.0.111 node1.hanlenry.com
node2:192.168.0.112 node2.hanlenry.com
1.先安装corosync。注意首先同步你的两个节点的时间
node1:
#cd /root/corosync
#yum –y –nogpgcheck localinstall *.rpm
node2:
#cd /root/corosync
#yum –y –nogpgcheck localinstall *.rpm
node1:
#cd /etc/corosync
#cp corosync.conf.example corosync.conf
#vim corosync.conf
-----------------------------------------------
修改:secauth 为on
bindnetaddr 为你的主机所在的网络地址
添加:service {
ver: 0
name: pacemaker
}
ai***ec {
user: root
group: root
}
--------------------------------------------------
#corosync-keygen
#scp –p authkey corosync.conf node2:/etc/corosync
#mkdir –v /var/log/cluster
#ssh node2 ‘mkdir –v /var/log/cluster’
启动corosync
#service corosync start
#ssh node2 ’service corosync start’
测试:分别在node1和node2上执行。
1.产看引擎是否正常启动
#grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
2.查看初始化成员节点通知是否正常发出
#grep TOTEM /var/log/messages
3.检查启动过程中是否有错误产生
#grep ERROR: /var/log/messages | grep -v unpack_resources
4.查看pacemaker是否正常启动
#grep pcmk_startup /var/log/messages
禁用stonith和quroum
#crm configure property stonith-enable=false
#crm configure property no-quorum-policy=ignore
--------------------------------------------------------------------------------------
OK ,corosync 的配置就完成了。接下来,安装配置drbd,首先分别在node1和node2上创建一个分区。此处我创建的分区为/dev/sda5,大小为5G。
安装drbd
node1:
#cd /root/drbd
#yum localinstall *.rpm –y –nogpgcheck
node2:
#cd /root/drbd
#yum localinstall *.rpm –y –nogpgcheck
如果想要卸载,则使用rpm –e kmod-drbd83,rpm –e drbd83
node1:
#cd /usr/share/doc/drbd83-8.3.8
#cp drbd.conf /etc
#cd /etc/drbd.d
#vim 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;
}
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;
}
}
------------------------------------------------------------
#vim web.res
resource web {
on node1.hanlenry.com {
device /dev/drbd0;
disk /dev/sda5;
address 192.168.0.111:7789;
meta-disk internal;
}
on node2.hanlenry.com {
device /dev/drbd0;
disk /dev/sda5;
address 192.168.0.112:7789;
meta-disk internal;
}
}
把配置的两个文件拷贝到node2上
#scp –r /etc/drbd.conf /etc/drbd.d/ node2:/etc
创建drbd,
node1和node2:
#drbd create-md web
如图:
启动drbd
node1:
#service drbd start
#ssh node2 ‘service drbd start’
把node1设置为主节点
#drbdadm -- --overwrite-data-of-peer primary web
#cat /proc/drbd 也可以使用drbd-overview
等同步完成后,格式化
#mke2fs –j –L DRBDWEB /dev/drbd0
创建目录
node1和node2上:
#mkdir /web
好,此时把drbd服务停掉,且不会开机自动启动
node1和node2上:
#service drbd stop
把drbd定义为集群服务,drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多状态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。
#crm configure primitive webdrbd ocf:linbit:drbd params drbd_resource=web op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s
#crm configure master MS_Webdrbd webdrbd meta master-max="1" master-node-max="1" clone-max="2"(刚开始两个都是Secondary) clone-node-max="1"(克隆节点) notify="true"
为主节点上的web资源创建自动挂载的集群服务,作者建立的目录为/web。只有主节点才可以挂载使用。并且自动挂载的集群资源需要运行于drbd服务的主节点上,而且只能在drbd服务将某个节点设置为主节点后,才能挂载。此时,我们就需要定义排列约束和次序约束了。
#crm configure primitive WebFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/web" fstype="ext3"
定义 排列约束:
#crm configure colocation WebFS_on_MS_webdrbd inf: WebFS MS_Webdrbd:Master
定义次序约束:
#crm configure order WebFS_after_MS_Webdrbd inf: MS_Webdrbd:promote WebFS:start
#verify *检查如果没有错误就可以提交了。
#commit
查看集群中的资源状态,如图:
好,接下来实现mysql的高可用。首先安装mysql,我这里就直接使用rpm包安装了。
#yum install mysql-server mysql
关闭mysql的自动启动
#chkconfig mysqld off
修改一下mysql的配置文件:
# vim /etc/my.cnf
修改:datadir = /web
定义两个资源:ip和mysql服务
#crm configure primitive MysqlIP ocf:heartbeat:IPaddr params ip="192.168.0.12"
#crm configure primitive Mysqlserver lsb:mysqld op start timeout="120" op stop timeout="120" op monitor interval="20" timeout="30"
#crm configure group Gmysql MysqlP Mysqlserver
定义排列约束:
#crm configure colocation Mysql_on_Webdrbd inf: Gmysql MS_WebDrbd:Master
定义次序约束:
#crm configure order Mysql_after_MS_FS inf: WebFS:start Mysqlserver:start
查看集群资源状态:
查看一下cib配置。
其中下图的内容,是系统自动产生的。
是因为我们在配置文件global_common.conf中将下列几项内容取消了。
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;
这些都是防止脑裂的一些机制。
我们来验证一下mysql是否能启动:
创建一个数据库hanlenry。如图
模拟演示:
如果不启动上述几项,当你将node1 standby后(命令:crm node standby),会一直报错。当把上述几项启动后,你再把node1 standby 后,就不会报错。但是此时slave不会自动转换为Master.。但是你如果将我上图的内容删除后,就会自动转换。
如图:
此时我们再来看一下数据库是否可用:
如图:
可以看到,此处有我们的创建的hanlenry。此时就实现了mysql的高可用。