MySQL高可用性之MySQL+DRBD+Heartbeat

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:


一、环境介绍

130606428.jpg

1、DRDB存储软件

DRBD是一个软件来实现数据实时、同步、异步的数据镜像块存储复制解决方案,主要功能是通过Linux内核实现。

DRBD类似网络RAID-1功能写入本地的文件会通过网络以相同方式写在另一文件系统。

对于实现Mysql高可用,DRBD性能比较差,因为每次更新的数据,都会全部同步一次。

三种模式:

单主模式:具有故障转移功能,高可用集群方式采用。

双主模式:需要采用共享cluster文件系统,如GFS和OCFS2。用于需要从2个节点并发访问数据的场合,需要特别配置。

复制模式:有三种不同复制方式,协议A、协议B、协议C,一般使用协议C,只有在本地和远程节点的磁盘已经确认了写操作完成,写才会被认为完成,没有任何数据丢失。

2、Heartbeat集群系统软件

heartbeatLinux-HA)的工作原理heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务。

Heartbeat:(心跳检测)本身是整个集群的基础(cluster messaging layer),负责维护集群各节点的信息以及它们之前通信;只提供主从备份功能,并不能对各个节点进行监控,需要安装ldirectord

Resource-agent:(资源代理)就是各种的资源的ocf脚本,这些脚本将被LRM调用从而实现各种资源启动、停止、监控等等。

Cluster-glue:相当于一个中间层,可以将heartbeat和crm(pacemaker)联系起来,主要包含2个部分,LRM和STONITH;

Ldirectord:主要配合LVS使用,负责real-server健康检查,自动将real-server中宕机的机器移除,不再分配请求。

3、IP分配

系统:CentOS6.4_x64

主机名 角色
IP地址
db-master
主MySQL

eth0:192.168.0.10/24

eth0:172.0.0.1/24

db-backup 备MySQL

eth0:192.168.0.20/24

eth0:172.0.0.2/24


VIP 192.168.0.100/24

4、配置两台节点解析主机名

vi /etc/hosts

192.168.0.202   db-master

192.168.0.203   db-backup

二、安装MySQL

1
2
3
4
[root@db-master ~] # yum install -y mysql mysql-server  #两个节点简单安装,仅做测试用
[root@db-master ~] # vi /etc/my.cnf
datadir= /data   #修改后的数据库存放目录
[root@db-master ~] # /etc/init.d/mysqld start

三、安装DRBD(两个节点配置是完全一样的)

drbd软件下载:http://oss.linbit.com/drbd/

1、下载并安装对应的drbd内件:

http://mirror.symnds.com/distributions/elrepo/elrepo/el6/x86_64/RPMS/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@db-master ~] # yum install -y gcc gcc-c++ make perl kernel-devel kernel-headers flex #安装依赖包
[root@db-master ~] # rpm -vih drbd84-utils-8.4.4-2.el6.elrepo.x86_64.rpm kmod-drbd84-8.4.4-1.el6.elrepo.x86_64.rpm
[root@db-master ~] # tar zxvf drbd-8.4.4.tar.gz
[root@db-master ~] # cd drbd-8.4.4
[root@db-master drbd-8.4.4] # ./configure --prefix=/usr/local/drbd --with-km #--with-km,启用内核模块
[root@db-master drbd-8.4.4] # make KDIR=/usr/src/kernels/2.6.32-358.23.2.el6.x86_64/ #指定内核源码路径,根据自己系统来
[root@db-master drbd-8.4.4] # make install
[root@db-master drbd-8.4.4] # chkconfig --add drbd
[root@db-master drbd-8.4.4] # chkconfig drbd on
[root@db-master drbd-8.4.4] # cp drbd/drbd.ko /lib/modules/`uname -r`/kernel/lib/   #加载DRBD模块到内核中
[root@db-master ~] # modprobe drbd
[root@db-master ~] # lsmod | grep drbd  #由此查看drbd模块已经加载
drbd                  333755  0
libcrc32c               1246  1 drbd

2、配置DRBD

1
2
3
4
[root@db-master drbd-8.4.4] # cd /usr/local/drbd/
[root@db-master drbd] # cat etc/drbd.conf #主配置是加载全局配置文件和资源配置文件
include  "drbd.d/global_common.conf" ;
include  "drbd.d/*.res" ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@db-master drbd] # vi etc/drbd.d/global_common.conf  #全局配置文件
global {
     usage-count  yes #参加DRBD使用者统计
     }
common {
     protocol C;       #使用同步协议C,收到写入确认就认为完成了写入操作
disk {
     on-io-error detach;   #当磁盘错误时,不连接
     }
syncer
     {
     rate 100M;        #设置主设备节点同步时的网络速率最大值,默认最大1G
     }
  }
resource mysql {    #mysql定义资源的名字
           on  db-master {              #on开头,后面是主机名称
           device     /dev/drbd0 ;        #drbd设备名称
           disk       /dev/sdb1 ;         #drbd0使用的磁盘分区为sdb1
           address  192.168.0.10:7789;  #设置drbd监听地址与端口
           meta-disk  internal;
       }
           on  db-backup {              #on开头,后面是主机名称
           device     /dev/drbd0 ;        #drbd设备名称
           disk       /dev/sdb1 ;         #drbd0使用的磁盘分区为sdb1
           address  192.168.0.20:7789;  #设置drbd监听地址与端口
           meta-disk  internal;
       }
}

3、创建供DRBD记录信息数据块

1
2
3
4
5
6
[root@db-master ~] # drbdadm create-md mysql
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
1
[root@db-backup ~] # drbdadm create-md mysql

#启动两台DRBD

1
2
3
4
5
[root@db-master~] # mkdir -p /usr/local/drbd/var/run/drbd  #创建资源目录
[root@db-master drbd] # service drbd start
[root@db-master drbd] # netstat -tuplna | grep 7789 #查看已经启动drbd
tcp  0  0 192.168.0.10:7789    192.168.0.203:33216  ESTABLISHED -
tcp  0  0 192.168.0.10:7789    192.168.0.203:44977

4、默认没有分主备节点的,需要设置

1
2
3
4
[root@db-master drbd] # cat /proc/drbd #查看drbd状态,显示两个节点默认都处于Secondary状态
version: 8.4.4 (api:1 /proto :86-101)
GIT- hash : 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
  0: cs:Connected ro:Secondary /Secondary  ds:Inconsistent /Inconsistent  C

说明:
cs:两台数据连接状态

ro:两台主机的状态

ds:磁盘状态是“UpToDate/UpToDate”,同步状态。

#初始化设备并设置主备节点

1
2
3
4
[root@db-master drbd] # drbdadm primary mysql #指定本机为主节点
/dev/drbd0 : State change failed: (-2) Need access to UpToDate data    #报错,执行下条命令
[root@db-master drbd] # drbdadm -- --overwrite-data-of-peer primary all
[root@db-backup ~] # drbdadm secondary mysql   #本机设置从节点

 #再查看状态

1
2
[root@masternfs ~] # drbd-overview  
   0:mysql /0   Connected Primary /Secondary  UpToDate /UpToDate  C r-----

5、格式化并挂载分区到/data目录

1
2
3
[root@db-master drbd] # mkfs.ext3 /dev/drbd0
[root@db-master drbd] # mkdir /data
[root@db-master drbd] # mount /dev/drbd0 /data/

四、安装Heartbeat(主备节点配置相同

软件下载:http://www.linux-ha.org/wiki/Downloads

安装依赖包:

1
yum  install -y gcc gcc-c++ autoconf libtool pkgconfig glib2-devel libxslt-devel libxml2-devel  bzip2 -devel libtool-ltdl-devel libuuid-devel docbook-style-xsl

创建需要的组和用户

1
2
groupadd haclient
useradd -g haclient -s  /sbin/nologin-Mhacluster

1.安装资源接管服务(要先安装资源接管服务,否则安装心跳服务会报错)

1
2
3
4
5
tar  zxvf Reusable-Cluster-Components-glue--glue-1.0.9. tar .bz2
cd  Reusable-Cluster-Components-glue--glue-1.0.9
. /autogen .sh
. /configure
make  &&  make  install

2.安装心跳检测服务

1
2
3
4
tar  jxvf Heartbeat-3-0-7e3a82377fa8. tar .bz2
cd  Heartbeat-3-0-7e3a82377fa8
. /ConfigureMeconfigure
make  &&  make  install

3.安装资源代理服务

1
2
3
4
5
tar  jxvf ClusterLabs-resource-agents-v3.9.2-0-ge261943. tar .gz
cd  ClusterLabs-resource-agents-b735277
. /autogen .sh
. /configure
make  &&  make  install

4、配置heartbeat

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@db-master ~]# vi /etc/ha.d/ha.cf
logfile / var /log/ha-log
logfacility local0 #如果未定义上述日志,默认写入/ var /log/message
keepalive  2       #心跳间隔
deadtime  30       #死亡阀值
warntime  10       #警告时间
initdead  120      #首次启动heartbeat,等待多久才启动主服务资源
udpport  694       #连接端口
ucast eth1  172.0 . 0.2  #对方IP,采用网卡的eth1组织心跳,后跟接口IP
auto_failback on #当主节点故障恢复后,自动获取资源并取代从节点
node master      #主节点主机名
node slave       #备份节点主机名
ping  192.168 . 0.1  #选择ping节点,ping的越好对HA集群越稳定,建议使用网关
1
2
3
[root@db-master ~]# vi /etc/ha.d/authkeys
auth  2
2  sha1 HI!

1
2
[root@db-master ~]# vi /etc/ha.d/haresources
db-master IPaddr:: 192.168 . 0.100 / 24 /eth0: 0  drbddisk::mysql Filesystem::/dev/drbd0::/data::ext4 mysqld

说明:

db-master IPaddr::192.168.0.204/24/eth0:0  #主机名,后跟虚拟IP地址和接口

drbddisk::data  #启动drbd data资源

Filesystem::/dev/drbd0::/data::ext4  #挂载/dev/drbd0到/data

mysqld   #服务启动脚本,相当于/etc/init.d/mysql stop/start

五、测试主从切换

主服务器

1
2
3
[root@db-master ~] # umount /data
[root@db-master ~] # mkdir /data/test #创建一个测试文件
[root@db-master ~] # drbdadm secondary r0

备服务器

1
2
3
[root@db-master ~] # drbdadm primary r0
[root@db-master ~] # mount /dev/drbd0 /data
[root@db-master ~] # ls /data  #查看test目录存在

六、DRBD使用中问题解决

1>.服务器重启,必须手动执行modprobe drbd才能加载模块

答:这个是可以设置的,如加入rc.local里面,但不推荐。

主服务器故障恢复后,DRBD应该保留人工介入启动,主备切换已经算完成了高可用任务了,所以涉及数据方面还是谨慎为好,修复故障机应该人工来操作的。

2>.主从切换没问题,master故障后,所有写的数据都在备机上,当master恢复后,此时,数据会同步过去吗?试验说明,数据被master上数据覆盖,备机新增数据丢失。

情况一:开启了auto_failback on参数。

主机故障恢复后,先不要启动heartbeat,先加载DRBD到内核并启动DRBD资源,确保当前提供服务的备机和故障主机数据一致,可以cat /proc/drbd查看状态,如果两边不一致,需要把数据推回到故障机,保持两边同步,然后再启动heartbeat完成自动切换。

情况二:没有开启或关闭了auto_failback参数

主机故障恢复后,将DRBD加载到内核,启动heartbeat,正常情况DRBD状态应该是同步状态或正在同步状态。如果未同步,可以先启动DRBD资源,确保当前提供服务的备机和故障主机数据一致,然后在当前提供服务的备机执行hb_standby命令完成切换。

3>.两台数据库都需要关机,启动后造成脑裂(这次脑裂原因是开机自动DRBD造成的)

查看状态cat /porc/drbd可以看到:

0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C

解决方法:首先在备机节点设置从 drbdadm secondary all

如果主机连接状态显示WFConnection则执行drbdadm connect all,再设置主 drbdadm -- --overwrite-data-of-peer primary all

最后查看状态 cat /porc/drbd已经恢复了主从,数据也是同步状态。



本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1330220,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 关系型数据库 MySQL
《MySQL 简易速速上手小册》第5章:高可用性和灾难恢复(2024 最新版)
《MySQL 简易速速上手小册》第5章:高可用性和灾难恢复(2024 最新版)
121 2
|
7月前
|
监控 关系型数据库 MySQL
HeartBeat监控Mysql状态
HeartBeat监控Mysql状态
|
7月前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
657 0
|
7月前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
119 0
|
7月前
|
缓存 关系型数据库 MySQL
【专栏】提升MySQL性能和高可用性的策略,包括索引优化、查询优化和事务管理
【4月更文挑战第27天】本文探讨了提升MySQL性能和高可用性的策略,包括索引优化、查询优化和事务管理。通过合理使用B-Tree和哈希索引,避免过度索引,以及优化查询语句和利用查询缓存,可以改善性能。事务管理中,应减小事务大小并及时提交,以保持系统效率。主从或双主复制可增强高可用性。综合运用这些方法,并根据实际需求调整,是优化MySQL的关键。
235 2
|
7月前
|
关系型数据库 MySQL
MySQL高可用性之Keepalived+Mysql(双主热备)
MySQL高可用性之Keepalived+Mysql(双主热备)
|
7月前
|
存储 监控 关系型数据库
MySQL高可用性之MySQL+DRBD+Heartbeat
MySQL高可用性之MySQL+DRBD+Heartbeat
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
187 0
|
SQL 关系型数据库 MySQL
MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
85 0
|
负载均衡 监控 关系型数据库
MySQL数据库的主从复制和高可用性架构
MySQL数据库的主从复制和高可用性架构