本文将介绍如何利用corosync和pacemaker结合drbd,构建一个高可用的mysql集群服务。在正式介绍之前,我们要先对drbd有一个基本的了解:什么是drbd、为何要使用drbd构建mysql、其优势何在?
DRBD
分布式磁盘块设备
跨主机的块设备镜像系统,基于网络实现数据镜像,是工作于内核的软件
用户空间管理工具:drbdadm, drbdsetup, drbdmeta
工作特性:实时、透明、同步或异步
drbd工作原理图
用户空间的应用程序存储数据时本来是直接向内核发起系统调用,通过内核的调度器调度硬盘驱动程序来实现在磁盘上写入数据的;
drbd的工作原理是在内核系统调用和硬盘驱动程序之间插入一个drbd层,当进程的存储请求到达内核的块层后不是直接通过调度器调度硬盘驱动,而是先经过drbd层;drbd不对数据做任何修改而仅是备份,然后将其中一份数据继续发往硬盘驱动完成本地存储,将复制的备份数据经由网卡发往其他节点的drbd,由drbd完成在其他节点的数据镜像备份;
注意:drbd一般工作于主从模式,不允许同时对两个drbd设备进行写操作以避免文件系统错乱;若要同时对两个drbd做写操作,必须将其构建成HA集群并引入分布式锁管理器才可以;
DRBD架构图
Disk Scheduler:完成同方向合并(读、写是两个不同的方向)
Raw Device:无需文件系统的存储
数据同步模型:
三种协议,分别是protocol A,B,C
A:Asynchronous,异步
数据到达本地网卡传送队列即返回存储完成的信息;
B:Semi-Syncchronous,半同步
数据到达对方网卡的接收队列即返回存储完成的信息;
C:Syncchronous,同步
数据真正存储到另一节点的磁盘中后才返回存储完成的信息;
每组drbd设备都由“drbdresource”进行定义:
资源名字:只能由非空白字符的ASCII字符组成;
drbd设备:/dev/drbd#(主设备号147,次设备号从0开始编号);
磁盘配置:各主机上用于组成此drbd设备的磁盘或分区;
网络配置:数据同步时的网络通信属性;
工作模式
master/slave、primary/secondary
dual master、primary/primary
要求必须在HA集群使用集群文件系统
案例1:实现drbd存储
1、配置前提:时间同步、基于主机名访问、准备两个磁盘设备;
分别在node1和node2上创建两个各5G的新磁盘分区,注意无需格式化;
2、下载源码包并安装
lftp172.16.0.1:/pub/Sources/6.x86_64/drbd> mgetdrbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpmkmod-drbd84-8.4.5-504.1.el6.x86_64.rpm
# rpm-ivh kmod-drbd84-8.4.5-504.1.el6.x86_64.rpmdrbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
3、设定配置文件
# rpm-qa |grep drbd
查看安装生成的drbd文件的名称
# rpm-ql drbd84-utils-8.9.1-1.el6.elrepo
查看安装时生成的文件以获知配置文件位置
/etc/drbd.conf
不提供任何配置,仅设置了包含下边两个配置文件
/etc/drbd.d/global_common.conf
提供全局配置,及多个drbd设备相同的通用配置;
/etc/drbd.d/*.res
资源定义;
global: 全局属性,定义drbd自己的工作特性;
common: 通用属性,定义多组drbd设备通用特性;
*.res:资源特有的配置
(1)配置/etc/drbd.d/global_common.conf
global段
usage-countno
是否允许drbd统计用户的使用习惯,一般设置为no;
common段
handlers
定义处理器,一旦drbd出现主从分裂时应该采取的处理机制及使用的脚本;
Startup
定义drbd启动时各节点间的启动顺序、等待超时时长等;
options
定义同步属性;
disk
定义使用磁盘的属性;
例如要定义某磁盘发生IO错误时直接将其拆除,只需在该段添加如下一行信息“on-io-error detach;”
net
定义网络相关属性;
例如要定义采用的数据同步类型、数据传输时使用的加密算法及密钥,只需在本段添加如下三行信息:
cram-hmac-alg "sha1";
shared-secret "zrcj123";
此处设置的密码建议使用“openssl rand -base64 #”命令来随机生成
假如要定义drbd节点间使用多少带宽用以实现数据同步,可添加如下信息:
syncer {
rate 500M;
}
(2)定义资源
#cd /etc/drbd.d/
#vim mystore.res
resource mystore { resource关键字后跟资源名
device /dev/drbd0;创建的drbd设备的文件名
disk /dev/sda3;指明drbd设备所使用的磁盘设备
meta-disk internal;指明drbd元数据存放位置
internal表示存放在disk指明的设备中
on node1 {
address 172.16.14.2:7789;指明节点监听的IP地址及端口
}
on node2 {
address172.16.14.3:7789;
}
}
注意:相同的定义可放在各node之外,不同的定义必须放置在各node内;
(3)将设定好的配置文件同步到节点2
#scp -r /etc/drbd.d/.* node2:/etc/drbd.d/
4、在两个节点上初始化已定义的资源并启动服务
(1)初始化资源,在Node1和Node2上分别执行
#drbdadm create-md mystore
(2)启动服务,在Node1和Node2上分别执行
#service drbd start
(3)查看启动状态
#cat /proc/drbd
也可以使用drbd-overview命令来查看:
#drbd-overview
从上面的信息中可以看出此时两个节点均处于Secondary状态,数据没有同步,所以需将其中一个节点设置为Primary已完成数据同步;
(4)在要设置为Primary的节点上执行如下命令:
#drbdadm primary --force mystore
也可以在要设置为Primary的节点上使用如下命令来设置主节点:
# drbdadm -- --overwrite-data-of-peer primary web
(5)再次查看状态,可以发现数据同步过程已经开始:
#watch -n1 'cat /proc/drbd'
(6)等数据同步完成以后再次查看状态,可以发现节点已经处于实时同步状态,且有了主次:
#drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
5、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
#mke2fs -t ext4 /dev/drbd0
挂载测试
#mount /dev/drbd0 /mnt/
# ls
#umount /mnt/
6、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
Node1:
#drbdadm secondary mystore
查看状态:
#drbd-overview
0:mystore/0 Connected Secondary/Secondary UpToDate/UpToDate
Node2:
#drbdadm primary mystore
查看状态
#drbd-overview
0:mystore/0 Connected Primary/Secondary UpToDate/UpToDate
挂载测试
#mount /dev/drbd0 /mnt/
# ls
案例2:基于corosync、pacemaker及drbd构建HA mysql service
crm(live)ra#classes
lsb
ocf/ heartbeat linbit pacemaker
在案例1构建完drbd存储后,corosync的ocf中出现一项新的资源代理“linbit”这就是drbd的资源代理
(1)定义主资源
crm(live)configure# primitive mysql_drbd ocf:linbit:drbd params drbd_resource="mystore" op monitorrole="Master" interval="10" timeout="20" opmonitor role="Slave" interval="20" timeout="20"op start timeout="240" interval="0" op stoptimeout="100" interval="0"
(2)定义主从模式
crm(live)configure# ms ms_mysql_drbd mysql_drbd meta clone-max="2" clone-node-max="1"master-max="1" master-node-max="1" notify="true"
注意:若资源配置完成后报错,无法停止并删除资源且无法停止corosync服务时,可使用“crm(live)node# clearstate node#”命令清理节点状态以解决问题
(3)定义文件系统只能自动挂载于主节点
①定义主资源
crm(live)configure#primitive mydata ocf:heartbeat:Filesystem params device="/dev/drbd0"directory="/data" fstype="ext4" op monitor interval=20stimeout=40s op start timeout=60s op stop timeout=60s
②定义位置约束,确保要挂载的文件系统必须和Master节点在一起
crm(live)configure#colocation mydata_with_ms_mysql_drbd_master inf: mydata ms_mysql_drbd:Master
③定义顺序约束,确保节点角色被提升为Master后才能挂载文件系统
crm(live)configure#order mydata_after_ms_mysql_drbd_master Mandatory: ms_mysql_drbd:promotemydata:start
(4)安装MariaDB
①确保两个节点上运行mysql进程用户的uid、gid相同
# groupadd -r -g 360 mysql
# useradd -r -u 360 -g 360 mysql
②下载源码包并安装
lftp 172.16.0.1:/pub/Sources/sources/mariadb> get mariadb-5.5.43-linux-x86_64.tar.gz
# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/
# ln -sv mariadb-5.5.43-linux-x86_64/ mysql
# cd mysql/
# chown -R root.mysql ./*
# mkdir /data/mydata
# ./scripts/mysql_install_db --datadir=/data/mydata/ --user=mysql
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
# vim /etc/mysql/my.cnf,添加如下三行信息
datadir = /data/mydata
innodb_file_per_table = on
skip_name_resolve = on
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# vim /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh
# chkconfig mysqld off
在另一节点重复上述步骤,只是无需再次对数据库初始化;使用“ls /data/mydata”命令,产看数据库内容是否已自动同步过来;
若一切OK,可关闭mysql服务,在corosync中添加相关定义,完成HA最后的构建;
(5)将MariaDB加入到之前的HA中
①定义两个资源myip和myserver
crm(live)configure#primitive myip ocf:heartbeat:IPaddr params ip="172.16.14.5" opmonitor internal=10s timeout=20s
crm(live)configure#primitive myserver lsb:mysqld op monitor interval=20s timeout=20s
②定义所有资源间的约束关系
首先我们要规划好4个资源的位置关系和启动顺序:myip、myserver和mydata都必须与drbd_Msater在一起;drbd_Master-->mydata自动挂载-->启用myip-->启动mysql
crm(live)configure#colocation myip_with_ms_mysql_drbd inf: myip ms_mysql_drbd
crm(live)configure#colocation myserver_with_mydata inf: myserver mydata
crm(live)configure#order myserver_after_mydata Mandatory: mydata:start myserver:start
crm(live)configure#order myserver_after_myip Mandatory: myip:start myserver:start
最终配置如下图所示,完成整个实验。