您的位置:首页 > 运维架构 > 网站架构

Mysql+DRBD+Heartbeat 实现mysql高可用的双击热备(DRBD篇)

2014-06-13 16:36 471 查看
DRBD官方tar包下载地址: http://oss.linbit.com/drbd/
环境介绍:

系统版本:CentOS 6.4 (64位)
内核版本 2.6.32-358.el6.x86_64

软件版本:drbd-8.4.3.tar.gz

主:10.0.0.1 从:10.0.0.2

两台机器上的hosts都需要修改:
[root@localhost ~]# vim /etc/hosts
10.0.0.1 node1
10.0.0.2 node2

两台服务器双网卡,其中10.0.0.x的网卡用于传输drbd数据,两台服务器网线直连,用做传输心跳线。

****为了方便实验,两台机器都各自加一块15G的硬盘,用过来做DRBD存储盘 (两台机器都需要此操作)

对新添加的硬盘进行分区:
#fdisk /dev/sdb //准备为 sdb 建立分区

The number of cylinders for this disk is set to 20805.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n //键入 n 表示要建立分区
Command action
e extended
p primary partition (1-4)
p //键入 p 表示建立主要分区
Partition number (1-4): 1 //键入 1 为此主要分区代号
First cylinder (1-20805, default 1): //开始磁柱值,按下 enter 即可
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
Using default value 20805
Command (m for help): w //键入 w 表示确定执行刚才设定
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

[root@node1 ~]# partprobe //使刚才的 partition table 变更生效
######不需要进行分区格式化!

编译安装drbd-8.4.3 :

[root@node1 soft]# tar zxf drbd-8.4.3.tar.gz
[root@node1 soft]# cd drbd-8.4.3
[root@node1 soft]# mkdir /usr/local/drbd/
[root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km 注意:--with-km是启用内核模块
[root@node1 ~]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/ 注意KDIR的路径 (这个内核源码路径需要根据自己的系统修改)
[root@node1 drbd-8.4.3]# make install
[root@node1 ~]# mkdir -p /usr/local/drbd/var/run/drbd

配置启动脚本以及开机自启动
[root@node1 ~]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
[root@node1 ~]# chkconfig --add drbd
[root@node1 ~]# chkconfig drbd on

拷贝DRBD模块到内核,并加载DRBD模块。
[root@node1 drbd]# cp drbd.ko /lib/modules/2.6.32-358.el6.x86_64/kernel/lib/
[root@node1 drbd]# modprobe drbd

查看模块是否加载成功
[root@node1 drbd]#lsmod |grep drbd
drbd 325626 3
libcrc32c 1246 1 drbd

添加开机自动加载drbd模块
[root@node1 drbd]#echo "modprobe drbd " >> /etc/rc.local

*********别忘了同样在node2上也进行以上步骤操作****************

********************************配置DRBD************************************
[root@node1 ~]# cd /usr/local/drbd/etc/
[root@node1 etc]# cat 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目录下以.res结尾的文件

修改全局配置文件: *****下面是笔者所用配置,为了高效配制成功,请务必保证文件各项配置一致********

[root@node1 etc]# cd drbd.d/
[root@node1 drbd.d]# cat global_common.conf
global {
usage-count no; #是否参加DRBD使用者统计,默认为yes
}

common {
syncer { rate 200M; } #设置主、备节点同步时的网络速率最大值,单位是字节
protocol C; #使用DRBD的第三种同步协议,表示收到远程主机的写入确认后,认为写入完成
handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
#fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
}

net {
cram-hmac-alg "sha1";
shared-secret "MySQL-HA"; #DRBD 同步时使用的验证方式和密码信息
}

disk {
on-io-error detach; #配置I/O错误处理策略为分离
# fencing resource-only;
}

startup {
# wfc-timeout 120;
# degr-wfc-timeout 120;
}
}

修改资源配置文件,默认没有此文件,需要手动创建: *****下面是笔者所用配置,为了高效配制成功,请务必保证文件各项配置一致********
[root@node1 ~]# vim /usr/local/drbd/etc/drbd.d/drbd.res
resource r0 { #这个r0是定义资源的名字
on node1 { #每个主机的说明以on开头,后面的名称需要与hostname、uname -n一致,其后的{}中的配置是此主机的配置
device /dev/drbd0; #drbd设备名称
disk /dev/sdb1;#/dev/drbd0使用的磁盘分区为sdb1
address 10.0.0.1:7788; #设置drbd监听地址与端口
meta-disk internal; #DRBD的元数据存放方式
}

on node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.0.2:7788;
meta-disk internal;
}
}

****************************此时,DRBD的配置文件完成!***************************

为了保证配置项一致,将两个配置文件拷贝到node2上:

[root@node1 drbd]#scp etc/drbd.d/global_common.conf etc/drbd.d/drbd.res root@10.0.0.2:/root/

切换到node2 将配置文件放到drbd目录:

[root@node2 ~]#mv drbd.res global_common.conf /usr/local/drbd/etc/drbd.d/

在node1上初始化资源
[root@node1 ~]# drbdadm create-md r0
You want me to create a v08 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/sdb1 at byte offset 16105058304
Do you really want to overwrite the existing v08 meta-data?
[need to type 'yes' to confirm] yes

Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

同样,在node2上初始化资源
[root@node2 ~]# drbdadm create-md r0

***注意:如果初始化资源报错:

Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40
这是因为sdb1已经有文件系统了,已经有数据存在了(进行下面的操作前,请保证/dev/sdb1里的数据是否备份)
解决方法:
[root@node1 ~]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1 ***注意,此处就是/dev/sdb1此硬盘,而不是他的挂载目录

请务必在两台服务器上同时启动服务:

[root@node1 ~]# service drbd start
Starting DRBD resources: [
create res: r0
prepare disk: r0
adjust disk: r0
adjust net: r0
]
......
[root@node2 ~]# service drbd start

查看drbd监听端口:
[root@node2 ~]# netstat -anptul |grep 7788
tcp 0 0 10.0.0.2:50569 10.0.0.1:7788 ESTABLISHED -
tcp 0 0 10.0.0.2:7788 10.0.0.1:39663 ESTABLISHED -

********************************设置DRBD主、备节点***************************************

注意:第一次启动drbd时,两个drbd节点默认都处于Secondary状态:

[root@node1 ~]# drbdadm role r0 #查看r0主、备节点的命令
Secondary/Secondary

由于默认没有主备节点之分,因而需要设置两个主机的主备节点,选择需要设置为主节点的主机,然后执行如下命令:

[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary all

第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令:

drbdadm primary all

查看资源的连接状态:

[root@node1 ~]# drbdadm cstate r0
SyncSource

资源连接状态可能有以下状态中的一种:

StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点建立网络连接
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态
StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS
StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行

查看资源角色的命令:

[root@node1 ~]# drbdadm role r0

Primary/Secondary (在前面为当前节点)

Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上
Secondary 备:资源目前为备,正常接收对等节点的更新
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态

查看硬盘状态:

[root@node1 ~]# drbdadm dstate r0

UpToDate/UpToDate

本地和对等节点的硬盘有可能为下列状态之一:
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,但是已经过时
DUnknown:当对等节点网络连接不可用时出现这种状态
Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态

查看同步进度:

[root@node1 ~]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:24 nr:16108076 dw:16108100 dr:1017 al:2 bm:960 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

【注】:
从输出的”ds“ 信息得知,磁盘状态都是“UpToDate”,表示数据同步已经完成了
ro是角色信息,Primary/Secondary 说明了当前主机是primary主节点,另一台是secondary备节点
ds是磁盘状态,显示数据是否一致,(如果显示UpToDate/UpToDate 表明同步没有延时)
ns是网络发送的数据包,以K字节计算
dw是磁盘写信息
dr是磁盘读信息

**************************最后一步,挂载drbd0设备**************************

注意:
*****挂载DRBD分区之前,首先需要确认当前主机的DRBD分区是Primary状态,可以从"/cat/proc/drbd" 命令中查询到

[root@node1 ~]# cat /proc/drbd |grep ro
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

*****处于主状态的主机,才能进行挂载*****

格式化文件系统(文件格式根据自己的系统环境选择)

!!!!!!注意:只格式化主节点的/dev/drbd0!!!!

[root@node1 ~]# mkfs.ext4 /dev/drbd0

挂载此文件系统
[root@node1 ~]# mkdir /data
[root@node1 ~]# mount /dev/drbd0 /data/
[root@node1 ~]# df -Th
文件系统 类型 容量 已用 可用 已用%% 挂载点
/dev/sda3 ext4 11G 3.5G 6.9G 34% /
tmpfs tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 ext4 2.0G 68M 1.9G 4% /tmp
/dev/drbd0 ext4 15G 166M 14G 2% /data

**************************此时,DRBD的配置已经完成!***************************

**************************测试验证***********************************************

命题:在挂载的data目录中创建一个测试文件,然后卸载挂载目录,然后切换主备节点,在备用节点上查看刚刚建立的测试文件还是否存在

[root@node1 ~]# touch /data/test
[root@node1 ~]# umount /data/

然后将node1变为备用节点:

[root@node1 ~]# drbdadm secondary r0

[root@node1 ~]# drbdadm role r0
Secondary/Secondary

DRBD执行角色切换前,需要在主节点执行 umount 命令, 去掉对DRBD设备的挂载,然后在另一台主机上将DRBD的角色修改为”Primary“,最后再进行挂载

接着在node2上进行操作:

[root@node2 ~]# drbdadm primary all
[root@node2 ~]# mount /dev/drbd0 /data

查看文件是否存在:
[root@node2 ~]# ls /data/
lost+found test

******************************此时表明DRBD配置已成功!!!**************************

本文出自 “Fate” 博客,请务必保留此出处http://yyzll.blog.51cto.com/4283444/1426055
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: