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数据,具体架构资源如下:
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
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
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设备的挂载目录/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/
初始化mysql数据到/mydata/data目录,同时指定为mysql用户;完成查看数据目录下是否存在数据文件,并且属主和配置的致,配置过程如下:
[root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@node1 mysql]# ls -l /mydata/data/
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
启动mysql服务,并进行创建数据库的测试,如下:
[root@node1 mysql]# service mysqld start
[root@node1 mysql]# ./bin/mysql
mysql> create database tjuyi_db;
mysql> show databases;
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/
启动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/
然后在node2上启动mysql服务,进行测试,可以看到在node1上创建的tjiyu_db数据库,如下:
[root@node2 mysql]# service mysqld start
[root@node2 mysql]# ./bin/mysql
mysql> show databases;
以上测试说明了,在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
启动两节点上的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
4-2、解决STONITH和不满足合法票数的问题
这两个问题在《corosync pacemaker 配置高可用集群(二)》有详细介绍。
先解决刚开始默认STONITH配置错误,因为没有STONITH设备,修改默认属性配置,如下:
crm(live)configure# property stonith-enabled=false
不满足合法票数的问题,可以通过如下的命令来修改忽略quorum不能满足的集群状态检查:
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify
crm(live)configure# commit
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服务的Primary节点为node1,Secondary节点为node2,如下:
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
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
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
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
最后提交的信息如下:
5、测试
5-1、清理资源错误状态
上面配置好后,有的资源启动可能会发生错误,因为刚开始资源不在一个节点。把资源状态都清理一下,让它们按配置再重新启动就好了,可以看到全部资源都运行在了node2上,如下:
crm(live)# resource
crm(live)resource# cleanup ms_drbd
crm(live)resource# cleanup res_storage
crm(live)resource# cleanup mysqld
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;
然后在客户端上用VIP远程登录mysql,正常登录,看到里面有前面创建的tjiyu_db数据库;并且在里面新建drbd_db数据库,库内新建test表,如下:
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
再通过客户端上用VIP远程登录mysql,正常登录,并且可以看到在node2上创建drbd_db库和test表:
到这里,配置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