DRBD实现原理图
![aa](http://blog.yunvi.com/wp-content/uploads/2011/08/aa.jpg)
DRBD(Distributed Replicated Block Device),分布式复制块设备,是一种通过TCP/IP网络实现块设备数据实时镜像的方案。利用这种方案,单一主节点模式(single primary mode)双机系统能够实时地将业务数据保存在主备节点的磁盘中,正常情况下两个节点的数据是一模一样的。
HeartBeat在此是用来做热备切换的,两节点间通过心跳线连接,如果主节点死机的话,可以通过HA将DRBD快速切换到另外一个节点,同时抢占虚拟IP,并启动MySQL,对MySQL客户端来说,只有很短时间的中断。此模式能有效提高MySQL的可用性。
安装环境:
mysql 1 /dev/sdb 10G
mysql 2 /dev/sdb 10G
安装的软件包:
Drbd kmod-drbd heartbeat
Mysql : http:#mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.5/mysql-5.5.15.tar.gz
网络环境:
mysql1 192.168.72.40
mysql 2 192.168.72.50
vip 192.168.72.102
开始安装:
1.设置各个机器中hosts记录
192.168.72.40 mysql1
192.168.72.50 mysql2
2.关闭iptables selinux
service iptables stop
sestatus
SELinux status: disabled SELinux status: disabled
3.格式化分区(/dev/sdb在mysql1 和mysql2都格式化)
fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 1305.
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)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1305, default 1305):
Using default value 1305
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
使刚才的partition table 变更生效
Partprobe
4.安装mysql 5.5.15
tar zxf mysql-5.5.15.tar.gz
groupadd mysql
useradd -g mysql mysql -s /sbin/nologin
mkdir /usr/local/webserver/mysql
mkdir /data/mysql
cd mysql-5.5.15
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql -DMYSQL_DATADIR=/data/mysql/ -DSYSCONFDIR=/etc/ -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_DEBUG=0
make ;make install 2>>$log
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
echo "start install mysql_db"
/usr/local/webserver/mysql/scripts/mysql_install_db --basedir=/usr/local/webserver/mysql/ --datadir=/data/mysql/ --user=mysql
/usr/local/webserver/mysql/bin/mysqladmin -u root password $mysqlpassword
chown -R mysql /data/mysql
chgrp -R mysql /usr/local/webserver/mysql/
ln -s /usr/local/webserver/mysql/bin/mysql /usr/bin/mysql
ln -s /usr/local/webserver/mysql/bin/mysqldump /usr/bin/mysqldump
ln -s /usr/local/webserver/mysql/bin/myisamchk /usr/bin/myisamchk
/etc/init.d/mysqld start
5.安装DRBD
yum install drbd83 kmod-drbd83
6.配置drbd.conf
cp /etc/drbd.d/global_common.conf /etc/drbd.conf #复制drbd配置文件到/etc下
cat /etc/drbd.conf #编辑配置文件,2个主机上的内容一样
global {
# minor-count dialog-refresh disable-ip-verification
usage-count no; #统计drbd的使用
}
common {
syncer { rate 100M; } #同步速率,视带宽而定
}
resource r0 { #创建一个资源,名字叫”r0”
protocol C; #选择的是drbd的C 协议(数据同步协议,C为收到数据并写入后返回,确认成功)
handlers { #默认drbd的库文件
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; 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";
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
wfc-timeout 10;
degr-wfc-timeout 120; #
}
disk {
# on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes
# no-disk-drain no-md-flushes max-bio-bvecs
on-io-error detach;
size 10G; #由于实验环境下两台服务器硬盘大小可能不同,所以需要设置drbd的大小。
}
net {
# sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers
# max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret
# after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
max-buffers 2048;
cram-hmac-alg "sha1";
shared-secret "root123";
#allow-two-primaries;
}
syncer {
rate 100M;
# rate after al-extents use-rle cpu-mask verify-alg csums-alg
}
on mysql1 { #设定一个节点,分别以各自的主机名命名
device /dev/drbd0; #设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb1
disk /dev/sdb1;
address 192.168.72.40:7788; #设定监听地址以及端口
meta-disk internal;
}
on mysql2 { #设定一个节点,分别以各自的主机名命名
device /dev/drbd0; #设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb1
disk /dev/sdb1;
address 192.168.72.50:7788; #设定监听地址以及端口
meta-disk internal;
}
}
7.启动DRBD
a.在mysql1和mysql2上创建drbd记录信息的数据块
/sbin/drbdadm create-md r0 或者
/sbin/drbdadm create-md all
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
b.在各个节点都启动drbd服务
/etc/ini.d/drbd start 或者
Service drbd start
ps aux | grep drbd
root 3758 14.5 0.0 0 0 ? S 15:56 0:20 [drbd0_worker]
root 3762 9.6 0.0 0 0 ? S 15:56 0:13 [drbd0_receiver]
root 3787 2.4 0.0 0 0 ? S 15:56 0:03 [drbd0_asender]
root 3794 0.0 0.2 644 128 pts/0 R+ 15:58 0:00 grep drbd
可以看到两个节点的进程都起来了,每个drbd设备会有三个进程:drbd0_worker是drbd0的主要进城,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。
c.查看2个节点的状态:
cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:6291456
d.设置 主节点
/sbin/drbdsetup /dev/drbd0 primary –o 或者
/sbin/drbdadm –overwrite-data-of-peer primary all
第一次执行完命令后,以后设置主节点可以使用另一个命令
/sbin/drbdadm primary r0 或者
/sbin/drbdadm primary all
e.第一次同步完完成后,对drbd的设备文件进行格式化
mkfs.ext3 /dev/drbd0
然后把文件系统挂在到目录上
mount /dev/drb0 /data/mysql
f.在主节点进行数据测试写入
cd /data/mysql
touch a b c d
g.首先umount 挂载点,再降级
umount /data/mysql
drbdadm secondary r0 或者 drbdadm secondary all
把primary降级前,一定要先umount设备才行。然后提升secondary:
在备用节点上 提升secondary
drbdsetup /dev/drbd0 primary -o 或者
drbdadm –overwrite-data-of-peer primary all 这个是第一次使用都必须要设置这个,等以后就可以用下面的命令进行正常切换了
drbdadm primary all
mount /dev/darb0 /data/mysql
去/data/mysql目录下看看 有没有 a b c d 四个文件
ls
-rw-r--r-- 1 root root 0 Aug 24 08:33 a
-rw-r--r-- 1 root root 0 Aug 24 08:33 b
-rw-r--r-- 1 root root 0 Aug 24 08:33 c
-rw-r--r-- 1 root root 0 Aug 24 08:33 d
有这个表示切换成功。
整合heartbeat 和 drbd
yum -y install heartbeat heartbeat-ldirectord heartbeat-pils heartbeat-stonith heartbeat-devel #安装heartbeat 和 开发库
cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/ha.cf #拷贝配置文件
cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
cp /usr/share/doc/jeartbeat-2.1.3/authkeys /etc/ha.d/authkeys
修改ha.cf 如下:
grep -v ^# /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth0 # Linux
ucast eth0 192.168.72.50 #在备用节点是 192.168.72.40
auto_failback on
node mysql1
node mysql2
ping_group group1 192.168.72.40 192.168.72.50
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root
配置authkeys认证
grep -v ^# /etc/ha.d/authkeys
auth 3
3 md5 root123!
chmod 600 /etc/ha.d/authkeys #authkeys 的权限要是 600
配置haresources资源文件:
[root@mysql1~]# grep -v ^# /etc/ha.d/haresources
Mysql1 IPaddr::192.168.72.102/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/data/mysql::ext3 mysql
设定Heartbeat 服务设定档- mysql
vi /etc/ha.d/resource.d/mysql
#!/bin/bash
. /etc/ha.d/shellfuncs
case "$1" in
start)
res=`/etc/init.d/mysqld start`
ret=$?
ha_log $res
exit $ret
;;
stop)
res=`/etc/init.d/mysqld stop`
ret=$?
ha_log $res
exit $ret
;;
status)
if [[ `ps -ef | grep '[m]ysqld'` > 1 ]]; then
echo "running"
else
echo "stopped"
fi
;;
*)
echo "Usage: mysqld {start|stop|status}"
exit 1
;;
esac
exit 0
chmod 755 /etc/ha.d/resource.d/mysql
HA配置完毕,如果你是64位的系统,首先要建立一个符号链接,64位ha的库文件在lib64,会提示找不到/usr/lib/heartbeat
mkdir /usr/lib/heartbeat
ln -s /usr/lib64/heartbeat/ipfail /usr/lib/heartbeat/
在2个节点分别启动HA
service heartbeat start
Starting High-Availability services:
2011/08/24_06:10:43 INFO: Resource is stopped
[ OK ]
测试HA 机制
在测试HA机制时你可使用下列指令来即时(每1 秒更新) 观察DRBD 的Primary/Secondary 状态在测试HA 机制时您可使用下列指令来即时(每1 秒更新) 观察DRBD 的Primary/Secondary 状态
watch -n 1 service drbd status watch -n 1 service drbd status
测试1.手动切换Node
要手动切换Node 只要在Primary Node 上將heartbeat 服务停止即可,當原來的Primary Node 的heartbeat 服务再次启动后并不会將主机后会(因为ha.cf 设定当中auto_failback 为off),若你在ha.cf 设定当中auto_failback 为on 则当原来的Primary Node (现在为Secondary Node) 的Heartbeat 服务再次启动后会將主机抢回。要手动切换Node 只要在Primary Node 上将heartbeat 服务停止即可,当原来的Primary Node 的heartbeat 服务再次启动后并不会将主权抢回(因为ha.cf 设定档中auto_failback 为off),若你在ha.cf 设定档中auto_failback 为on 则当原来的Primary Node (现在为Secondary Node) 的Heartbeat 服务再次启动后会将主权抢回。
Primary Node 为mysql1 主机,执行heartbeat 服务重新启动Primary Node为mysql1主机,执行heartbeat服务重新启动
[root@mysql1 ~]#service heartbeat restart
Stopping High-Availability services:
[ OK ]
Waiting to allow resource takeover to complete:
[ OK ]
Starting High-Availability services: Starting High-Availability services:
2011/08/24_06:16:09 INFO: Resource is stopped
[ OK ]
当上述指令执行时你会看到Node1 主机中DRBD 状态变化为Primary/Secondary >> Secondary/Secondary >> Secondary/Primary,当上述指令执行完成后状态如下当上述指令执行时你会看到mysql1 主机中DRBD 状态变化为Primary/Secondary >> Secondary/Secondary >> Secondary/Primary,当上述指令执行完成后状态如下
[root@mysql1 ~]#service drbd status
drbd driver loaded OK device status: version: 8.3.8 (api:88/proto:86-94) version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16 GIT-hash:
m:res cs ro ds p mounted fstype m:res cs ro ds p mounted fstype
0:ha Connected Secondary/Primary UpToDate/UpToDate C 0:ha Connected Secondary/Primary UpToDate/UpToDate C
此时在Mysql2 主机你可看到接手Primary Node 角色(挂载/dev/drbd0 至/db、接手mysqld 服务、启动Cluster IP192.168.72.102 及网卡eth0:0)此时在mysql2主机您可看到接手Primary mysql1角色(挂载/dev/drbd0 至/db、接手mysqld 服务、启动VIP 192.168.72.102 及网卡eth0:0)
[root@mysql2 ~]#service drbd status #接手/dev/drbd0
drbd driver loaded OK; device status: version: 8.3.8 (api:88/proto:86-94) version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16 GIT-hash:
m:res cs ro ds p mounted fstype m:res cs ro ds p mounted fstype
0:ha Connected Primary/Secondary UpToDate/UpToDate C /db ext3
[root@mysql2 ~]# service mysqld status #接手mysqld 服务mysqld (pid 10101) is running...
[root@mysql2 ~]# ifconfig eth0:0 #接手VIP
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:7F:6A:81
inet addr:192.168.72.102 Bcast:192.168.72.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Base address:0x2000 Memory:d8920000-d8940000測試2.當主机網路斷線测试2当主机网路断线。
模拟当鏁网路断线时是否会自动切换节点,您可将插在eth0的网路线的拔掉或在主节点上执行ifdown你eth0的指令去关闭eth0的网卡来进行节点切换测试。模拟当鏁网路断线时是否会自动切换节点,您可将插在eth0的网路线的拔掉或在主节点上执行ifdown你eth0的指令去关闭eth0的网卡来进行节点切换测试。
拔除eth0的上的网路线的或执行ifdown你eth0的指令来关闭网卡连线拔除eth0的上的网路线的或执行ifdown你eth0的指令来关闭网卡连线
主节点切换为辅助节点,而原辅助节点接手为主要节点的主节点切换为辅助节点,而原辅助节点接手为主要节点
测试3。当网卡及交换器损坏测试3。当网卡及交换器损坏
正确的开机/关机流程正确的开机/关机流程
服务来达成切换节点服务来达成切换节点
正确开机流程正确开机流程
当二台节点主机都关机而预设Node1上为主要节点的情况下,正确的开机流程为:当鏁二台节点主机都关机而预设mysql1为主要节点的情况下,正确的开机流程为:
在Node1主机电源的功率在mysql1主机
过约1分钟后再Mysql2上电源主机返回约1分钟后再mysql2电源主机
当Node1上主机开机流程运作到DRBD的程序时会等待60秒(等待辅助节点的回应),在数秒期间Mysql2上主机开机流程也运作到DRBD的程序时会去找Node1上主机进行沟通当鏁mysql1主机开机流程运作到DRBD的程序时会等待60秒(等待辅助节点的回应),在数秒期间mysql2主机开机流程也运作到DRBD的程序时会去找mysql1主机进行沟通
Node1上顺利开机完成,Mysql2上也开机完成mysql1顺利开机完成,mysql2也开机完成
登入节点1,节点2主机查看DRBD的状态及相关资讯(挂载/ dev/drbd0至/ DB,接手的mysqld服务,启动“群集IP192.168.72.102及网卡eth0的:0)登入mysql1,mysql2主机查看DRBD的状态及相关资讯(挂载/ dev/drbd0至/数据/ MySQL的,接手的mysqld服务,启动贵宾192.168.72.102及网卡eth0的:0)
正确关机流程正确关机流程
当遇到不可抗力因素必须要二台主机都关机且Node1上为主节点为主节点的情况下,正确的关机流程为:
在Node1上主机执行服务心跳停止时,指令将心跳服务关闭在mysql1主机执行服务,心跳停止时,指令将心跳服务关闭
确认Mysql2上主机接手成为主节点且相关服务运作正常确认mysql2主机接手成为主节点且相关服务运作正常
将Node1上主机关机(此时在Mysql2上主机看到的DRBD的状态为小学/未知)将mysql1主机关机(此时在Mysql2主机看到的DRBD的状态为小学/未知)
在Mysql2上主机上执行服务的mysqld停止指令将MySQL的服务关闭在mysql2主机上执行服务的mysqld停止指令将MySQL的服务关闭
MySQL的服务关闭完成后即可将Mysql2上主机关机MySQL的服务关闭完成后即可将mysql2主机关机
之后开机时再遵照上述的正确开机流程步骤即可顺利让集群
移机设定流程移机设定流程
因为出现不同的设定需求(加装网卡所以要设定网卡为键合模式,更换的IP模式,更换的IP
先将节点1,节点2开机启动DRBD,心跳服务关闭先将Mysql1,Mysql2开机启动DRBD,心跳服务关闭
于Node1上主机将心跳服务停止,确认Mysql2上主机接手医管局服务后即可将Node1上主机关机于Mysql1主机将心跳服务停止,确认Mysql2主机接手医管局服务后即可将Mysql1主机关机
于Mysql2上主机将mysqld的服务停止后即可关机于Mysql2主机将mysqld的服务停止后即可关机
将节点1,节点2服务所以没有开机顺序的问题将Mysql1,Mysql2服务所以没有开机顺序的问题
开机完成后设定节点1,节点2的网卡键合模式及修改的IP地址并测试容错机制是否运作开机完成后设定Mysql1,Mysql2的网卡键合模式及修改的IP地址并测试容错机制是否运作
修改DRBD,心跳相关设定档内容(IP地址)修改DRBD,心跳相关设定档内容(IP地址)
将节点1,节点2开机启动DRBD,心跳服务启用后先将Node1上重新开机约1分钟后再将Mysql2上重新开机将Mysql1,Mysql2开机启动DRBD,心跳服务启用后先将Mysql1重新开机约1分钟后再将Mysql2重新开机
开机完成后确定房委会机制是否运作并测试房委会机制开机完成后确定房委会机制是否运作并测试房委会机制
完成改设定及移机要求
1).DRBD协议(A B C)
协议说明
A 数据一旦写入磁盘并发送到网络中就认为完成了写入操作.
B 收到接收确认就认为完成了写入操作.
C 收到写入确认就认为完成了写入操作.
2).drbd设备的三个进程
每个drbd设备会有三个进程:
drbd0_worker是drbd0的主要进城,
drbd0_asender是primary上drbd0的数据发送进程,
drbd0_receiver是secondary上drbd0的数据接收进程
DRDB的一些常规操作:
切换主从节点前,要注意umount
主从切换: drbdadm primary all, drbdadm secondary all
节点间连接:drbdadm connect|disconnect all
DRBD脑裂后的处理:
脑裂后,两个节点间数据不同步,主从关系失效,需要按下面的步骤修复:
a.在从节点如下操作:
# drbdadm secondary r0
# drbdadm -- --discard-my-data connect r0
b.在主节点上,通过watch -n 1 cat /proc/drbd查看状态,如果不是WFConnection状态,需要再手动连接:
# drbdadm connect r0
DRBD的状态
通过cat /proc/drbd,或service drbd status可查看当前节点DRBD的状态,下面是其中一些简写的说明:
引用
Field 说明 值:
cs 连接状态 出现的值:
o Unconfigured:设备在等待配置。
o Unconnected:连接模块时的过渡状态。
o WFConnection:设备等待另一测的配置。
o WFReportParams:过渡状态,等待新TCP 连接的第一个数据包时。.
o SyncingAll:正将主节点的所有模块复制到次级节点上。.
o SyncingQuick:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。
o Connected:一切正常。
o Timeout:过渡状态。
st 状态(设备的作用) 可能的值为:
o 本地/远程一级状态
o 二级状态
o 未知(这不是一种作用)
ns 网络发送 模块号码
nr 网络接收 模块号码
dw 磁盘写入 模块号码
DR 磁盘读取 模块号码
of 运行中(过时的)模块号码
pe 待解决的 模块号码
ua 未答复的 模块号码(最好为0)
首次安装尚未出现错误,比较万幸!本文介绍到此安装完毕!以后会做详细归档,请大家关注我的blog,会时时更新 。