作者:china-lg
[url=http://www.china-lg.com]http://www.china-lg.com
A(M)[192.168.33.11\192.168.43.11]->B(Backup)[192.168.33.13\192.168.43.13]->C(M/S)[192.168.33.15\192.168.43.15]->s1、s2....
公用IP:192.168.33.100
本例可实现以下功能:
一、实现mysql replication
A(M)-->C(M/S)-->s1、s2、s3....
性能:降低A服务器的负载
扩展性:可扩展到20台slave服务器。
二、实现实时备份、安全可靠功能
利用drbd(号称网络RAID)将A服务器与C服务器的数据进行实时备份
如果仅A服务器down掉了,通过heartbeatB服务器则会自动切换,变成A服务器的角色.
如果仅C服务器down掉了,则需要在B服务器上,进行手动切换,变成C服务器的角色.
如果A和C服务器都down掉了,则需要改进本例,方可解决问题.(如:再增加一台backup机器)
本例需要的软件包如下:
drbd-0.7.23-1.c4.x86_64.rpm
heartbeat-2.0.7-1.c4.x86_64.rpm
heartbeat-pils-2.0.7-1.c4.x86_64.rpm
heartbeat-stonith-2.0.7-1.c4.x86_64.rpm
kernel-module-drbd-2.6.9-42.0.10.ELsmp-0.7.23-1.el4.centos.x86_64.rpm
mysql-5.0.33.tar.gz
★1.分区:
在A、C机器分出/opt分区
在B机器上分出/opt1、/opt2分区
且大小相同/opt=/opt1=/op2
★2.安装mysql并进行mysql replication设定.
[mdbrw01 ~]#tar -zxf mysql-5.0.33.tar.gz
[mdbrw01 ~]#cd mysql-5.0.33
[mdbrw01 ~]#./configure --prefix=/usr/local/mysql --with-mysqld-ldflags=-all-static --with-mysqld-user=mysql --with-charset=cp932 --with-pthread CFLAGS=-O3 CXXFLAGS=-O3 CXX=gcc
[mdbrw01 ~]#make && make install
[mdbrw01 ~]#/usr/local/mysql/bin/mysql -A -e "grant REPLICATION SLAVE on *.* to [email=slaver@]slaver@"%[/email]" Identified by"slave;FLUSH PRIVILEGES;"
[mdbrw01 ~]# /usr/local/mysql/bin/mysqladmin shutdown
[mdbrw01 ~]# mv /usr/local/mysql /opt
[mdbrw01 ~]#ln -s /opt/mysql /usr/local/mysql
replication设定比较简单,在此就不说明了.
★3.分别在A、B、C机器上安装以下软件
drbd-0.7.23-1.c4.x86_64.rpm
kernel-module-drbd-2.6.9-42.0.10.ELsmp-0.7.23-1.el4.centos.x86_64.rpm
heartbeat-pils-2.0.7-1.c4.x86_64.rpm
heartbeat-stonith-2.0.7-1.c4.x86_64.rpm
heartbeat-2.0.7-1.c4.x86_64.rpm
(请按照顺序来进行安装)
==========配置drbd===============
★4.在A服务器上
[mdbrw01 ~]#vi /etc/drbd.conf
resource r0 {
protocol C;
startup {
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
}
syncer {
rate 10M;
group 1;
al-extents 257;
}
on mdbrw01{
device /dev/drbd0;
disk /dev/sda5;
address 192.168.43.11:7788;
meta-disk internal;
}
on mdbbk01
device /dev/drbd0;
disk /dev/sda5;
address 192.168.43.13:7788;
meta-disk internal;
}
}
启动Drbd并设置为Primary
[mdbrw01 ~]# /etc/init.d/drbd start
[mdbrw01 ~]#drbdadm -- --do-what-I-say primary all
建立专用块及文件系统
[mdbrw01 ~]#mknod /dev/drbd0 b 147 0
[mdbrw01 ~]#mkfs /dev/drbd0
在B服务器上
[mdbrwbak ~]#vi /etc/drbd.conf
resource r0 {
protocol C;
startup {
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
}
syncer {
group 1;
al-extents 257;
}
on mdbrw01{
device /dev/drbd0;
disk /dev/sda5;
address 192.168.43.11:7788;
meta-disk internal;
}
on mdbbk01{
device /dev/drbd0;
disk /dev/sda5;
address 192.168.43.13:7788;
meta-disk internal;
}
}
resource r1 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
}
syncer {
rate 4M;
group 1;
}
on mdbrw02{
device /dev/drbd1;
disk /dev/sda5;
address 192.168.43.15:7789;
meta-disk internal;
}
on mdbbk01 {
device /dev/drbd1;
disk /dev/sda6;
address 192.168.43.13:7789;
meta-disk internal;
}
}
启动Drbd
[mdbrwbak ~]# /etc/init.d/drbd start
建立专用块及文件系统
[mdbrwbak ~]#mknod /dev/drbd0 b 147 0
[mdbrwbak ~]#mknod /dev/drbd1 b 147 1
在C服务器上
[mdbrw02 ~]#vi /etc/drbd.conf
resource r0 {
protocol C;
startup {
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
}
syncer {
rate 10M;
group 1;
al-extents 257;
}
on mdbrw02{
device /dev/drbd1;
disk /dev/sda5;
address 192.168.43.15:7789;
meta-disk internal;
}
on mdbbk01{
device /dev/drbd1;
disk /dev/sda6;
address 192.168.43.13:7789;
meta-disk internal;
}
}
启动Drbd并设置为Primary
[mdbrw02 ~]# /etc/init.d/drbd start
[mdbrw02 ~]#drbdadm -- --do-what-I-say primary all
建立专用块及文件系统
[mdbrw02 ~]#mknod /dev/drbd1 b 147 1
[mdbrw02 ~]#mkfs /dev/drbd1
========配置heartbeat==========
分别在A、B服务器上创建authkeys和haresources文件
# vi /etc/ha.d/authkeys
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!
[mdbrw01 ~]#chmod 600 /etc/ha.d/authkeys
[mdbrw01 ~]#vi /etc/ha.d/haresources
mdbrw01 IPaddr::192.168.33.100/24/eth1 mysql_umount mysql
[mdbrw01 ~]# cat /etc/ha.d/resource.d/mysql_umount
#!/bin/sh
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGE
prefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncs
case "$1" in
'start')
/sbin/drbdadm -- --do-what-I-say primary r0
#/sbin/drbdadm -- --do-what-I-say primary all
/bin/mount /dev/drbd0 /opt
;;
'pre-start')
;;
'post-start')
;;
'stop')
/bin/umount /opt
/sbin/drbdadm secondary r0
#/sbin/drbdadm secondary all
;;
'pre-stop')
;;
'post-stop')
;;
*)
echo "Usage: $0 { start | pre-start | post-start | stop | pre-stop | post-stop }"
;;
esac
exit 0
[mdbrw01 ~]# cat /etc/ha.d/resource.d/mysql
内容略..
[mdbrw01 ~]# cat /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 625ms
deadtime 5
warntime 1250ms
initdead 30
udpport 699
bcast eth1 # Linux
auto_failback off
node mdbrw01
node mdbbk01
ping 192.168.33.1
respawn hacluster /usr/lib64/heartbeat/ipfail
=============启动heartbeat==========
分别在A、B服务器上
[mdbrw01 ~]#etc/init.d/heartbeat start
注意事项:
1.drbd.conf文件中每一个资源的配置需要相同.
2.在/opt mount状态下不能启动drbd
3.在drbd启动状态下添加、修改、删除drbd.conf文件中的资源,可能会导致drbd stop失败
4.A、B服务器上的ha.cf需要保持一致
yejr 回复于:2007-08-22 21:46:06
支持,不过原理及说明性的东西少了点
mxbao 回复于:2007-08-23 11:39:42
学习一下,等有机会,试验一下,哈哈
qlks 回复于:2007-08-23 15:11:09
非常不错
不过你这个在生产环境下试过吗?
因为我一直觉得DRBD速度上不行
所以一直没有在正式库上用过
做个测试对比吧,结果贴上来看看
sunnyfun 回复于:2007-08-23 15:58:56
测试对比结果关注中...
lvscluster 回复于:2007-08-23 21:06:50
写的太差了。
love100 回复于:2007-08-24 10:40:29
一直都在使用...
并且系统还是外汇交易。
love100 回复于:2007-08-24 10:41:16
请不吝赐教
qlks 回复于:2007-08-24 21:46:40
引用:原帖由 love100 于 2007-8-24 10:40 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7255882&ptid=979985]
一直都在使用...
并且系统还是外汇交易。
外汇交易系统用的是MySQL?
你是哪里的,我可以跟你交流下
love100 回复于:2007-08-25 09:17:35
MSN:lg@china-lg.com
qlks 回复于:2007-08-29 14:12:45
能不能回答我一些具体的问题
1。你这套系统是用在哪个外汇交易系统上的?
2。MySQL的版本是多少?
3。已经使用了有多长时间?
4。MySQL使用的存储引擎是什么?
5。每秒事务量是多少?
love100 回复于:2007-08-29 19:01:49
1。你这套系统是用在哪个外汇交易系统上的?>什么叫那个外汇系统,自主研发
2。MySQL的版本是多少?〉5.0.33
3。已经使用了有多长时间?〉共计8个月左右
4。MySQL使用的存储引擎是什么?〉InnoDB
5。每秒事务量是多少?>取决于用户注文的数量以及每秒汇率发送的速度
luoriddr 回复于:2007-09-19 15:45:20
受教了。回头好好研究下。
phphp 回复于:2007-09-20 12:37:26
什么时候我的服务器也放心让他自动切换就轻松了
rubee 回复于:2007-09-21 16:49:11
写的不错
windychan 回复于:2007-09-21 21:35:05
在Mysql 4.0.X环境下可以运行吗? 有时间我也来试试!
love100 回复于:2007-09-22 11:46:10
Not proven, you can try!
xxmxbtx 回复于:2007-09-29 16:53:52
这个做法不是很理想,需改进
tclwp 回复于:2007-09-30 13:18:18
好像使用DRBD网络效率降低至少20% ?处理延迟增大了吗 ?
xxmxbtx 回复于:2007-09-30 16:39:36
降低20%?用专用网卡阿
szwzzak 回复于:2008-03-04 11:59:12
最近拜读你在chinaunix论坛的一篇DRBD配置的文章。刚好我手上有一个菲律宾的博彩项目。数据库采用的是MYSQL 5.0.41.用户要求在不增加投资情况下提供高可用性。我初步测试了HEARTBEAT+DRBD+NFS+MYSQL+MON这个组合。(HEARTBEAT 2.0.8;DRBD 8.2.4,Red Hat Enterprise Linux AS release 4,内核版本:2.6.9-34.EL
)
计划满足以下要求:
1) service heartbeat stop
2) kiallall heartbeat
3) reboot
4) 拔掉生产网络网线
5) 拔掉主服务器的电源线
在以上情况下,集群可以自动进行集群ip和mysql切换,同时保证数据完整性。
我参照mysql公司提供的mysql+drbd集群文档进行了配置,同时参考了你的设置。
结论是
service heartbeat stop;kiallall heartbeat;拔掉生产网络网线
以上情况是满足我的要求的。
但是当拔掉主服务器的电源线后,备份服务器heartbeat不能启动相应资源。
错误信息:return code 20 from /etc/ha.d/resource.d/drbddisk
我分析DRBD需要两个节点cs处于connected状态才能设置primary状态,进而挂载/dev/drbd0设备。当拔掉主服务器的电源线后,cs肯定不是connected状态,因此不能将备份服务器drbd设置为primary状态。从而造成heartbeat服务不能启动相应资源。
按照我的测试,heartbeat+mysql是可以满足以上五个要求的(测试时未考虑数据完整性。)
我的drbd.conf
on web1{
device /dev/drbd0;
disk /dev/drbd0;
address 10.10.10.1:7788;(使用的是心跳网线)
meta-disk internal;
}
net {
after-sb-0pri discard-older-primary;
after-sb-1pri call-pri-lost-after-sb;
after-sb-2pri call-pri-lost-after-sb;
}
ha.cf
使用ipfail,dopd同步进程
Haresources
Local139 192.168.30.249 drbddisk::r0 filesystem::.dev/drbd0::/opt/mysql/data portmap nfslock nfs mysqld
在我这里拔掉生产网络网线的数据完整性已经可以保证了。数据没有问题。
你们在配置drbd+和heartbeat过程中能满足我的全部用户要求吗?希望能得到你们的宝贵意见。
yueliangdao0608 回复于:2008-03-04 12:27:57
支持一下。:mrgreen:
szwzzak 回复于:2008-03-11 18:07:41
功能初步实现了
szwzzak 回复于:2008-03-11 18:09:49
重要的是用drbd0.7.23实现了
szwzzak 回复于:2008-03-11 18:12:05
就允许设置primary状态。
szwzzak 回复于:2008-03-11 18:13:35
更新ha.cf,drbddisk
szwzzak 回复于:2008-03-11 18:14:46
认真弄懂各参数很重要
todayboy 回复于:2008-05-11 10:29:37
~]#/usr/local/mysql/bin/mysql -A -e "grant REPLICATION SLAVE on *.* to [email=slaver@]slaver@"%[/email]" Identified by"slave;FLUSH PRIVILEGES;"
这行授权好象有问题?? 我给版主,提个意见,能不能把你的实验补全来,只要按这个文档就能做出来、、、、
hjk857 回复于:2008-05-15 10:05:42
支持!!!!:em17:
hjk857 回复于:2008-05-23 15:27:49
看到这么好的贴真是luck!!!
准备实验下.
linuxkumao 回复于:2008-07-09 14:09:59
:mrgreen: :mrgreen: :mrgreen:
xiaoqi8866 回复于:2008-09-23 14:07:31
如何解决在已有的老分区 创建DRBD 问题?
例如 我有一个分区 sda1 ext3文件系统 里面有数据, 我如何用这个分区创建DRBD虚拟设备?
device /dev/drbd1;
disk /dev/sda1;
address 192.168.1.128:7791;
meta-disk internel;
看了一些资料说 DRBD 不能在已有文件系统上创建DRBD 虚拟设备。
请问有什么办法能解决这个问题吗 ?
huifeideluotuo 回复于:2008-10-24 11:20:27
破坏原有设备的文件系统就ok了,
dd if=/dev/zero bs=1M count=1 of=/dev/sda2; sync
|