DRBD+MySQL+keepalived高可用MySQL方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRBD+MySQL+keepalived高可用MySQL方案相关的知识,希望对你有一定的参考价值。

 

DRBD+mysql+keepalived高可用MySQL方案

 

DRBD+MySQL+keepalived高可用MySQL方案1

一、DRBD集群介绍2

1.1 系统介绍2

1.2 工作原理及使用场景2

二、实验目的2

三、实验原理3

3.1 实验拓扑3

3.2 实验环境设备3

四、配置步骤3

4.1 实验前准备环境3

4.1.1 修改主机名称3

4.1.3 同步系统时间4

4.2 DRBD 部署5

4.2.1 DRBD的安装5

4.2.2 DRBD使用磁盘分区5

4.2.3 DRBD的配置5

4.2.5 DRBD设备角色切换11

4.2.6 DRBD脑裂后的处理12

4.2.7 DRBD的性能优化13

4.3 MySQL部署14

4.3.1  MySQL的安装与配置14

4.3.2 手动切换DRBD主从,看另外一台服务器是否有相同数据。15

4.4 keepalived 部署17

4.4.1 keepalivedVIP切换测试19

4.5 DRBD+MySQL+keepalived 服务检查脚本20

五、实验结果验证29

5.1 测试MySQL或者keepalived任意服务出现异常后,DRBD主备节点是否支持自动切换29

5.2 当主节点服务器重启时,DRBD主备节点是否支持自动切换31



一、DRBD集群介绍

1.1 系统介绍

    DRBD(DistributedReplicatedBlockDevice)是一个基于块设备级别在远程服务器直接同步和镜像数据的软件,用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。它可以实现在网络中两台服务器之间基于块设备级别的实时镜像或同步复制(两台服务器都写入成功)/异步复制(本地服务器写入成功),相当于网络的RAID1,由于是基于块设备(磁盘,LVM逻辑卷),在文件系统的底层,所以数据复制要比cp命令更快DRBD已经被MySQL官方写入文档手册作为推荐的高可用的方案之一。通过keepalived服务实现高可用集群的故障转移集群。

1.2 工作原理及使用场景

采用keepalived双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证。默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自动切换到备机上继续提供服务,当主数据库修复完毕,又将服务切回继续由主mysql提供服务。

二、实验目的 

    通过实验验证keepalived+DRBD+MySQL的高可用集群功能,模仿当keepalived或者MySQL服务宕机,热备服务器是否能继续提供服务进行测试;当主节点服务器异常重启或机器故障,热备服务器是否能继续提供服务进行测试;通过该实验验证keepalived与heartbeat对于DRBD的高可用功能进行对比。

三、实验原理

3.1 实验拓扑

       技术分享      

3.2 实验环境设备

序号

设备名称

设备系统

IP地址

软件环境

DRBD磁盘

1

db-server-01

Centos6.5-64bit

172.16.200.81

DRBD+MySQL+keepalived

/dev/sdb1

2

db-server-01

Centos6.5-64bit

172.16.200.82

DRBD+MySQL+keepalived

/dev/sdb1

3

VIP

N/A

172.16.200.88

N/A

N/A

四、配置步骤

4.1 实验前准备环境

4.1.1 修改主机名称

实验前将两台主机的主机名称进行修改,通过修改/etc/hosts和/etc/sysconfig/network相关的修改内容如下:

技术分享

技术分享

4.1.2 关闭防火墙

    关闭服务器系统防火墙,并关闭selinux服务。相关服务的关闭操作在此不在做相关操作。

4.1.3 同步系统时间

对于高可用集群服务时间的同步是很关键的环节,时间不同步将会影响高可用集群的使用。相关时间同步步骤如下,两台机器均做如下操作。

[[email protected] ~]# yum install ntp

[[email protected] ~]# ntpdate 202.120.2.101

注:202.120.2.101为上海交通大学时间服务器

 

4.2 DRBD 部署

4.2.1 DRBD的安装

对于DRBD的安装方式可以采用在官方网站下载源码包来编译或直接使用yum来安装。这里已yum安装为例进行安装配置。

两台主机均进行相同配置,这里已主机db-server-01配置为例进行配置。

[[email protected]~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm #更新rpm包

[[email protected]~]# yum -y install drbd83-utils kmod-drbd83 #安装drbd83

[[email protected]~]# modprobe  drbd

[[email protected]~]# lsmod |grep drbd  #检查是否加载drbd模块

安装完成之后,在/sbin目录下面有drbdadm、drbdmeta、drbdsetup命令。以及/etc/init.d/drbd 启动脚本。

4.2.2 DRBD使用磁盘分区

    保证两台机器硬盘的型号和性能一样好,才能保证在切换后secondary节点能完成原来primary节点所承担的业务负载。同时考虑DB的大小和未来的增长量,可以使用LVM进行分区。这里分配大小为20GB的/data分区给数据使用,两台机器完全一样。

[[email protected] ~]#  fdisk /dev/sdb  # 新建磁盘分区

注:此时不要格式化分区,两台主机,创建好磁盘分区报错即可,无需格式化磁盘。文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化。

4.2.3 DRBD的配置

DRBD的运行需要读取/etc/drbd.conf配置文件。可以通过以下命令重建这个配置文件,该文件中描述了DRBD设备与硬盘分区的映射关系和DRBD的一些配置参数。(两台主机配置相同,这里已主机配置db-server-01为例)

[[email protected] ~]#  vi /etc/drbd.conf

global { usage-count yes; }  # 是否参加DRBD使用者统计

common { syncer { rate 200M; } }       #同步速率,视带宽而定

resource r0 {                         #创建一个资源,名字叫"r0"

        protocol C;                   #选择的是drbd的C 协议(数据同步协议,C为收到数据

并写入后返回,确认成功)

        startup {

        }

        disk {

                on-io-error detach;

        }

        net {

        }

        on db-server-01 {            #设定一个节点,分别以各自的主机名命名

                device /dev/drbd0;   #设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb1

                disk /dev/sdb1;

                address 172.16.200.81:7888;  #设定监听地址以及端口,用于与另一台主机通信。

                meta-disk internal;

        }

        on db-server-02 {

                device /dev/drbd0;

                disk /dev/sdb1;

                address 172.16.200.82:7888;

                meta-disk internal;     # drbd的元数据存放方式,internal表示是在同一个局域网内

        }

}

Db-server-01配置

技术分享 

Db-server-02配置

技术分享

4.2.4 DRBD的启动

    启动DRBD服务之前,首先分别在两台主机的/dev/sdb1分区上创建DRBD元数据信息。

执行的命令如下:

[[email protected] ~]# drbdadm create-md  all

[[email protected] ~]# drbdadm create-md  all

    这里可以使用drbdadm create-md  r0 代替drbdadm create-md all,r0是在配置文件中定义的资源名称。

现在启动DRBD服务,分别在两台主机上执行启动操作。

注:如果在通过drbdadm create-md all 创建元数据不成功,使用以下方式处理,操作时确认分区上的数据已备份。

[[email protected] ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100

[[email protected] ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100

执行完“dd”命令后,在执行“drbdadm create-md all”命令。启动DRBD服务。   

设置主节点后格式化主节点的DRBD分区

 

分别在两台服务器上启动DRBD服务:

[[email protected] ~]# /etc/init.d/drbd start

[[email protected] ~]# /etc/init.d/drbd start

技术分享

查看DRBD状态:

[[email protected] ~]# /etc/init.d/drbd status

技术分享

[[email protected] ~]# /etc/init.d/drbd status

技术分享

可以看见两台主机还都没有主节点。设置当前节点(db-server-01)为主节点,并进行格式化和挂载。

注:挂载DRBD分区之前,首先要确认当前主机的DRBD分区是Primary状态。

执行以下命令:

[[email protected] ~]# drbdadm -- --overwrite-data-of-peer primary all

[[email protected] ~]# mkfs.ext4 /dev/drbd0

[[email protected] ~]# mkdir /data

[[email protected] ~]# mount /dev/drbd0 /data/

技术分享

 在另外一台主机也创建挂载目录/data ,注意:不要执行格式化该主机分区,也不要挂载相应的磁盘。

[[email protected] ~]# mkdir /data

     磁盘挂载完成后,再次查看DRBD的状态(可以看见主备各自的节点分为主备)。

可以使用cat /proc/drbd 和 /etc/init.d/drbd status 命令进行查看。

技术分享

技术分享

从输出的信息可知,磁盘的状态都是“UpToDate”,表示数据同步完成了。

输出中的一些参数的含义如下:

ro是角色信息,Primary/Secondary说明了当前主机是primary节点,另外一台是secondary节点。

ds是磁盘状态,显示数据是否一致(如果显示 UpToDate/UpToDate表明同步没有延时)

       ns是网络发送的数据包,以K字节计算。

       dw是磁盘写操作。

dr是磁盘读操作。

4.2.5 DRBD设备角色切换

   DRBD设备在进行角色切换操作前,需要先在主节点上执行umount命令,先掉对DRBD设备的挂载,然后在另一台主机上把DRBD角色修改为Primary。最后在执行挂载。操作如下:

primary节点上执行以下操作:

技术分享

secondary节点上执行如下操作:

技术分享

这是再次查看DRBD的状态,确认是否完成切换。

技术分享

技术分享

通过以上截图确认角色切换完成。

还有一种切换策略,先停止primary节点的DRBD服务。

然后在secondary节点上执行如下命令:

#  drbdadm --  --overwrite-data-of-peer primary all

#  mount /dev/drbd0 /data/

相关操作截图如下:


技术分享

技术分享

再次查看DRBD状态,当前节点已为primary节点。

技术分享

4.2.6 DRBD脑裂后的处理

    DRBD出现脑裂后,会导致drbd两边的磁盘数据不一致,在确定要作为从的节点上切换成secondary,并放弃该资源的数据:

drbdadm secondary r0

drbdadm -- --discard-my-data connect r0

在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略),使用如下命令连接:

drbdadm connect r0

4.2.7 DRBD的性能优化

    可以考虑以下几个方面优化DRBD性能。

1)网络环境

     能使用千兆网卡的不要使用百兆网卡。当前主流服务器都使用千兆网卡,交换机也不例外。同时,DRBD的数据同步使用的网络最好和提供服务的网络分开,尽量独立出来。例如:在两块网卡上直接连接一个网线,用做DRBD的数据同步。

(2)用做DRBD分区的磁盘的性能

     用做DRBD分区的磁盘的性能尽量好,例如可以考虑通过RAID提高I/O性能,在网络环境很好的情况下,DRBD分区可能会由于I/O的写性能而成为瓶颈。

(3)更新系统

     尽量把系统更新成最新的内核以及64位的系统,同时使用最新版本的DRBD。

(4)注意syncer参数设置

     Syncer主要用来设置同步相关参数。可以设置“重新”同步(re-synchronization)的速率(rate),当节点间出现不一致的block时,DRBD就需要执行re-synchronization动作,而syncer中的参数rate就是用来设置同步的速率的,rate的设置与网络和磁盘I/O能力密切相关。

    千兆网络的同步速率大约是125Mbit/s,百兆网络的同步速率大约是11Mbit/s。用这个同步速率和磁盘写入速率(hdparm-Tt/dev/drbd0测试结果)中最小者的30%带宽来设置re-synchronization是比较合适的,这也是官方给出的建议。

    例如,同步速率为125Mbit/s,磁盘写入速度为119Mbit/s,应该设置rate为不能超过33Mbit/s。

(5)注意al-extents参数设置

     al-extents控制着一次向磁盘写入多少个4MB的数据块。增大这个参数的值有以下几个好处:

     可以减少更新元数据到DRBD设备的频率。

     降低同步数据时对I/O流的中断数量。

     提高修改DRBD设备的速度。

     但是同时也存在一个风险:当主节点出现宕机时,所有活动的数据(al-extends的值X 4M的数据块)需要在同步连接建立后重新同步,即在主节点出现宕机时,备节点出现数据不一致(outdate)的情况。因此,不建议在HA部署上调整这个参数,可以在某些情况下调整这个参数来提供性能。

    总的来说,以上5个方面需要特别注意,调整其他参数影响则较小。

4.3 MySQL部署

4.3.1  MySQL的安装与配置

安装MySQL有多种方法,我这里为了简单直接使用yum安装。

注:两台服务器均需要安装MySQL,两台服务器上的MySQL版本需要一致,对于MySQL的用户uid和gid均需要相同,否则切换后会导致MySQL数据目录的属主不正确而导致启动失败。关键点:在两台服务器的MySQL服务安装完成后,secondary节点的MySQL不需要初始化(就是不启动数据库服务,切记)

我这里以Primary安装为例yum安装MySQL。

[[email protected] ~]# yum install -y mysql-server mysql-devel mysql mysql-bench mysql-test

按装完成后,使用如下命令启动MySQL服务:

[[email protected] ~]# /etc/init.d/mysqld start

将数据文件放到DRBD分区上

[[email protected] ~]# cp -R /var/lib/mysql/ /data/mysql/

[[email protected] ~]# chown -R mysql:mysql /data/mysql/

修改/etc/my.cnf文件,在[mysql]组增加如下配置:

datadir=/data/mysql

待两台主机均按以上操作将MySQL安装完成后,分别启动服务测试,是否能正常启动。

4.3.2 手动切换DRBD主从,看另外一台服务器是否有相同数据。

 切换前数据状况和主备状态

[[email protected] ~]# ll /data

技术分享

技术分享

 

[[email protected] data]# ll /data

技术分享

技术分享

可以看见当前的primary服务器为db-server-01,也就是数据在这台服务器上,secondary服务器为db-server-02是没有数据的。

下面我们将主切换成从,需要先卸载文件系统,再执行降级为从的命令:

[[email protected] ~]# /etc/init.d/mysqld stop  #先停止文件系统的占用,即停止MySQL服务

Shutting down MySQL. SUCCESS!

[[email protected] ~]# umount /data/     #卸载文件系统

[[email protected] ~]# drbdadm secondary all   #将服务器降级

技术分享

从切换成主,要先执行升级成主的命令然后挂载文件系统:

[[email protected] ~]# drbdadm  primary all  #升级为主

[[email protected] ~]# mount /dev/drbd0 /data/  #挂载文件系统

[[email protected] ~]# ll /data    #查看数据是否存在

total 20

drwx------ 2 root  root 16384 Sep  3 19:35 lost+found

drwx------ 5 mysql root  4096 Sep  3 23:51 mysql

技术分享

4.4 keepalived 部署

   安装keepalived有多种方法,我这里为了简单直接使用yum安装.

   两台主机均需要进行相同安装过程,并进行配置,配置的过程中的配置文件不同。

[[email protected]~]# yum -y install keepalived  #两台机器分别安装keepalived软件。

配置keepalived服务,主备均需要配置,配置信息如在:

注:主备配置都不同之处已经标出,注意修改。

! Configuration File for keepalived

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state MASTER    #备机:BACKUP

    interface eth0

    virtual_router_id 59

    priority 100     #备机:80

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        172.16.200.88

    }

}

技术分享

技术分享


配置完成后通过ip  addr查看IP漂移信息。

MASTER 的keepalived服务出现异常时,VIP将漂移到BACKUP节点。

4.4.1 keepalivedVIP切换测试

测试前VIP状态:

技术分享

技术分享


当主节点keepalived停止后查看VIP状态是否正常。

技术分享

技术分享

测试结果反馈,当主节点keepalived服务停止后,VIP将自动切换到备节点。

注:keepalived+MySQL+DRBD服务在安装完成后,均不要添加开机启动项。

4.5 DRBD+MySQL+keepalived 服务检查脚本

脚本检测的作用:

1. Check.sh 脚本监测的是当MySQL服务和keepalived服务在主节点服务器的MySQL或者keepalived服务出现异常时,将会将DRBD+MySQL+keepalived服务全部切换到备节点。该脚本的存放目录自行安排,他的执行需要通过crontab -e任务计划自动执行。所机器中均加入脚本的执行加入crontab -e 中设置为每分钟自动执行。(两台机器均添加)

    * * * * * sh /root/check.sh &>/tmp/check.log

2. 

3. Drbdmanager 脚本检查当主服务器出现宕机时热备服务器将接管所有服务,并自行启动。该脚本存放在/etc/rc.d/init.d路径下,添加执行权限。并在开机启动项中添加开机启动,相关操作如下:

# chkconfig --add drbdmanager

# chkconfig  drbdmanager on

Check.sh脚本内容如下:

[[email protected] ~]# cat check.sh

#!/bin/bash

# check drbd mysql

# time:2016.09.07

# organization:Anchnet

i=0

while (( i<=10 ));do

sleep 5

Time=`date`

VIP=172.16.200.88

Mysql=/etc/init.d/mysqld

Mysql_Status=/var/lib/mysql/mysqld.pid

Keepalived_Status=/var/run/keepalived.pid

Keepalived=/etc/init.d/keepalived

DRBD_Status=`/etc/init.d/drbd status | tail -1 | awk ‘{print $3}‘ | awk -F/ ‘{print $1}‘`

DRBD=r0

Mount_Poit=/data

DRBD_Data=/dev/drbd0

Command_1=/sbin/drbdadm

Command_2=mount

if [[ -f $Keepalived_Status ]];then

echo "$Time Keepalived OK"

else

$Keepalived restart

fi

if `/sbin/ip addr | grep "$VIP" &>/dev/null`;then

echo "$Time Keepalived MASTER"

if [[ "$DRBD_Status" = "Primary" ]];then

echo "$Time DRBD Primary"

if `$Command_2 | grep $Mount_Poit &>/dev/null`;then

echo  "$Time Mount OK."

if [[ -f $Mysql_Status ]];then

echo "$Time Mysql OK"

echo "************华丽的分割线******************"

else

echo "$Time Mysql Fail"

$Mysql restart start

if [[ -f $Mysql_Status ]];then

echo "$Time Mysql OK"

echo "************华丽的分割线******************"

else

$Keepalived stop && sleep 5

fi

fi

else

$Command_2 $DRBD_Data $Mount_Poit

if [[ $? -eq 0 ]];then

echo "$Time  mount disk ok"

else

$Keepalived stop && sleep 5

fi

fi

else

$Command_1 primary $DRBD

                        if [[ $? -eq 0 ]];then

                                echo "$Time Start drbd Primary"

                        else

                                $Keepalived stop && sleep 5

                        fi

fi

else

if [[ -f $Mysql_Status  ]];then

 $Mysql  stop

                        if [[ $? -eq 0 ]];then

                                echo "$Time Stop Mysql OK"

                        else

                                /bin/kill -9 mysqld

echo "$Time Stop Mysql OK"

                        fi

 if `$Command_2 | grep $Mount_Poit &>/dev/null`;then

u$Command_2 $DRBD_Data && echo "$Time umount OK"

if [[ "$DRBD_Status" = "Primary" ]];then

$Command_1 secondary $DRBD && echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

else

echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

fi

 else

echo "$Time Stop Mysql OK"

if `$Command_2 | grep $Mount_Poit &>/dev/null`;then

                        u$Command_2 $DRBD_Data && echo "$Time umount OK"

                        if [[ "$DRBD_Status" = "Primary" ]];then

                                $Command_1 secondary $DRBD && echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                        else

                                echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                        fi

else

                                if [[ "$DRBD_Status" = "Primary" ]];then

                                        $Command_1 secondary $DRBD && echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                                else

                                         echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                                fi


fi

fi


else

                 if `$Command_2 | grep $Mount_Poit &>/dev/null`;then

                        u$Command_2 $DRBD_Data && echo "$Time umount OK"

                        if [[ "$DRBD_Status" = "Primary" ]];then

                                $Command_1 secondary $DRBD && echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                        else

                                echo "$Time Start secondary OK"

                        fi

                 else

                                if [[ "$DRBD_Status" = "Primary" ]];then

                                        $Command_1 secondary $DRBD && echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                                else

                                         echo "$Time Start secondary OK"

echo "************华丽的分割线******************"

                                fi

 

                fi

 

 

fi

fi

let "i++"

done

 

Drbdmanager.sh脚本内容如下:

[[email protected] ~]# cat /etc/rc.c/init.d/drbdmanager

#!/bin/bash

# drbdmanagermanager drbd

# chkconfig: - 75 05

# description:shutdown drbd

 

Mysql=/var/lib/mysql/mysqld.pid

DRBD_Status=`/etc/init.d/drbd status | tail -1 | awk ‘{print $3}‘ | awk -F/ ‘{print $1}‘`

DRBD=r0

Mount_Poit=/data

DRBD_Data=/dev/drbd0

Command_1=/sbin/drbdadm

Command_2=mount

crond=/etc/init.d/crond

. /etc/rc.d/init.d/functions

 

function stop(){

if [[ "$DRBD_Status" = "Primary" ]];then

 /bin/kill crond  &>/dev/null && /bin/kill sh && /bin/kill ${`cat $Mysql`} && /bin/umount $DRBD_Data  && $Command_1 secondary $DRBD &>/dev/null

else

::

fi

}

 

function status(){

if [[ $? -eq 0 ]];then

action "Stop DRBD:" /bin/true

else

action "stop DRBD:" /bin/false

fi

}

case "$1" in

stop)

stop

status

;;

start)

action "Start DRBDManager" /bin/true

;;

*)

echo "INPUT STOP"

;;

esac

Exit

 

五、实验结果验证

实验的验证结果从以下几个方面进行验证。

5.1 测试MySQL或者keepalived任意服务出现异常后,DRBD主备节点是否支持自动切换

测试结果如下:

服务停止前状态如下:

  

技术分享

技术分享


Keepalived服务停止后的结果查看:

  

技术分享

技术分享


    通过以上截图测试结果反馈,通过脚本的执行可以满足当主节点服务宕机后,热备节点将结果所有服务,保证业务的正常运行。

注:当进行手动停止MySQL或者keepalived服务进行测试时,一定要将服务彻底的停止,否则在脚本执行的时候MySQL或者keepalived服务将对通过脚本自动重启,不能起到测试的过程

5.2 当主节点服务器重启时,DRBD主备节点是否支持自动切换

当服务器重启前的状态如下:

技术分享

当主节点服务器

技术分享

通过已上测试结果反馈当主节点正常关机后,热备服务器将自动接管所有服务,保证业务的正常运行。

注:服务器关机测试,仅在当服务器正常重启的情况下进行,当服务器异常重启,将会导致服务出现脑裂,异常重启尽量避免。


本文出自 “11300269” 博客,转载请与作者联系!

以上是关于DRBD+MySQL+keepalived高可用MySQL方案的主要内容,如果未能解决你的问题,请参考以下文章

15 Heartbeat+DRBD+MySQL高可用架构方案与实施过程细节

Centos7+Mariadb+Keepalived实现Mariadb(MYSQL)的高可用(HA)

mysql高可用+keepalived

MySQL双主+keepalived实现高可用

MySQL高可用之KeepAlived+双主

MySQL 高可用性keepalived+mysql