Heartbeat+DRBD实现MySQL高可用性

DRBD是一种块设备,可以被用于高可用(HA)之中。它类似于一个网络RAID-1功能。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。

1.3 环境准备
两台主机:192.168.100.8,192.168.100.9
需要为本地主机和远程主机,指定一个DRBD使用的硬盘分区。这两个分区的大小必须相同。我们指定两台主机的/dev/sda2分区作为DRBD的使用的分区.这两个分区大小都为37G.
1.4 DRBD的安装配置
1、首先从www.drbd.org下载了源代码包(我下载的drbd-8.3.6版本的包)
2、检查主机上面有没有linux的内核源代码,如果没有,需要找到相对应版本的源代码包安装上去。
3、开始安装drbd:
1) 解压:tar -zxvf drbd-8.3.6.tar.gz
2) 进入drbd源码目录,根据kernel源码位置来编译drbd:
cd drbd-8.3.6
./configure --with-km
make KDIR=/usr/src/kernels/2.6.18-92.el5-i686/
make install
4、现在可以加载安装drbd模块了
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko
通过lsmod检查是否已经成功
#lsmod |grep drbd
如果有,则表示成功了
5、更改drbd配置文件:
cp ./scripts/drbd.conf /etc/drdb.conf
vi /etc/drbd.conf
修改resource r0下的配置
on test9 {
device /dev/drbd0;
disk /dev/sda2;
address 192.168.100.9:7788;
flexible-meta-disk internal;
}

on test8 {
device /dev/drbd0;
disk /dev/sda2;
address 192.168.100.8:7788;
meta-disk internal;
}

6、primary node设置:
1) 创建matadata:
#drbdadm create-md all
遇到错误
Found ext3 filesystem
38515836 kB data area apparently used
38514624 kB left usable by current configuration
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/sda2 internal create-md' terminated with exit code 40
drbdadm create-md r0: exited with code 40
As suggested by the error, Zero out the first part of device by running following command:


执行下面这句
# dd if=/dev/zero of=/dev/sda2 bs=1M count=128
再重新执行 # drbdadm create-md all

2) 启动drbd:
#/etc/init.d/drbd start
3) 设置为主节点:
#drbdadm primary all
4) 在新设备上面创建文件系统
#mkfs.ext3 /dev/drbd0
5) 将文件系统mount上
#mkdir /drbddata
#mount /dev/drbd0 /drbddata
7、secondary node设置:
1) 创建matadata:
#drbdadm create-md all
2) 启动drbd:
#/etc/init.d/drbd start
注意:在我的系统上drbd start的时候用modprobe不能自动加载drdb模块,
所以需要将/etc/init.d/drbd中$MODPROBE -s drdb改成
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko


 注:这里不要创建文件系统(因为这些信息都会从主节点同步过来的)。


 8、primary和secondary节点都配置完并且都启动后,开始检查配置是否成功
1) 检查进程:
a) primary :
[root@test9 /]# ps auxf |grep drbd
root 4735 0.0 0.0 3912 656 pts/0 S+ 10:31 0:00 _ grep drbd
root 3479 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_worker]
root 3491 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_receiver]
root 3503 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_asender]
b) secondary: root@test8:/>ps auxf |grep drbd
root 4543 0.0 0.0 3912 660 pts/0 S+ 10:31 0:00 _ grep drbd
root 3393 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_worker]
root 3405 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_receiver]
root 3415 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_asender]
可以看到两个节点的进程都起来了,每个drbd设备会有三个进程:drbd0_worker是drbd0的主要进城,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。
2) 查看/dev/drbd文件的输出:
[root@test9 /]# cat /proc/drbd
version: 8.3.6 (api:88/proto:86-91) GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@test9, 2009-12-11 18:47:35
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:8 nr:0 dw:4 dr:473 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0


root@test8:/>cat /proc/drbd
version: 8.3.6 (api:88/proto:86-91) GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@test8, 2009-12-11 18:14:27
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
ns:0 nr:8 dw:8 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0


输出文件上面最开始是drbd的版本信息,然后就是数据同步的一些状态信息,从mysql的文档上介绍了每一个状态的意思如下:
cs — connection state
st — node state (local/remote)
ld — local data consistency
ds — data consistency
ns — network send
nr — network receive
dw — disk write
dr — disk read
pe — pending (waiting for ack)
ua — unack’d (still need to send ack)
al — access log write count


3) 更进一步验证数据是否同步正确了:
a) 在test9上将该文件系统umount,然后执行drbdadm secondary all,改成secondary模式
[root@test9 /]# umount /drbddata
[root@test9 /]# drbdadm secondary all
b) 在原test8 执行drbdadm primary all 改成primary模式,再mount文件系统
root@test8:/>drbdadm primary all
root@test8:/>mount /dev/drbd0 /drbddata
检查之前在test9下写入的文件是否已经完全同步到test8下面,经验证,数据已经同步好了

4) 最后连同mysql一起手工测试一次切换:
a) 主节点test9下关闭mysql,释放资源,将资源切换成secondary模式:
[root@test9 ha.d]# mysqladmin -u root shutdown
[root@test9 ha.d]# umount /drbddata
[root@test9 ha.d]# drbdadm secondary all
b) 次节点test8下获取资源,mount上,切换成primary模式,并启动mysql:
root@test8:/root/mysql-5.0.51a>drbdadm primary all
root@test8:/root/mysql-5.0.51a>mount /dev/drbd0 /drbddata
root@test8:/usr/local/mysql/bin>./mysqld_safe --user=mysql & [1] 27900
root@test8:/usr/local/mysql/bin>Starting mysqld daemon with databases from /drbddata/mysqldata
root@test8:/usr/local/mysql/bin>
root@test8:/usr/local/mysql/bin>
root@test8:/usr/local/mysql/bin>tail -f /drbddata/mysqldata/test8.err
080303 13:53:25 mysqld started
080303 13:53:26 InnoDB: Started; log sequence number 0 43656
080303 13:53:26 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
Version: ‘5.0.51a-log’ socket: ‘/usr/local/mysql/sock/mysql.sock’ port: 3306 Source distribution
c) 登入数据库中检查数据,这里我同时在新的主节点上面测试了写,以便在后面切换回主节点后检查数据是否也正常:
root@test8:/usr/local/mysql/bin>mysql -u root
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| test |
+——————–+
3 rows in set (0.03 sec)
mysql> use test;
Database changed
mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| t1 |
| t2 |
| t3 |
+—————-+ 3 rows in set (0.00 sec)
mysql> create table t4(id int);
Query OK, 0 rows affected (0.07 sec)
d) 再通过之前相同的切换步骤切换回各自原来的模式,启动主节点的mysql,并检查数据: …
[root@test9 ha.d]# drbdadm primary all
[root@test9 ha.d]# mount /dev/drbd0 /drbddata
[root@test9 ha.d]# mysqld_safe --user=mysql &
[root@test9 ha.d]# mysql -uroot
mysql> use test;
Database changed
mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| t1 |
| t2 |
| t3 |
| t4 |
+—————-+ 4 rows in set (0.00 sec)
mysql> insert into t4 values(111);
Query OK, 1 row affected (0.01 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t4;
+——+
| id |
+——+
| 111 |
+——+
1 row in set (0.00 sec)

几个注意点:
1、除了primary节点的文件系统是手工创建的之外,其他的所有secondary节点的文件系统都是通过同步完成的。
2、在mount drbd的设备之前,该节点必须已经设置为primary模式,而且如果一边没有umount,另一边是无法mount上的,直接mount会报如下错误:
root@test8:/>mount /dev/drbd0 /drbddata
mount: block device /dev/drbd0 is write-protected, mounting read-only


3、DRBD也支持Dual-primary mode,不过需要GFS等集群文件系统来支持。
1.5 性能测试
测试选项:sysbench --num-threads=10 --max-requests=10000 --test=oltp \
--mysql-table-engine=innodb --oltp-table-size=1000000
 直接使用本地磁盘
OLTP test statistics:
queries performed:
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (206.65 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (3926.39 per sec.)
other operations: 20000 (413.30 per sec.)

Test execution summary:
total time: 48.3905s
total number of events: 10000
total time taken by event execution: 483.6677
per-request statistics:
min: 9.59ms
avg: 48.37ms
max: 255.62ms
approx. 95 percentile: 96.74ms

Threads fairness:
events (avg/stddev): 1000.0000/10.23
execution time (avg/stddev): 48.3668/0.01

 使用DRBD
OLTP test statistics:
queries performed:
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (174.69 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (3319.17 per sec.)
other operations: 20000 (349.39 per sec.)

Test execution summary:
total time: 57.2433s
total number of events: 10000
total time taken by event execution: 572.2720
per-request statistics:
min: 11.87ms
avg: 57.23ms
max: 342.05ms
approx. 95 percentile: 141.95ms

Threads fairness:
events (avg/stddev): 1000.0000/16.01
execution time (avg/stddev): 57.2272/0.01

由此可以看出,DRBD使MySQL性能下降15%左右。DRBD主要是对写性能有影响,对读的影响很小,所以对更新频率不高但对可用性要求很高的应用,DRBD是个很好的选择。


1.6 使用Heartbeat实现自动故障转移
1、假设服务器A,B的公网IP分别是:
A 192.168.100.9
B 192.168.100.8
集群虚IP: 192.168.100.201

2、设置服务器A,B的hostname为test9及test8,
如不是请修改/etc/sysconfig/network的HOSTNAME部分,并执行
#hostname test9 以立即生效。
在/etc/hosts加入两行:
192.168.100.10 test9
192.168.100.9 test8

4、修改服务器A,B的/etc/sysctl.conf文件,加入如下5行,并执行
#sysctl -p 以立即生效。
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2

5、以root进入服务器A、B,执行以下配置:
在/etc/init.d/heartbeat中的#!/bin/sh后插入一行:
ifconfig lo:100 192.168.100.201 netmask 255.255.255.255 up

#chkconfig heartbeat --level 35 on
#cd /etc/ha.d 进入集群配置文件目录
#vi authkeys 创建集群认证文件
auth 3
3 md5 HA_2009

#chmod 600 authkeys 必要的操作

#vi ha.cf 创建集群节点文件
logfile /var/log/ha.log
#logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 80
mcast eth0 231.231.231.232 694 1 0
##有双网卡最好做个两台机器最好做交叉线连接,eth0 改eth1
#ucast eth0 192.168.100.8 #(test9直接指向对端ip,test8的ucast eth0 192.168.100.9)
ping 192.168.100.2
auto_failback on
node test9
node test8
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

集群中有两个节点test9及test8,通过多播IP通信(主要用于超过2个节点)
ping 192.168.100.2 网关ping检测

#vi /etc/ha.d/resource.d/vip.sh 创建我们自己的集群IP切换shell脚本
#!/bin/sh
case "$4" in
 start)
  ifconfig lo:100 down
  ifconfig $1:100 $2 netmask $3 up
  ;;
 stop)
  ifconfig $1:100 down
  ifconfig lo:100 $2 netmask 255.255.255.255 up
  ;;
esac
/etc/ha.d/resource.d/SendArp 192.168.100.201/eth0 start

提供了LVS集群备用节点在回路地址监听集群虚IP以用于应用服务器。
最后一行用于更新客户机的arp中缓存的MAC地址。

#chmod +x resource.d/vip.sh

#vi /etc/ha.d/resource.d/mysql.sh 创建mysql启动停止的shell脚本
#!/bin/sh |
case "$1" in
 start)
  /drbddata/mysql-xtradb/bin/mysqld_safe --defaults-file=/drbddata/mysql-xtradb/my.cnf --user=mysql >/dev/null 2>&1 &
  ;;
 stop)
  /drbddata/mysql-xtradb/bin/mysqladmin -S/drbddata/mysql-xtradb/mysql.sock shutdown
  ;;
esac

#vi haresources 创建集群资源文件
test9 drbddisk::r0
Filesystem::/dev/drbd0::/drbddata::ext3
vip.sh::eth0::192.168.100.201::255.255.255.0
Delay::5::0
mysql.sh

在AB上分别执行service heartbeat start测试
注意查看日志/var/log/ha.log

启动完成后,test9上的mysql正常可用
mysql -h192.168.100.201 -P3308 –uroot –p
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.1.39-xtradb-log MySQL Community Server (GPL)

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>

posted @ 2011-10-28 16:41  wwh  阅读(296)  评论(0编辑  收藏  举报