DRBD-8.4.6_Heartbeat-3.0.4_Mysql-5.6.24 高可用

1、简单拓扑图

技术分享


2、安装环境

系统环境

操作系统

CentOS 6.6最小化安装

系统位数

64

内核版本

2.6.32

软件环境

软件名称

版本

DRBD

8.4.6

drbd-utils

8.9.2

Heartbeat

3.0.4

Mysql

5.6.24

网络环境

主机名

IP地址

镜像硬盘分区

VIP:由heartbeat虚拟

10.0.0.110


Mysql_1

eth0:10.0.0.101

/dev/VG/lv_data

Mysql_2

eth0:10.0.0.102

/dev/VG/lv_data


3、部署前准备

1)约定目录

源代码存放路径:/usr/local/src

软件编译安装路径:/usr/local

Mysql数据库存放路径:/data

2)设置/etc/hosts文件添加

10.0.0.101  Mysql_1

10.0.0.102  Mysql_2

3)关闭防火墙

# /etc/rc.d/init.d/iptables stop

# chkconfig iptables off

4)关闭selinux

#setenforce 0

#sed -i ‘s/SELINUX=enforcing/#SELINUX=enforcing/g‘ /etc/selinux/config

#sed -i ‘s/SELINUXTYPE=targeted/#SELINUXTYPE=targeted/g‘ /etc/selinux/config

#sed -i ‘$a SELINUX=disabled‘ /etc/selinux/config

5)同步时间

#ntpdate time.windows.com

6)设置yum源:这里笔者选择阿里云的epel yum源,用默认yum源也可以。

#mkdir –p /etc/yum.repos.d/repo_bak

#mv /etc/yum.repos.d/* /etc/yum.repos.d/repo_bak

#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

#yum clean all

#yum makecache

4、安装部署

1)DRBD的安装部署

(1)部署前说明:从DRBD 8.4.5开始的版本发生了变化,不再和以前一样只安装DRBD软件包就可以了,笔者推测可能是从liunx 内核 2.6.33 开始DRBD模块被集成到内核中去了,所以从DRBD 8.4.5开始需要编译安装的软件为drbd和drbd-utils。drbd用于编译安装模块,drbd-utils用于管理drbd模块,并提供配置文件。

(2)DRBD的安装

官网下载:

#wget http://oss.linbit.com/drbd/8.4/drbd-8.4.6.tar.gz-P /usr/local/src/

#tar -zxf /usr/local/src/drbd-8.4.6.tar.gz -C /usr/local/src


安装依赖软件,注意:如果内核版本有变,安装kernel会更新内核,可能导致其他软件不能正常运行,如果不想更新内核,可以找与本机内核对应的软件(kernel-devel kernel-headers),安装完成后记得重启计算机(重要),否则会出错。

#yum install -y kernel kernel-devel kernel-headers gcc flex libxslt


安装成功后会出现下面目录,记下之,下面要用

#ll -d /usr/src/kernels/2.6.32-504.16.2.el6.x86_64


开始编译安装drbd,和8.4.5之前版本有所不同,这里不用./configure,直接make就可以了

# cd/usr/local/src/drbd-8.4.6

# makeKDIR=/usr/src/kernels/2.6.32-504.16.2.el6.x86_64/

#make install


编译成功模块安装位置

# drbd.ko//lib/modules/2.6.32-504.16.2.el6.x86_64/updates


加载模块

# modprobedrbd

#lsmod | grep drbd

drbd                 365803  0                看到这个加载成功

libcrc32c              1246  1 drbd


(3)drbd-utils的安装

#wget http://oss.linbit.com/drbd/drbd-utils-8.9.2.tar.gz-P /usr/local/src/

# tar-zxf /usr/local/src/drbd-utils-8.9.2.tar.gz -C /usr/local/src

# cd/usr/local/src/drbd-utils-8.9.2


开始编译安装drbd-utils,这里用了--without-83support,因为笔者安装的是8.4以上版本

#./configure --prefix=/usr/local/drbd-utils-8.9.2 --without-83support

#make

#make install


在make install过程中出现了很多下面内容,但最后echo $? 结果为0的运行中暂没发现有问题

../shared_prereqs.mk:18:  xxxxxx  No such file or directory


安装成功后drbd相关的工具(drbdadm,drbdsetup)被安装到/sbin目录下

#cp /usr/local/drbd-utils-8.9.2/etc/rc.d/init.d/drbd /etc/rc.d/init.d/

# chkconfig--add drbd

#chkconfigdrbd on


(4)设置drbd.conf配置文件

本次编译安装配置文件位置:/usr/local/drbd-utils-8.9.2/etc/drbd.conf

配置文件主要分为三个部分:global、common、resource

# cat/usr/local/drbd-utils-8.9.2/etc/drbd.conf

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

include "drbd.d/global_common.conf";

include "drbd.d/*.res";

可看到,配置文件drbd.conf的配置指向了drbd.d目下的文件

global_common.conf一般用于配置global、common,*.res用于配置resource部分

如果配置资源比较少的也可以将全部内容写到drbd.conf,当配置资源多的时候写到相应文件上更有利于管理,不容易混乱

因为本示例比较简单,所以全部写到drbd.conf下

  #include"drbd.d/global_common.conf";   注释掉

    #include "drbd.d/*.res";                注释掉

global {

 usage-count no;是否参加DRBD 使用者统计,默认参加

}

common {

 syncer { rate 200M; }  设置主用节点和备用节点同步时的网络速率最大值,单位是字节

}

resource r0 {  资源名字为r0

protocol C;使用DRBD 的第三种同步协议(A B C),大多数用C,表示收到远程主机的写入确认后认为写入完成

startup {

 wfc-timeout 120;在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。

 degr-wfc-timeout 120;也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。

  }


disk {

 on-io-error detach;策略:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作

  }


net{

 timeout 60;如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡

 connect-int 10;如果无法立即连接上远程DRBD设备,系统将断续尝试连接

 ping-int 10;如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活

 max-buffers 2048;该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。

 max-epoch-size 2048;该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好。

 cram-hmac-alg "sha1";该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。

 shared-secret "Mysql-abcD";用来设定在对待节点授权中使用的密码,最长64个字符。

  }


on Mysql_1 {  每个主机的说明以on 开头,后面是hostname

 device /dev/drbd0;drbd设备名称

 disk   /dev/VG/lv_data;/dev/drbd0使用的磁盘分区是/dev/VG/lv_data

 address 10.0.0.101:6666;设置DRBD的监听端口,用于与另一台主机通信

 meta-disk internal;DRBD的元数据存放方式

  }


on Mysql_2 {

 device /dev/drbd0;

 disk   /dev/VG/lv_data;

 address 10.0.0.102:6666;两台主机端口必须一致

 meta-disk internal;

  }

}


讲以上配置复制都两台主机相应目录下即可,更多参数说明,可以man drbd.conf

官方参考资料:

用户手册:http://drbd.linbit.com/users-guide-8.4/

语法及详解参数:http://drbd.linbit.com/users-guide-emb/re-drbdconf.html


(5)镜像硬盘设置

笔者用的LVM,分别在两台主机上创建一个5G的lv_data分区,两主机分区容量最好保持一致。怎么分区在这里就不详说了

如果用的是以使用分区,可以跳过创建分区这一步

# lvcreate-L 5G -n lv_data VG

#  mke2fs -t ext4 /dev/VG/lv_data  格式化分区

用dd写入点数据,不然可能会出错

#dd if=/dev/zero of=/dev/VG/lv_data bs=1M count=1


创建 drbd resource 名字要对应配置文件中的resource r0 参数

# drbdadmcreate-md r0

过程中会可能会出现应当问题,直接yes ,到最后出现下列信息表示成功

Newdrbd meta data block successfully created.


如果出现下列错误:

‘r0‘ not defined in your config (for this host).检查是否设置hosts文件和配置文件主机名是否一致

Exclusive open failed. Do it anyways  检查是否已经打开drbd服务,先关闭


启动两台主机的drbd服务

# /etc/rc.d/init.d/drbdstart

查看节点的状态:

# /etc/rc.d/init.d/drbdstatus 或 cat /proc/drbd

最终同步后的状态:

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

GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build byroot@Mysql_1, 2015-05-14 00:00:27

 0: cs:Connectedro:Secondary/Secondary ds:UpToDate/UpToDate C r-----

    ns:5128124 nr:0 dw:0 dr:5128124 al:0 bm:0lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

cs:表示连接状态

ro: 表示主从关系 上面的表示都为从

ds:硬盘状态信息 上面表示已经实时同步中,Inconsistent:不一致

同步成功后两台主机会创建出设备/dev/drbd0

设置主从第一次执行

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

0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate Cr-----

之后平时可以执行

drbdadmprimary all

格式化/dev/drbd0

mke2fs-t ext4 /dev/drbd0

镜像创建完成


(6)挂载并同步测试

创建数据库目录

# mkdir/data

在主节点上进行挂载

# mount/dev/drbd0 /data

测试数据同步

在主节点创建数据

# ddif=/dev/zero of=/data/test.tmp bs=1M count=200

#ll /data

-rw-r--r--1 root root 209715200 5月  14 19:51 test.tmp

停止主节点drbd服务

#/etc/rc.d/init.d/drbd stop

在从节点上进行挂载

#drbdadm primary all

# mount/dev/drbd0 /data

#ll /data

-rw-r--r--1 root root 209715200 5月  14 19:51 test.tmp


测试成功



2)Mysql的安装部署

# wgethttp://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.24.tar.gz-P /usr/local/src/

#tar –zxf /usr/local/src/mysql-5.6.24.tar.gz –C /usr/local/src


#yum install -y gcc-c++ ncurses-devel cmake


创建用户和用户组

#groupadd mysql

#useradd -g mysql mysql -s /bin/false –M


开始编译安装

# cd/usr/local/src/mysql-5.6.24

# mv/etc/my.cnf /etc/my.cnf.bak

编译参数

# cmake. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.24

-DMYSQL_UNIX_ADDR=/usr/local/mysql-5.6.24/mysql.sock

-DEXTRA_CHARSETS=all

-DDEFAULT_CHARSET=utf8

-DDEFAULT_COLLATION=utf8_general_ci

-DENABLED_LOCAL_INFILE=1

-DMYSQL_USER=mysql

-DMYSQL_TCP_PORT=3306

-DMYSQL_DATADIR=/data/mysql

-DSYSCONFDIR=/etc/

#make

#make install


设置访问权限

chown-R mysql:mysql /usr/local/mysql-5.6.24


初始数据库 主节点初始化,从节点不用

# /usr/local/mysql-5.6.24/scripts/mysql_install_db-basedir=/usr/local/mysql-5.6.24 -datadir=/data/mysql -user=mysql


设置配置文件my.cnf 主从主机配置文件一致一般数据库初始化生成次文件,如果没拷贝一份到从主机上即可

修改/usr/local/mysql-5.6.24/my.cnf

datadir=/data/mysql

basedir=/usr/local/mysql

#ln –s /usr/local/mysql-5.6.24/my.cnf /etc/my.cnf


设置启动服务

# cp/usr/local/mysql-5.6.24/support-files/mysql.server  /etc/rc.d/init.d/mysql


测试是否启动成功

# /etc/rc.d/init.d/mysqlstart

# /etc/rc.d/init.d/mysqlstatus

下面来配置heartbeat实现故障自动切换并挂载


3)heartbeat的安装部署

(1)hearteat的安装

这样笔者选择了yum安装,比较方便快捷

注意:如一开始配置了默认yum源的需要先下载三个文件

# wgethttp://mirrors.aliyun.com/epel/6/x86_64/heartbeat-3.0.4-2.el6.x86_64.rpm-P /usr/local/src/

# wgethttp://mirrors.aliyun.com/epel/6/x86_64/heartbeat-devel-3.0.4-2.el6.x86_64.rpm-P /usr/local/src/

# wget http://mirrors.aliyun.com/epel/6/x86_64/heartbeat-libs-3.0.4-2.el6.x86_64.rpm-P /usr/local/src/

然后安装heartbeat的必要组件,注意必须写一行安装不然出错

# yum-y install cluster-glue resource-agents pacemaker PyXML

#rpm -ivh heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-devel-3.0.4-2.el6.x86_64.rpmheartbeat-libs-3.0.4-2.el6.x86_64.rpm


如果选用了文章开头的epel yum 源执行下面操作

yuminstall heartbeat


(2)配置heartbeat

主备节点两端的配置文件(ha.cf authkeys haresources)完全相同

hearbeat配置文件目录为 /etc/ha.d/ 脚本存放目录:/etc/ha.d/resource.d/

cp/usr/share/doc/heartbeat-3.0.4/{authkeys,ha.cf,haresources} /etc/ha.d/

authkeys :通信认证方式,3种crc md5 sha1从左到右安全性越来越高,但消耗的资源也越多。

# vim /etc/ha.d/authkeys  这里用第一种

auth 1

1 crc

#chmod 600 /etc/ha.d/authkeys


ha.cf /etc/ha.d/ha.cf

修改部分去掉注释

logfile/var/log/ha-log   日志设置

logfacility     local0

keepalive2               心跳检测时间

ucasteth0 192.168.1.2    采用单播方式从哪个网卡接口检测对方的IP

auto_failbackon          当主节点Primary发生故障切换到Secondary后Primary恢复后是否进行切回操作

nodeMysql_1

nodeMysql_2


haresources  /etc/ha.d/haresources

添加下列行 注意:这里是一行写完的不要分两行写,不然会报错

Mysql_1    IPaddr::10.0.0.110/24/eth0 drbddisk::r0Filesystem::/dev/drbd0::/data::ext4 mysqld

解析:主主机名   设置VIP脚本::VIP::子掩码::网卡接口  设置DRBD主从脚本::resource

主节点资源挂载卸载脚本::挂载设备::要挂载的目录::挂载的文件类型  数据库启动脚本

注意:新版本heartbeat不再提供drbddisk脚本,现在由drbd-utils提供

脚本位置:/root/soft/drbd-utils-8.9.2/scripts/drbddisk


(3)调整脚本

# cp/root/soft/drbd-utils-8.9.2/scripts/drbddisk /etc/ha.d/resource.d/

# ln-s /etc/rc.d/init.d/mysql /etc/ha.d/resource.d/mysqld

(4)测试heartbeat

[root@Mysql_1~]# /etc/rc.d/init.d/heartbeat status

heartbeatOK [pid 1254 et al] is running on mysql_1 [mysql_1]...

[root@Mysql_1~] ip addr|grep eth1

  inet 10.0.0.101/24 brd 10.0.0.255 scopeglobal eth0

  inet 10.0.0.110/24 brd 10.0.0.255 scopeglobal secondary eth0:0


(5)设置开机启动DRBD HeartBeat Mysql

设置DRBD启动脚本:chkconfig: - 70 08

设置HeartBeat启动脚本:chkconfig: - 75 05

设置Mysql启动脚本:chkconfig mysql off

由于要启动HeartBeat前要先启动DRBD,本方法利用了服务的开机和关机优先值进行设置,数字越小优先权越高,这样设置可以达到先开机启动BDRB的目的,关闭先关闭HeartBeat,这个正是我们想要的。其实这里默认就可以,官方已经给我们想好了。这里mysql不启动,由HeartBeat进行控制

也可以另外写脚本来实现


5、模拟故障测试(这里就不详细演示)

(1)停掉主节点的heartheat看看是否能正常切换。

(2)启动主节点的heartbeat看看是否能正常切换回来。

(3)停掉主节点的网络或者直接将master系统shutdown,看看能否正常切换。

(4)重新启动主节点看看能否切换正常。

(5)停掉主节点上的mysql,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)。

(6)停掉主节点上的drbd,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)


本文出自 “随意” 博客,请务必保留此出处http://apply.blog.51cto.com/5587536/1651607

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。