DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

时间:2021-09-04 03:19:56

DRBD(二)DRBD + corosync + pacemaker

配置mysql高可用集群

       在《高可用集群》认识高可用集群的一些基本概念,在《heartbeat v2 crm 及 NFS共享存储的mysql高可用集群》等文章全面认识了用heartbeat v2 配置高可用集群,在《corosync pacemaker 配置高可用集群》识别了corosy+pacemaker配置高可用集群,以及在《DRBD 及 DRBD配置》全面认识了DRBD,下面将会在前面的一些基础上配置DRBD + corosync + pacemaker的mysql高可用集群。

1、架构设计

       这里在《heartbeat v2 haresource 配置NFS共享存储高可用集群》的架构基础上,进行一些改动,不再使用NFS共享存储,而用DRBD同步两节点的mysql数据,具体架构资源如下:

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

1、节点主机系统:RHEL 5.8 64bit

2、高可用集群软件:corosync + pacemaker

3、两台节点主机node1,node2:

Node1: IP:192.168.18.241 host name:node1.tjiyu,com;

Node2: IP:192.168.18.242 host name:node2.tjiyu.com;

VIP: 192.168.18.240

4、DRBD:

Disk:/dev/sda5 1G

DRBD device:/dev/drbd0

DRBD resource:mydrbd

mount directory:/drbd

5、所提供服务:mysql

Data directory:/mydata/data (DRBD device)

两节点相同用户:mysql mysql(组) 3306(uid、gid)

2、相关准备配置

      本文是在前面的一些文章的配置基础上进行的,前面说到的集群高可用配置前所需要的准备,如:

      在heartbeat v2 haresource 配置高可用集群》中详细介绍了以下配置:

1、配置IP、关闭防火墙;

2、配置各节点名称;

3、建立各节点间的SSH互信通信;

4、各节点间的时间同步;

      在《corosync pacemaker 配置高可用集群(一)》详细介绍了以下配置:

5、corosync 和 pacemaker安装配置,配置corosync+pacemaker 可以正常运行;

      在上一篇《DRBD 及 DRBD配置》全面认识了DRBD:

6、DRBD安装配置,配置DRBD 可以正常运行;

      以上这些准备配置,这里就不再详细给出了。

      而在《heartbeat v2 crm 及 NFS共享存储的mysql高可用集群》是配置mysql数据到NFS,和文本配置到DRBD设备有些区别,所以下面先进行配置mysql数据到DRBD。

3、配置mysql数据到DRBD

      mysql5.5版本相对5.6/5.7要小很多,就先用5.5的来测试;先到官网下载mysql-5.5.28-linux2.6-x86_64.tar.gz,放到两节点主机上;如果用yum安装反而比较麻烦,要做数据目录迁移等工作。

3-1、创建mysql用户

       集群系统各节点mysql用户都需要对挂载DRBD设备目录下的mysql数据文件进行读写操作,这就需要用户有对该目录的读写权限,为方便,我们在两台节点主机分别创建相同的普通用户:用户名mysql ,属于mysql组,uid、gid都为 3306(如果uid、gid不一样就得对目录分别配置权限),稍后会为它们配置/mydata/data目录的读写权限,创建过程如下

        [root@node1 ~]# groupadd -g 3306 mysql

[root@node1 ~]# useradd -u 3306 -g mysql -s /sbin/nologin -M mysql

[root@node1 ~]# id mysql

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

3-2、解压mysql,并给mysql用户分配权限(node1)

      先在node1上对mysql进行初始化,首先解压mysql程序包,配置解压后程序目录文件的属组和属主为root组和上面创建的mysql用户:

        [root@node1 ~]# tar -xf mysql-5.5.28-linux2.6-x86_64.tar.gz -C /usr/local

[root@node1 ~]# cd /usr/local/

[root@node1 local]# ln -sv mysql-5.5.28-linux2.6-x86_64 mysql

      创建指向"mysql-5.5.28-linux2.6-x86_64"的符号链接"mysql"

        [root@node1 local]# cd mysql

[root@node1 mysql]# chown -R root:mysql ./*

[root@node1 mysql]# ll

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

3-3、初始化mysql配置(node1)

       注意,先查看DRBD状态,因为现在在node1上操作,查看DRBD的活动节点是不是node1,如果不是先转换。这里是按上篇测试后的配置,所以node2为活动节点,先转换,如下:

    Node2:

[root@node2 ~]# drbd-overview

[root@node2 ~]# umount /drbd/

[root@node2 ~]# drbdadm secondary mydrbd

Node1:

[root@node1 mysql]# drbdadm primary mydrbd

[root@node1 mysql]# drbd-overview

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

       然后创建DRBD设备的挂载目录/mydata,挂载后,再创建/mydata/data目录为mysql的数据目录,并为该目录配置上面创建的mysql用户/组为属主/属组,使其具有读写权限,如下:

        [root@node1 mysql]# mkdir /mydata

[root@node1 mysql]# mount /dev/drbd0 /mydata

[root@node1 mysql]# mkdir /mydata/data

[root@node1 mysql]# chown -R mysql.mysql /mydata/data/

[root@node1 mysql]# ll -d /mydata/data/

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

       初始化mysql数据到/mydata/data目录,同时指定为mysql用户;完成查看数据目录下是否存在数据文件,并且属主和配置的致,配置过程如下:

        [root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

[root@node1 mysql]# ls -l /mydata/data/

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

3-4、配置mysql配置文件,并启动测试(node1)

      先把mysql配置文件my.cf放到/etc下,并添加mysql数据目录项datadir为上面配置的共享目录/mydata/data,以及加上每个innodb表为一个文件的配置;

datadir = /mydata/data

innodb_file_per_table = 1

      再把mysql服务脚本放到/etc/init.d/下(LSB),重命名mysqld,方便高可用集群的资源管理,然后配置禁止开机启动,配置如下:

        [root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf

[root@node1 mysql]# vim /etc/my.cnf

[root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld

[root@node1 mysql]# chkconfig --add mysqld

[root@node1 mysql]# chkconfig mysqld off

[root@node1 mysql]# chkconfig --list mysqld

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

     启动mysql服务,并进行创建数据库的测试,如下:

        [root@node1 mysql]# service mysqld start

[root@node1 mysql]# ./bin/mysql

mysql> create database tjuyi_db;

mysql> show databases;

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

3-5、node2配置mysql,并启动测试

       上面node1测试好的,接着转到node2上进行mysql的相关配置。

       首先像在4-1一样,在node2上解压mysql程序包,配置解压后程序目录文件的属组和属主为root组和上面创建的mysql用户;

       然后远程复制node1上刚才配置的两个文件/etc/my.cnf和/etc/init.d/mysqld到node2相同位置,配置mysqld禁止开机启动,这就行了,和在node1上配置差不多,区别是不需要进行初始化数据到共享目录,因为在node1初始化的时候,DRBD已经把相关文件也同步到node2上,具体过程如下:

        [root@node1 mysql]# scp -p /etc/my.cnf node2:/etc

[root@node1 mysql]# scp -p /etc/init.d/mysqld node2:/etc/init.d/

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

       启动mysql服务前,先停止node1上的mysql服务,然后切换Primary和Secondary节点,使node2成为活动节点:

        Node1:

[root@node1 mysql]# service mysqld stop

[root@node1 mysql]# umount /mydata

[root@node1 mysql]# drbdadm secondary mydrbd

[root@node1 mysql]# drbd-overview

Node2:

[root@node2 mysql]# drbdadm primary mydrbd

[root@node2 mysql]# drbd-overview

      接着在node2上创建DRBD设备的挂载目录/mydata,并挂载,可以看到/mydata/data下存在了mysql初始化的相关文件

        [root@node2 mysql]# mkdir /mydata

[root@node2 mysql]# mount /dev/drbd0 /mydata/

[root@node2 mysql]# ll /mydata/data/

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

      然后在node2上启动mysql服务,进行测试,可以看到在node1上创建的tjiyu_db数据库,如下:

        [root@node2 mysql]# service mysqld start

[root@node2 mysql]# ./bin/mysql

mysql> show databases;

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

      以上测试说明了,在node1初始化mysql和操作mysql数据(创建数据)的时候,DRBD自动把相关文件也同步到node2上。

4、配置高可用集群资源

      Crm sh在《corosync pacemaker 配置高可用集群(二)》有详细介绍,下面将用crm sh来配置DRBD、DRBD设备存储、mysql和VIP四个集群资源,以及它们间资源约束。

4-1、停止mysql和DRBD服务,开启corosync

      上面测试好后,开始配置集群资源前,需要先停止mysql服务,并停止两节点上的DRBD服务,以及禁止开机启动,如下:

        Node2:

[root@node2 mysql]# service mysqld stop

[root@node2 mysql]# umount /mydata

[root@node2 mysql]# drbdadm secondary mydrbd

[root@node2 mysql]# service drbd stop

[root@node2 mysql]# chkconfig --list drbd

[root@node2 mysql]# chkconfig drbd off

[root@node2 mysql]# chkconfig --list drbd

Node1:

[root@node1 mysql]# service drbd stop

[root@node1 mysql]# chkconfig drbd off

[root@node1 mysql]# chkconfig --list drbd

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

      启动两节点上的corosync服务,并保证都是在线状态:

        [root@node1 ~]# service corosync start

[root@node1 ~]# ssh node2 'service corosync start'

[root@node1 ~]# crm

crm(live)# status

crm(live)# node

crm(live)node# online

crm(live)node# online node2.tjiyu.com

crm(live)node# cd ..

crm(live)# status

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

4-2、解决STONITH和不满足合法票数的问题

      这两个问题在《corosync pacemaker 配置高可用集群(二)》有详细介绍。

      先解决刚开始默认STONITH配置错误,因为没有STONITH设备,修改默认属性配置,如下:

crm(live)configure# property stonith-enabled=false

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

       不满足合法票数的问题,可以通过如下的命令来修改忽略quorum不能满足的集群状态检查:

        crm(live)configure# property no-quorum-policy=ignore

crm(live)configure# verify

crm(live)configure# commit

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

4-3、配置DRBD资源

      可用crm(live)ra# info drbd查看DRBD资源代理相关信息,发现给出的是ocf:heartbeat:drbd,这应该是版本问题,下面还是用官方的ocf:linbit:drbd;

       另外,drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。所以还用ms命令来配置主从资源,过程如下:

        [root@node1 ~]# crm

crm(live)# configure

crm(live)configure# primitive res_drbd ocf:linbit:drbd params drbd_resource=mydrbd op start timeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30 op monitor role=Slave interval=30 timeout=30

crm(live)configure# ms ms_drbd res_drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

crm(live)configure# show

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# cd ..

crm(live)# status

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

       配置后,发现DRBD服务的Primary节点为node1,Secondary节点为node2,如下:

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

4-4、配置DRBD设备存储资源

       ms_drbd的Master节点node1即为drbd服务资源的Primary节点,此节点的设备/dev/drbd0可以挂载使用,且在集群服务的应用当中需要能够实现自动挂载,挂载至mysql数据目录/mydata,如下:

        crm(live)configure# primitive res_storage ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60

crm(live)configure# verify

crm(live)configure# show

crm(live)configure# cd ..

There are changes pending. Do you want to commit them? y

crm(live)# status

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

4-5、配置mysql和VIP资源

       把最后两个资源配置了,查看状态,发现node2上启动不了mysql,这是因为数据存储资源运行在node1,所以下面还需要配置资源约束,让它们运行在活动节点,如下:

        crm(live)configure# primitive mysqld lsb:mysqld

crm(live)configure# verify

crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.18.240 nic=eth0 cidr_netmask=255.255.255.0

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# cd ..

crm(live)# status

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

4-6、配置排列(协同)约束

       mysql服务资源mysqld依赖于DRBD存储资源res_storage,DRBD存储资源res_storage依赖于DRBD服务主资源ms_drbd:Master,DRBD服务主资源ms_drbd:Master依赖于VIP资源vip(注意:一定是DRBD服务主资源ms_drbd:Master,如果没有后面的Master,集群是无法正常式作的,还有可能导致DRBD脑裂,前面《DRBD 及 DRBD配置》给出了DRBD脑裂解决方法),配置如下:

        crm(live)configure# colocation mysqld_with_storage inf: mysqld res_storage

crm(live)configure# colocation storage_with_ms_drbd inf: res_storage ms_drbd:Master

crm(live)configure# colocation ms_drbd_with_vip inf: ms_drbd:Master vip

crm(live)configure# verify

crm(live)configure# commit

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

4-7、配置顺序约束

        mysql服务资源mysqld在启动DRBD存储资源res_storage后再启动,DRBD存储资源res_storage在启动DRBD服务主从资源ms_drbd后再启动(注意:res_storage只有在DRBD服务主从资源ms_drbd处于promote状态,也就是DRBD服务成功了主从切换后,其才能进行挂载,否则集群是无法正常式作的,还有可能导致DRBD脑裂,前面《DRBD 及 DRBD配置》给出了DRBD脑裂解决方法),配置如下:

        crm(live)configure# order mysqld_after_storage mandatory: res_storage mysqld

crm(live)configure# order storage_after_ms_drbd mandatory: ms_drbd:promote res_storage:start

crm(live)configure# verify

crm(live)configure# commit

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

 

       最后提交的信息如下:

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

5、测试

5-1、清理资源错误状态

       上面配置好后,有的资源启动可能会发生错误,因为刚开始资源不在一个节点。把资源状态都清理一下,让它们按配置再重新启动就好了,可以看到全部资源都运行在了node2上,如下:

        crm(live)# resource

crm(live)resource# cleanup ms_drbd

crm(live)resource# cleanup res_storage

crm(live)resource# cleanup mysqld

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

5-2、测试node2的mysql

       从上面知道,各资源在node2上正常运行,我们就先在node2上的mysql给root分配权限和设置密码,如下:

        [root@node2 ~]# /usr/local/mysql/bin/mysql

mysql> GRANT ALL ON *.* to 'root'@'%' IDENTIFIED BY '123456';

mysql> FLUSH PRIVILEGES;

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

        然后在客户端上用VIP远程登录mysql,正常登录,看到里面有前面创建的tjiyu_db数据库;并且在里面新建drbd_db数据库,库内新建test表,如下:

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

5-3、切换到node1上,进行测试

      在资源活动节点node2上操作,使node2成为备节点, node1成为主节点,让各资源转移到node1上,并正常运行,然后使node2再次上线,如下:

        crm(live)# node

crm(live)node# standby

crm(live)node# cd ..

crm(live)# status

crm(live)# node

crm(live)node# online

crm(live)node# cd ..

crm(live)# status

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

      再通过客户端上用VIP远程登录mysql,正常登录,并且可以看到在node2上创建drbd_db库和test表:

DRBD(二) DRBD + corosync + pacemaker 配置mysql高可用集群

 

      到这里,配置DRBD + corosync + pacemaker的mysql高可用集群就可以正常运行了,后面将会继续关注分布式文件系统和其他高可用方案……

 

 

【参考资料】

1、Pacemaker:http://clusterlabs.org/wiki/Pacemaker

2、High-availability cluster:https://en.wikipedia.org/wiki/High-availability_cluster#Node_configurations|

3、DRBD 及 DRBD配置http://blog.csdn.net/tjiyu/article/details/52723125

4、高可用集群:http://blog.csdn.net/tjiyu/article/details/52643096

5、heartbeat v2 haresource配置高可用集群:http://blog.csdn.net/tjiyu/article/details/52663927

6、heartbeat v2 crm 配置高可用集群:http://blog.csdn.net/tjiyu/article/details/52675500

7、heartbeat v2 crm 及 NFS共享存储的mysql高可用集群:http://blog.csdn.net/tjiyu/article/details/52686122

8、corosync pacemaker 配置高可用集群(一):http://blog.csdn.net/tjiyu/article/details/52714004

9、Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群:http://freeloda.blog.51cto.com/2033581/1275528