MySQL+DRBD+heartbeat高可用方案

DRBD概述

DRBD简介

DRBD的全称为:Distributed ReplicatedBlockDevice(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而组成,用来构建数据的高可用性集群。其实现方式是通过网络来镜像整个磁盘设备(数据)。你可以把它看作是一种基于网络的RAID1。它允许用户在远程机器上建立一个本地块设备的实时镜像

DRBD工作原理

(DRBDPrimary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存储到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。


DRBD与HA的关系

一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错。

DRBD复制模式

协议A:

异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点。

协议B:

内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了远程节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。

协议C:

同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽

一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议。

Heartbeat

H eartbeat简介

Heartbeat是Linux-HA工程的一个组件,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用,这里分析的是2007年1月18日发布的版本2.0.8。

随着Linux在关键行业应用的逐渐增多,它必将提供一些原来由IBMSUN这样的大型商业公司所提供的服务,这些商业公司所提供的服务都有一个关键特性,就是高可用集群。

heartbeat工作原理

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


高可用集群

高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在Linux-HA里这个功能由一个叫做heartbeat的程序完成。


环境描述

CentOS6.6-x86_64

192.168.200.101

server1

DRBDheartbeatmysql

CentOS6.6-x86_64

192.168.200.102

server2

DRBD、heartbeat、mysql


配置过程

安装前准备配置:


所有主机需要添加一块20G的SCSI接口硬盘

[root@localhost ~]#serviceiptables stop

[root@localhost ~]#setenforce 0

 

主从都要配置,分区不需要格式化

[root@localhost ~]#fdisk /dev/sdb

Command (m for help): n

Command action

e   extended

p   primary partition (1-4)

P

Partition number (1-4): 1

Last cylinder, +cylindersor +size{K,M,G} (1-2610, default 2610):+10G

Command (m for help): w

[root@server1 ~]# partprobe /dev/sdb

 

从主机改为server2

[root@localhost ~]# vim /etc/sysconfig/network

2 HOSTNAME=server1

[root@localhost ~]# hostnameserver1

[root@localhost ~]# bash

 

[root@server1 ~]# vim /etc/hosts

3192.168.200.101server1

4192.168.200.102server2


Heartbeat安装

主从都需要安装

[root@server1 ~]# yum -y install perl-TimeDate cluster-glue-libs kernel-develkernel-headers flex

[root@server1 ~]# rpm -ivh cluster-glue-1.0.5-6.el6.x86_64.rpm

[root@server1 ~]# yum -y install heartbeat


安装配置DRBD:

主从都需要安装

[root@server1 ~]#wgethttp://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz

[root@server1 ~]# tar xf drbd-8.4.3.tar.gz

[root@server1 ~]# cd drbd-8.4.3

[root@server1 drbd-8.4.3]#./configure --prefix=/usr/local/drbd --with-km--with-heartbeat

[root@server1 drbd-8.4.3]#make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/&&make && make install

[root@server1 drbd-8.4.3]#mkdir -p /usr/local/drbd/var/run/drbd

[root@server1 drbd-8.4.3]#cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/

[root@server1 drbd-8.4.3]#chkconfig --add drbd

[root@server1 drbd-8.4.3]#cddrbd

[root@server1drbd]# make clean

[root@server1drbd]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/

[root@server1drbd]# cpdrbd.ko /lib/modules/2.6.32-504.el6.x86_64/kernel/lib/

[root@server1drbd]# depmod

[root@server1drbd]# cp -R /usr/local/drbd/etc/ha.d/resource.d/*/etc/ha.d/resource.d/

[root@server1drbd]#cd /usr/local/drbd/etc/drbd.d/

[root@server1drbd]#cat /usr/local/drbd/etc/drbd.conf

# You can find an examplein /usr/share/doc/drbd.../drbd.conf.example

 

include"drbd.d/global_common.conf";    

include"drbd.d/*.res";               //此目录下所有以.res结尾的都为资源文件


配置global_common.conf文件(主从一致)

[root@server1 drbd.d]# pwd

/usr/local/drbd/etc/drbd.d

[root@server1 drbd.d]#cpglobal_common.conf{,-$(date +%s)}

[root@server1drbd.d]# vimglobal_common.conf

global {

    usage-count yes;        //是否对使用信息作统计,默认为yes

}

common {

startup {

wfc-timeout 120;       //等待连接的超时时间

degr-wfc-timeout 120;

}

disk {

    on-io-error detach;    //当IO出现错误时执行的动作

}

net {

    protocol C;            //复制模式为第3种

}

}

配置资源文件(主从一致)

[root@server1drbd.d]# vim r0.res

resource r0 {                         //r0资源名称

onserver1 {

                  device      /dev/drbd0;          //逻辑设备路径

                  disk  /dev/sdb1;                 //物理设备

                  address    192.168.200.101:7788;   //主节点

meta-disk internal;

        }

onserver2 {

device      /dev/drbd0;

disk  /dev/sdb1;

                  address    192.168.200.102:7788;      //备节点

meta-disk internal;

        }

}

 

[root@server1 drbd.d]#scpglobal_common.conf r0.res 192.168.200.102:/usr/local/drbd/etc/drbd.d


创建元数据(两个节点上操作)

[root@server1drbd.d]# modprobedrbd

[root@server1 drbd.d]#lsmod | grep drbd

drbd                  310268  0

libcrc32c               1246  1drbd

 

[root@server1drbd.d]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1

[root@server1drbd.d]# drbdadm create-md r0 //输出以下信息

The server's response is:

 

you are the 57184th userto install this version

Writing meta data...

initializing activity log

NOT initializing bitmap

New drbdmeta data blocksuccessfully created. //当输出成功信息后可Ctrl+C结束

 

注意:

当执行命令”drbdadm create-md r0”时,出现以下错误信息。

Device size would be truncated, which

would corrupt data and result in

'access beyond end of device' errors.

You need to either

 * use external meta data (recommended)

 * shrink that filesystem first

 * zero out the device (destroy the filesystem)

Operation refused.

Command 'drbdmeta 0 v08 /dev/xvdb internal create-md'terminated with exit code 40

drbdadm create-md r0: exited with code 40

解决办法:初始化磁盘文件格式, dd if=/dev/zero bs=1M count=1of=/dev/sdb1; sync


启动DRBD(主从节点都要执行)

[root@server1drbd.d]# /etc/init.d/drbd start

Starting DRBD resources: [

create res: r0

prepare disk: r0

adjust disk: r0

adjust net: r0

]

........

[root@server1drbd.d]# netstat -anpt | grep 7788

tcp        0     0 192.168.200.101:35654         192.168.200.102:7788          ESTABLISHED -                  

tcp        0     0 192.168.200.101:7788          192.168.200.102:33034         ESTABLISHED - 

 

[root@server2 drbd.d]#netstat -anpt | grep 7788

tcp        0     0 192.168.200.102:7788       192.168.200.101:48501      ESTABLISHED -                  

tcp        0     0 192.168.200.102:10354      192.168.200.101:7788       ESTABLISHED -


手动验证主从切换:

初始化网络磁盘(主节点上执行)

[root@server1drbd.d]#drbdadm -- --overwrite-data-of-peer primary r0

[root@server1drbd.d]# cat /proc/drbd

version: 8.4.3(api:1/proto:86-101)

GIT-hash:89a294209144b68adb3ee85a73221f964d3ee515 build by root@bogon, 2016-12-0413:39:22

 0: cs:SyncSourcero:Primary/Secondaryds:UpToDate/Inconsistent C r-----

    ns:116024 nr:0 dw:0 dr:123552 al:0 bm:7lo:0 pe:1 ua:7 ap:0 ep:1 wo:f oos:10374340

         [>....................] sync'ed:  1.2% (10128/

 

数据同步测试(主节点上操作前6步骤,次节点上操作后三步骤)

[root@server1drbd.d]# mkfs.ext4 /dev/drbd0

[root@server1drbd.d]# mkdir /mysqldata

[root@server1drbd.d]# mount /dev/drbd0 /mysqldata

[root@server1drbd.d]# echowww.crushlinux.com> /mysqldata/file    //建立测试文件

[root@server1 ~]# umount /dev/drbd0

[root@server1 ~]# drbdadm secondary r0 //主降为次

 

[root@server2drbd.d]# drbdadm primary r0 //次升为主

[root@server2 drbd.d]#mkdir /mysqldata

[root@server2drbd.d]# mount /dev/drbd0 /mysqldata

[root@server2drbd.d]# ls /mysqldata     //在备节点上查看数据

file  lost+found                  //可以看到创建的文件


安装mysql

更改Mysql数据库的存储位置为共享目录(主从都要执行)

[root@server1 ~]# yum -yinstall mysqlmysql-server

[root@server1 ~]# vim/etc/my.cnf

2 datadir=/mysqldata/mysql

[root@server1 ~]# chown -Rmysql.mysql /mysqldata

[root@server1~]#chkconfigmysqld on

 

注意:此时我们修改了数据目录和其属主和权限,有时会因为此操作导致数据库无法启动,解决方法:

一,查看你的selinux是否处于打开状态,将其关闭。

二,/etc/apparmor.d/usr.sbin.mysqld文件中,有两行内容规定了mysql使用数据文件的路径权限,改掉即可,重启/etc/init.d/apparmor restart。

 

进行数据库测试

因为此前的操作,现在把server2节点降为次

[root@server2 ~]#umount /dev/drbd0

[root@server2 ~]# drbdadm secondary r0

把server1升为主节点

[root@server1 ~]# drbdadm primary r0

[root@server1 ~]# mount /dev/drbd0 /mysqldata

[root@server1 ~]#/etc/init.d/mysqld start

在server1上创建一个库crushlinux,然后主降为备,把server2升为主查看库有没有同步。

[root@server1 ~]# mysql

mysql> create databasecrushlinux;

Query OK, 1 row affected(0.00 sec)

mysql> exit

Bye

 

[root@server1 ~]# service mysqld stop       //server1的操作

[root@server1 ~]# umount /dev/drbd0         //server1的操作

[root@server1 ~]# drbdadm secondary r0       //server1的操作

 

[root@server2drbd.d]#drbdadm primary r0   //server2的操作

[root@server2drbd.d]# mount /dev/drbd0 /mysqldata   //server2的操作

[root@server2drbd.d]# service mysqld start         //server2的操作

[root@server2drbd.d]# ls /mysqldata/mysql/         //server2的操作

crushlinux  ibdata1 ib_logfile0  ib_logfile1  mysql test  


配置heartbeat:
配置ha.cf文件(主从大体一致)

[root@server1 ~]# cd /usr/share/doc/heartbeat-3.0.4/

[root@server1heartbeat-3.0.4]# cp ha.cf authkeysharesources/etc/ha.d/

[root@server1heartbeat-3.0.4]# cd /etc/ha.d/

[root@server1ha.d]# vim ha.cf

29logfile /var/log/ha-log

34logfacility     local0

48keepalive 2                       //多长时间检测一次

56deadtime 10                      //连续多长时间联系不上后认为对方挂掉(秒)

61warntime 5                       //连续多长时间联系不上开始警告提示

71initdead 100                      //主要是给重启后预留的一段忽略时间

76udpport 694                      //UDP端口

121ucast eth0192.168.200.102         //填写对方IP(主从的差异点)

157auto_failback on                 //节点修复后是否切换回来

211 node    server1                 //节点名称

212 node    server2                 //节点名称

253 respawn hacluster/usr/lib64/heartbeat/ipfail    //控制IP切换的程序


配置haresources文件(主从一致)

[root@server1ha.d]# vimharesources

server1IPaddr::192.168.200.254/24/eth0:0drbddisk::r0   Filesystem::/dev/drbd0::/mysqldata::ext4        mysqld

[root@server1ha.d]# ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysqld


配置authkeys文件(主从一致)

[root@server1ha.d]# vimauthkeys

23auth 1

24 1 crc

[root@server1ha.d]# chmod 600 authkeys


HA验证:

主从节点启动heartbeat

[root@server1ha.d]# service heartbeat start

 

查看主节点VIP是否存在

[root@server1ha.d]#ip a       //需要等待10

inet192.168.200.254/24 brd192.168.200.255 scope global secondary eth0:0

 

验证:先停掉server1上的heartbeat服务,查看VIP是否能转移

此时server2的mysql服务是关闭的

[root@server2ha.d]# mysqladmin -uroot ping   //备节点操作

mysqladmin: connect toserver at 'localhost' failed

error: 'Can't connect tolocal MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'

Check that mysqld isrunning and that the socket: '/var/lib/mysql/mysql.sock' exists!

 

[root@server1ha.d]# service heartbeat stop   //主节点操作

Stopping High-Availabilityservices: Done.

 

[root@server2ha.d]#ip a            //备节点操作

inet 192.168.200.254/24brd 192.168.0.255 scope global secondary eth0:0

[root@server2ha.d]# mysqladmin -uroot ping    //备节点操作,发现mysql随之启动

Mysqld is alive

 

 

 

此时还不具备停掉mysql后VIP漂移的功能,需要添加脚本实现,当发现mysql服务出现挂掉,就停掉heartbeat服务,实现VIP转移(双方都要在后台执行)

[root@server1 ~]# vimchk_mysql.sh

#!/bin/bash

mysql="/etc/init.d/mysqld"

mysqlpid=$(ps -C mysqld--no-header | wc -l)

if [ $mysqlpid -eq 0];then

        $mysql start

sleep 3

mysqlpid=$(ps -C mysqld--no-header | wc -l)

if [ $mysqlpid -eq 0];then

                /etc/init.d/heartbeat stop

echo "heartbeatstopped,please check your mysql !" | tee -a /var/log/messages

fi

fi

 

[root@server1 ha.d]# bashchk_mysql.sh &

[root@server1 ha.d]# echo“bash chk_mysql.sh &” >> /etc/rc.local


转载文件请保留文件出处    http://blog.csdn.net/kucione/article/details/73350518










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kuciwj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值