corosync+pacemaker+drbd 实现mysql的高可用

4207阅读 0评论2011-09-18 hanlenry
分类:LINUX

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

 

其实corosyncdrbd单独的安装配置已经在作者的博客《基于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’

 

测试:分别在node1node2上执行。

     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

 

禁用stonithquroum

                   #crm configure property stonith-enable=false

                   #crm configure property no-quorum-policy=ignore

--------------------------------------------------------------------------------------

OK ,corosync 的配置就完成了。接下来,安装配置drbd,首先分别在node1node2上创建一个分区。此处我创建的分区为/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

node1node2

                   #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

创建目录

node1node2上:

                   #mkdir /web

好,此时把drbd服务停掉,且不会开机自动启动

node1node2上:

                   #service drbd stop

drbd定义为集群服务,drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多状态(Multi-stateclone类型,即主机节点有MasterSlave之分,且要求服务刚启动时两个节点都处于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

定义两个资源:ipmysql服务

                   #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的高可用。

上一篇:集群的一些总结
下一篇:马云告诉你:努力做一个内心强大的女子