标签: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
DRBD-8.4.6_Heartbeat-3.0.4_Mysql-5.6.24 高可用
标签:drbd-8.4.6 heartbeat-3.0.4 mysql-5.6.24 高可用
原文地址:http://apply.blog.51cto.com/5587536/1651607