DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换

DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换

    • 一、功能介绍
      • 1. DRBD
      • 2. Pacemake
      • 3. Corosync
    • 二、安装过程
      • 1. 环境准备
      • 2. 安装软件
      • 3. 配置DRBD
      • 4. 初始化DRBD
      • 5. MySQL安装
      • 6. 安装Pacemeka和Corosync
      • 7. 编写MySQL切换脚本
    • 三、故障模拟测试
      • 1. MySQL故障模拟
      • 2. 机器宕机测试

一、功能介绍

1. DRBD

DRBD是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像,当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样的本地主机(主节点)与远程主机(备节点)的数据就可以保证实时同步。

当本地主机出现问题,远程主机上还保留着一份相同的数据,可以继续使用,保证了数据的安全。
DRBD是linux内核模块实现的快级别的同步复制技术,可以与SAN达到相同的共享存储效果。

优点:
两节点即可,部署简单,切换逻辑简单;
相比于SAN储存网络,价格低廉;
保证数据的强一致性;
缺点:
对io性能影响较大;
从库不提供读操作;

2. Pacemake

Pacemaker是 Linux环境中使用最为广泛的开源集群资源管理器, Pacemaker利用集群基础架构(Corosync或者 Heartbeat)提供的消息和集群成员管理功能,实现节点和资源级别的故障检测和资源恢复,从而最大程度保证集群服务的高可用。从逻辑功能而言, pacemaker在集群管理员所定义的资源规则驱动下,负责集群中软件服务的全生命周期管理,这种管理甚至包括整个软件系统以及软件系统彼此之间的交互。 Pacemaker在实际应用中可以管理任何规模的集群,由于其具备强大的资源依赖模型,这使得集群管理员能够精确描述和表达集群资源之间的关系(包括资源的顺序和位置等关系)。同时,对于任何形式的软件资源,通过为其自定义资源启动与管理脚本(资源代理),几乎都能作为资源对象而被 Pacemaker管理。此外,需要指出的是, Pacemaker仅是资源管理器,并不提供集群心跳信息,由于任何高可用集群都必须具备心跳监测机制,因而很多初学者总会误以为 Pacemaker本身具有心跳检测功能,而事实上 Pacemaker的心跳机制主要基于 Corosync或 Heartbeat来实现

pacemaker的主要功能包括以下几方面:

1、监测并恢复节点和服务级别的故障。                                                                                                         
2、存储无关,并不需要共享存储。
3、资源无关,任何能用脚本控制的资源都可以作为集群服务。
4、支持节点 STONITH功能以保证集群数据的完整性和防止集群脑裂。
5、支持大型或者小型集群。
6、支持 Quorum机制和资源驱动类型的集群。
7、支持几乎是任何类型的冗余配置。
8、自动同步各个节点的配置文件。
9、可以设定集群范围内的 Ordering、 Colocation and Anti-colocation等约束。
10、高级服务类型支持,例如:
  Clone功能,即那些要在多个节点运行的服务可以通过 Clone功能实现, Clone功能将会在多个节点上启动相同的服务;
  Multi-state功能,即那些需要运行在多状态下的服务可以通过 Multi--state实现,在高可用集群的服务中,有很多服务会运行在不同的高可用模式下,
  如:Active/Active模式或者 Active/passive模式等,并且这些服务可能会在 Active 与standby(Passive)之间切换。
11、具有统一的、脚本化的集群管理工具。

3. Corosync

Corosync是集群管理套件的一部分,通常会与其他资源管理器一起组合使用它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义上的新软件,在2002年的时候有一个项目Openais , 它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync ,它的代码60%左右来源于Openais. Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要使用Openais了。Corosync是未来的发展方向。在以后的新项目里,一般采用Corosync,而hb_gui可以提供很好的HA管理功能,可以实现图形化的管理。另外相关的图形化有RHCS的套件luci+ricci,当然还有基于java开发的LCMC集群管理工具。

二、安装过程

1. 环境准备

主机名 IP 角色 OS Disk DRBD Device
mysql01 192.168.100.128 Master /dev/sdb1 /dev/drbd1
mysql02 192.168.100.134 Slave /dev/sdb1 /dev/drbd1
- 192.168.100.140 Vip - -

每台机器准备一块儿空白硬盘
关闭Selinux关闭Firewalld

2. 安装软件

在两台机器中均安装相同软件

[root@mysql01 ~]# wget http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@mysql01 ~]# rpm -ivh elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@mysql01 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
[root@mysql01 ~]# yum install kmod-drbd84 drbd84-utils -y

3. 配置DRBD

两台机器均做相同操作

[root@mysql01 ~]# echo  "192.168.100.128 mysql01" >> /etc/hosts
[root@mysql01 ~]# echo  "192.168.100.134 mysql02" >> /etc/hosts
[root@mysql01 ~]# modprobe drbd
[root@mysql01 ~]# lsmod | grep drbd
drbd                  397041  0 
libcrc32c              12644  2 xfs,drbd

[root@mysql01 ~]# vi /etc/drbd.d/mysqlr0.res
		resource mysqlr0 {
		protocol C;
		        on mysql01 {
		                device /dev/drbd1;
		                disk /dev/sdb1;
		                address 192.168.100.128:7788;
		                meta-disk internal;
		        }
		        on mysql02 {
		                device /dev/drbd1;
		                disk /dev/sdb1;
		                address 192.168.100.134:7788;
		                meta-disk internal;
		        }
		}
		
[root@mysql01 ~]# vi /etc/drbd.d/global_common.conf
	##取消掉以下注释
	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";
    
[root@mysql01 ~]# fdisk  /dev/sdb
	n > p > 1 > 回车  > 回车 > w
	
[root@mysql01 ~]# reboot

4. 初始化DRBD

[root@mysql01 ~]# drbdadm create-md mysqlr0
[root@mysql01 ~]# systemctl start drbd
[root@mysql01 ~]# systemctl enable drbd

选择其中一个节点执行下面命令。命令执行成功,该节点将成为 DRBD 主节点,另一节点成为备用节点,并开始第一次状态和数据同步。

[root@mysql01 ~]# drbdadm primary mysqlr0 --force
[root@mysql01 ~]# cat /proc/drbd

DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第1张图片

数据同步结束后格式化磁盘 在主节点中执行
DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第2张图片

[root@mysql01 ~]# mkfs.ext3  /dev/drbd1

5. MySQL安装

创建用户,并配置MySQL,在两台机器中均做相同操作

[root@mysql01 ~]# useradd  mysql -s /sbin/nologin
[root@mysql01 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
[root@mysql01 ~]# tar zxf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
[root@mysql01 ~]# mv mysql-5.7.22-linux-glibc2.12-x86_64 /usr/local/mysql
[root@mysql01 ~]# vi /etc/my.cnf
[client]
port    = 3306
socket  = /usr/local/mysql/mysql.sock	
[mysqld]
port    = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket  = /usr/local/mysql/mysql.sock
pid-file = /usr/local/mysql/mysql.pid
character-set-server = utf8mb4
skip_name_resolve = 1
log-error = /usr/local/mysql/error.log

[root@mysql01 ~]# mkdir  /usr/local/mysql/data
[root@mysql01 ~]# touch /usr/local/mysql/error.log
[root@mysql01 ~]# echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
[root@mysql01 ~]# source  /etc/profile
[root@mysql01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
[root@mysql01 ~]# vi/etc/init.d/mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
[root@mysql01 ~]# chkconfig --add mysql

在主节点中挂载磁盘,进行MySQL数据初始化

[root@mysql01 ~]# mount /dev/drbd1  /usr/local/mysql/data/
[root@mysql01 ~]# rm -rf /usr/local/mysql/data/*
[root@mysql01 ~]# chown mysql:mysql /usr/local/mysql/ -R
[root@mysql01 ~]# mysqld --initialize-insecure
[root@mysql01 ~]# chown mysql:mysql /usr/local/mysql/ -R
[root@mysql01 ~]# systemctl  start mysql
[root@mysql01 ~]# mysqladmin  -uroot password 'root'
[root@mysql01 ~]# mysql -uroot -proot -e "grant all on *.* to 'root'@'%' identified by 'root';"
[root@mysql01 ~]# mysql -uroot -proot -e "flush privileges;"

接着在备用节点上安装数据库。首先停止主节点上相关服务

[root@mysql01 ~]# systemctl stop mysql
[root@mysql01 ~]# umount /usr/local/mysql/data/
[root@mysql01 ~]# drbdadm secondary mysqlr0   ##将MySQL01 降级为从

在从节点中执行

[root@mysql02 ~]# drbdadm primary mysqlr0    ##将MySQL02 提升为主
[root@mysql02 ~]# mount /dev/drbd1  /usr/local/mysql/data/
[root@mysql02 ~]# chown mysql:mysql /usr/local/mysql/ -R
[root@mysql02 ~]# systemctl  start mysql
[root@mysql02 ~]#  mysql -uroot -proot -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

MySQL从节点正常,接着安装Pacemeka和Corosync

6. 安装Pacemeka和Corosync

两台机器都安装

[root@mysql01 ~]# yum install corosync pacemaker pcs -y
[root@mysql01 ~]# systemctl start pcsd.service
[root@mysql01 ~]# systemctl enable pcsd.servic

为集群用户设置密码,该用户将用来在集群节点间通信,进行数据同步。两台都做,密码需相同

[root@mysql01 ~]# passwd hacluster

配置集群,在任意节点执行

[root@mysql01 ~]# pcs cluster auth mysql01 mysql02
[root@mysql01 ~]# pcs cluster setup --name mysqlcluster mysql01 mysql02
[root@mysql01 ~]# pcs cluster start --all
[root@mysql01 ~]# pcs status

DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第3张图片

因为虚拟机没有真正的 fence 设备,所以需要禁用 fence 功能。
因为两节点集群不需要在 vote 功能,所以禁用 quorum。

[root@mysql01 ~]# pcs property set stonith-enabled=false
[root@mysql01 ~]# pcs property set no-quorum-policy=ignore

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

添加集群资源,将 DRBD,文件系统和MySQL服务纳入集群管理,并设置彼此之间的依赖关系。

##定义HA资源
[root@mysql01 ~]# pcs resource create drbd_ha ocf:linbit:drbd drbd_resource=mysqlr0 op start timeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30 op monitor role=Slave interval=30 timeout=30
##定义Master
[root@mysql01 ~]# pcs resource master  ms_drbd_ha drbd_ha master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
##添加drbd资源
[root@mysql01 ~]# pcs resource create drbd_fs ocf:heartbeat:Filesystem  device=/dev/drbd1 directory=/usr/local/mysql/data fstype=ext3 op start timeout=60 op stop timeout=60
##添加MySQL资源
[root@mysql01 ~]#  pcs resource create mysql_svc systemd:mysql op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s
##添加集群IP(VIP)
[root@mysql01 ~]#  pcs resource create myvip  ocf:heartbeat:IPaddr  ip=192.168.100.140 nic=ens33 cidr_netmask=255.255.255.0

mysql服务资源mysql_svc依赖于DRBD存储资源drbd_fs,DRBD存储资源drbd_fs依赖于DRBD服务主资源 drbd_ha:Master,VIP资源 myvip 依赖于mysql_svc

drbd_fs 会在 drbd_ha:Master上挂载,mysql会在 有drbd_fs 的节点上启动,myvip会在有mysql的节点上启动

[root@mysql01 ~]# pcs constraint colocation add drbd_fs with ms_drbd_ha INFINITY with-rsc-role=Master
[root@mysql01 ~]# pcs constraint order promote ms_drbd_ha then start drbd_fs
[root@mysql01 ~]# pcs constraint colocation add mysql_svc with drbd_fs INFINITY
[root@mysql01 ~]# pcs constraint order drbd_fs then mysql_svc	
[root@mysql01 ~]# pcs constraint colocation add myvip with mysql_svc INFINITY
[root@mysql01 ~]# pcs constraint order mysql_svc then myvip

刷新集群资源状态

[root@mysql01 ~]#  pcs resource refresh --all
[root@mysql01 ~]#  pcs status

DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第4张图片
因为Master 上面已经把mysql01停掉了,DRBD 现在挂载在mysql02上,所以资源会显示全部都在mysql02上

7. 编写MySQL切换脚本

编写MySQL监控脚本,用于实现MySQL故障启动切换,(默认pcs集群切换是根据pcs进程服务的死活来进行切换的,当MySQL服务挂掉后并不会自动切换,所以需要手动编写脚本监控集群及MySQL的状态,当脚本发现运行MySQL的机器上,MySQL 未正运行后,则会进行自动的重启集群Node,以实现MySQL自动切换)

需要分别在两台机器中做相同配置

[root@mysql01 ~]# vi check_mysql.sh
#!/bin/bash
hostname=$(hostname)
netstat -utpln |grep 3306 > /dev/null
if [ $? != 0 ];then
	 now=$(/usr/sbin/pcs status |grep systemd:mysql |awk '{print $4}')
	 ps -aux |grep pcsd |grep -v grep > /dev/null
	 if  [ $? = 0 -a $now = $hostname ];then
		   /usr/sbin/pcs cluster stop  $hostname > /dev/null
		   sleep 10
		   /usr/sbin/pcs cluster start  $hostname > /dev/null
		   sleep 3
		   /usr/sbin/pcs resource refresh --all > /dev/null
	 fi
fi
		
[root@mysql01 ~]# chmod +x check_mysql.sh
[root@mysql01 ~]# crontab -e
* * * * * /root/check_mysql.sh

三、故障模拟测试

1. MySQL故障模拟

当前集群状态
DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第5张图片
手动修改正在运行MySQL节点的MySQL配置文件,然后关闭服务,使其MySQL服务无法启动

DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第6张图片
此时发现所有的资源均全都转移到了MySQL01上

查看MySQL01 机器的资源
DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第7张图片
DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第8张图片
DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第9张图片
DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第10张图片

2. 机器宕机测试

还原之前修改的MySQL配置文件
关闭现在正在运行MySQL的节点

查看最终状态 ,故障切换成功
↓↓↓↓↓↓↓↓↓↓↓

DRBD+ Pacemake + Corosync 实现 MySQL主备+自动切换_第11张图片

你可能感兴趣的:(MySQL,Linux,HA,mysql,linux,运维)