Heartbeat+DRBD如何实现MySQL高可用性

52次阅读
没有评论

共计 9116 个字符,预计需要花费 23 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 Heartbeat+DRBD 如何实现 MySQL 高可用性,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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 改 eth2
#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 -h292.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

关于“Heartbeat+DRBD 如何实现 MySQL 高可用性”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计9116字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)