7.4.5 案例分享五:生产环境下的MySQL DRBD双机高可用

鉴于DRBD的稳定性,笔者针对电子商务网站采用的也是这种MySQL高可用方案。由于系统安装初始化工作并非是本人进行的(DELL供应商在机器进机房上架之前就已将系统安装好并且是最小化安装),在安装完DRBD包后“modprobe drbd”报错,在加载DRBD模块时经常报错,报错信息如下所示:“FATAL:Module drbd not found drbd”,后面发现是系统安装了双内核并使用新内核启动的原因,所以执行命令default=1,回退到老版本内核运行,此报错就没有了,/etc/grub.conf配置文件如下所示:

default=1

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.18-238.el5xen)

root (hd0,0)

kernel /xen.gz-2.6.18-238.el5

module /vmlinuz-2.6.18-238.el5xen ro root=LABEL=/ rhgb quiet

module /initrd-2.6.18-238.el5xen.img

title CentOS-base (2.6.18-238.el5)

root (hd0,0)

kernel /vmlinuz-2.6.18-238.el5 ro root=LABEL=/ rhgb quiet

initrd /initrd-2.6.18-238.el5.img

服务器的型号是DELL R710(双至强Xeon E5606 CPU),系统采用的CentOS 5.8 x86_64,由6块SAS 600G硬盘作为RAID 10,考虑到RAID 10作为文件系统的高效及速度,这里单独划分了接近1.5TB的硬盘空间给DRBD系统使用(在安装系统时选择将此空间作为空闲空间,此数据库主要是为订单系统提供服务,所以不用考虑多维度数据增长的问题,基本上5~8年之内是可以满足需求的),此外还采用了两根交叉线作为心跳线,思科CISCO?WS-C2960S-24TS-L作为交换机设备。

两台机器的基本情况如下所示:

centos1.mypharma.com 112.112.68.170,心跳线为:

192.168.1.1 10.0.0.1

centos2.mypharma.com 112.112.68.172,心跳线为:

192.168.1.2 10.0.0.2

Heartbeat的

vip为

112.112.68.174

两台机器的hosts文件内容分别如下:

112.112.68.170 centos1.mypharma.com centos1

112.112.68.172 centos2.mypharma.com centos2

c

两台机器的hostname主机名及NTP对时应在实验前就配置好,并关闭iptables和SELinux,硬盘情况可用fdisk来查看,命令如下:

fdisk -l

此命令显示结果如下所示:

Disk /dev/sda: 1798.6 GB, 1798651772928 bytes

255 heads, 63 sectors/track, 218673 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/sda1 * 1 16 128488+ 83 Linux

/dev/sda2 17 5237 41937682+ 82 Linux swap / Solaris

/dev/sda3 5238 11764 52428127+ 83 Linux

/dev/sda4 11765 218673 1661996542+ 5 Extended

/dev/sda5 11765 15710 31696213+ 83 Linux

/dev/sda6 15711 198076 1464854863+ 83 Linux

1.DRBD的部署安装

两台机器分别用如下命令来安装DRBD软件:

yum -y install drbd83 kmod-drbd83

载入DRBD模块并检测模块载入是否正常,命令如下:

modprobe drbd

lsmod | grep drbd

如果正确显示了类似如下的信息,则表示DRBD已成功安装:

drbd 300440 4

用如下命令查看两台机器的drbd.conf配置文件,内容如下(两台机器的配置是一样的):

global {

# minor-count dialog-refresh disable-ip-verification

usage-count no; #统计

DRBD的使用次数

}

common {

syncer { rate 30M; }#同步速率,视带宽而定

}

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 120;

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;

}

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 "123456"; #DRBD同步时使用的验证方式和密码信息

#allow-two-primaries;

}

syncer {

rate 30M;

# rate after al-extents use-rle cpu-mask verify-alg csums-alg

}

on centos1.mypharma.com { #设定一个节点,分别以各自的主机名命名

device /dev/drbd0; #设定资源设备

/dev/drbd0 指向实际的物理分区

/dev/sda6

disk /dev/sda6;

address 192.168.1.1:7788; #设定监听地址及端口

meta-disk internal;

}

on centos2.mypharma.com { #设定一个节点,分别以各自的主机名命名

device /dev/drbd0; #设定资源设备

/dev/drbd0 指向实际的物理分区

/dev/sdb1

disk /dev/sda6;

address 192.168.1.2:7788; #设定监听地址及端口

meta-disk internal; #表示是在同一个局域网内

}

}

然后执行drbdadm create-md r0命令来创建DRBD元数据信息,两台机器都需要执行此命令,如果执行命令后出现如下报错:

Device '0' is configured!

Command 'drbdmeta 0 v08 /dev/sda6 internal create-md' terminated with exit code 20

drbdadm create-md r0: exited with code 20

那么为了修复这个错误,建议用dd破坏文件分区(注意,磁盘原有的数据会被全部清除掉,因此希望谨慎操作),命令如下:

dd if=/dev/zero of=/dev/sda6 bs=1M count=100

之后,在centos1的机器上执行如下命令:

[root@centos1 ~]# drbdadm create-md r0

命令显示结果如下:

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

在centos2的机器上执行如下命令:

[root@centos2 ~]# drbdadm create-md r0

命令显示结果如下:

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

若两台机器都有上面的显示结果则表明一切都是正常的。

现在启动DRBD设备,在两台机器上分别执行如下命令:

service drbd start

如果此时没有正常关闭iptables服务,则会产生报错信息,报错信息如下:

Starting DRBD resources: [ d(r0) s(r0) n(r0) ]..........

***************************************************************

DRBD's startup script waits for the peer node(s) to appear.

- In case this node was already a degraded cluster before the

reboot the timeout is 120 seconds. [degr-wfc-timeout]

- If the peer was available before the reboot the timeout will

expire after 120 seconds. [wfc-timeout]

(These values are for resource 'r0'; 0 sec -> wait forever)

To abort waiting enter 'yes' [ 50]:

关闭SELinux和iptables后,此错误信息将消失,两台机器上均可以成功启动DRBD服务。

在centos1的机器上查看DRBD状态,命令如下:

[root@centos1 ~]# service drbd status

命令显示结果如下:

drbd driver loaded OK; device status:

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36

m:res cs ro ds p mounted fstype

0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C

之后,将centos1的机器作为DRBD的Primary机器,命令如下所示:

drbdsetup /dev/drbd0 primary -o

drbdadm primary r0

然后再查看其状态,命令如下所示:

[root@centos1 ~]# service drbd status

此命令显示结果如下所示:

drbd driver loaded OK; device status:

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36

m:res cs ro ds p mounted fstype

... sync'ed: 0.1% (1429092/1430476)M

0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C

我们发现,Primary/Secondary关系已形成,而且数据也正在进行同步,已同步了0.1%,接近1.5TB大小的DRBD数据同步传输的速度非常慢,建议将此时间安排在空闲时间,可将其安排在工作日下班以后,经过漫长的等待以后,再查看Primary机器的DRBD状态,如下所示:

[root@centos1 ~]# service drbd status

命令显示结果如下所示:

drbd driver loaded OK; device status:

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36

m:res cs ro ds p mounted fstype

0:r0 Connected Primary/Secondary UpToDate/UpToDate C

UpToDate/UpToDate表示数据已经同步完成了。

关于DRBD的性能优化,这里需要说明一下,由于DELL机器上的网卡都已经是千兆网卡,建议不要选择百兆交换机,在此例中,由于笔者在两台DELL 710机器上已经安装了两条交叉线作为心跳线,所以选择用其中一条心跳线(192.168.1.1-->192.168.1.2)作为专门的DRBD数据同步线路。

下面将在两台机器上建立/drbd分区,以作为MySQL的挂载目录,命令如下所示:

mkdir /drbd

格式化Primary机器的DRBD分区并挂载使用,命令如下所示:

[root@centos1 ~]# mkfs.ext3 /dev/drbd0

显示结果如下所示:

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

183107584 inodes, 366202530 blocks

18310126 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=4294967296

11176 block groups

32768 blocks per group, 32768 fragments per group

16384 inodes per group

Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information:

done

This filesystem will be automatically checked every 28 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

将/dev/drbd0设备挂载至/drbd分区的命令如下:

mount /dev/drbd0 /drbd/

阅读 ‧ 电子书库

注意

Secondary节点上是不允许对DRBD设备进行任何操作的,包括只读,所有的读写操作都只能在Primary节点上进行,只有当Primary节点挂掉时,Secondary代替主节点作为Primary节点后才能进行读写操作。

最后,在两台机器上将DRBD设为自启动服务,命令如下:

chkconfig drbd on

2.Heartbeat的安装和部署

首先,在两台机器上分别用yum来安装Heartbeat,如下命令操作两次:

yum -y install heartbeat

如果只操作一次,你会惊奇地发现,第一次时Heartbeat并没有安装成功。

然后,在两个节点上配置Heartbeat文件。其中,centos1.mypharma.com的配置文件如下:

logfile /var/log/ha-log #定义

Heartbeat的日志名字及位置

logfacility local0

keepalive 2 #设定心跳

(监测

)时间为

2秒

deadtime 15 #设定死亡时间为

15秒

ucast eth0 112.112.68.172

ucast eth2 10.0.0.2

ucast eth3 192.168.1.2

#采用单播的方式,

IP地址指定为对方

IP,这里为了防止“脑裂”,特地用了两条心跳线外加公网地址

IP作为心跳监测线路,事实上,在项目上线测试阶段,除非人为手动破坏,不然是没有发生“脑裂”的可能的。

auto_failback off #当

Primary机器发生故障切换到

Secondary机器后不再进行切回操作。

node centos1.mypharma.com centos2.mypharma.com

centos2.mypharma.com的配置文件如下:

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 15

ucast eth0 112.112.68.170

ucast eth2 10.0.0.1

ucast eth3 192.168.1.1

auto_failback off

node centos1.mypharma.com centos2.mypharma.com

该配置文件跟centos1类似,这里不再做重复性解释。

接着,编辑双机互连验证文件authkeys,命令如下:

cat /etc/ha.d/authkeys

auth 1

1 crc

需要将此文件的权限设定为600,不然启动Heartbeat服务时会报错,命令如下所示:

chmod 600 /etc/ha.d/authkeys

最后,编辑集群资源文件/etc/ha.d/haresources,命令如下:

centos1.mypharma.com IPaddr::112.112.68.174/29/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/drbd::ext3 mysqld

这个文件在两台机器上是一样的,建议不要轻易改动。

mysqld为MySQL服务器启动、重启及关闭脚本,这个是在安装MySQL时自带的,后面在安装MySQL时会提到此步。

3.源码编译安装MySQL 5.1.47并部署haresources

当时之所以选择MySQL 5.1.47版本,是因为此版本的MySQL在以前的其他项目或网站中均运行稳定,所以在部署此电商项目时也考虑采用此版本,在MySQL官方网站上下载MySQL 5.1.47的源码包,并在两台机器上分别安装,这里跟单纯编译安装MySQL 5.1.47还是略有不同,下面将详细说明一下。

1)安装gcc等基础库文件,命令如下:

yum install gcc gcc-c++ zlib-devel libtool ncurses-devel libxml2-devel -y

生成运行MySQL服务的用户及用户组:

groupadd mysql

useradd -g mysql mysql

源码编译安装MySQL5.1.47:

tar zxvf mysql-5.1.47.tar.gz

cd mysql-5.1.47

./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --enable-thread-safe-client --enable-assembler --with-readline --with-big-tables --with-plugins=all --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static

make

make install

2)对MySQL进行权限配置,使其能顺利启动,命令如下:

cd /usr/local/mysql

cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf

cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld

cp /usr/local/mysql/share/mysql/mysql.server /etc/ha.d/resource.d/mysqld

chmod +x /etc/init.d/mysqld

chmod +x /etc/ha.d/resource.d/mysqld

chown -R mysql:mysql /usr/local/mysql

3)在两台机器上的/etc/my.cnf的[mysqld]项下面重新配置下MySQL运行时的数据存放路径。

datadir=/drbd/data

4)在Primary机器上运行如下命令,使其数据库目录生成数据,Secondary机器则不需要运行。

/usr/local/mysql/bin/mysql_install_db --user=mysql --datadir=/drbd/data

阅读 ‧ 电子书库

注意

这里是整个实验环境的一个重要环节,笔者在搭建时出过几次问题,我们运行MySQL是在启动DRBD设备之后,即将/dev/drbd0目录正确挂载到/drbd目录后,而并非尚未挂载就去启动MySQL,这会导致整个实验完全失败,大家一定要注意。完成此步骤以后,不需要启动MySQL,它可以靠脚本来启动,如果已经启动了MySQL请手动关闭。

4.在两台机器上将DRBD和Heartbeat设成自启动

将DRBD和Heart beat设成自启动的命令如下:

service drbd start

chkcfonig drbd on

service heartbeat start

chkconfig heartbeat on

通过观察Primary机器上的信息可以得知,Primary机器已经正确启动了MySQL和Heartbeat,信息如下所示:

[root@centos1 ~]# ip addr

此命令显示结果如下所示:

1: lo: mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 84:8f:69:dd:5f:f1 brd ff:ff:ff:ff:ff:ff

inet 112.112.68.170/29 brd 114.112.69.175 scope global eth0

inet 112.112.68.174/29 brd 114.112.69.175 scope global secondary eth0:0

3: eth1: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 84:8f:69:dd:5f:f3 brd ff:ff:ff:ff:ff:ff

4: eth2: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 84:8f:69:dd:5f:f5 brd ff:ff:ff:ff:ff:ff

inet 10.0.0.1/24 brd 10.0.0.255 scope global eth2

5: eth3: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 84:8f:69:dd:5f:f7 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.1/24 brd 192.168.1.255 scope global eth3

6: virbr0: mtu 1500 qdisc noqueue

link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

通过如下命令查看3306端口被占用的情况,可得知mysqld服务已被正常开启。

[root@centos1 data]# lsof -i:3306

此命令显示结果如下所示:

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

mysqld 4341 mysql 18u IPv4 9807 TCP *:mysql (LISTEN)

5.在Primary机器上授权一个远程用户

为Primary机器新建一个授权远程用户,例如这里的admin,方便程序进行连接,命令如下所示:

mysql> grant all privileges on *.* to 'admin'@'%' identified by 'admin@change20110101';

修改PHP程序连接MySQL的配置文件,如config.inc.php或configuration.php,修改代码如下:

public $host = '112.112.68.174';

public $user = 'admin';

public $password = 'admin@change20120101';

阅读 ‧ 电子书库

注意

此时PHP程序连接的应该的是Heartbeat产生的VIP地址,即112.112.68.174。

6.测试工作

这里主要是模拟Primary机器重启或宕机时,测试Secondary机器能不能自动接管过来并启动MySQL,我们重启Primary机器后又再重启Secondary机器,正常的结果应该是:无论我们如何重启机器,只要保证有一台机器存活,MySQL均能提供正常的服务。在Primary机器上可以通过tail命令进行观察,命令如下所示:

[root@centos1 ~]# tail –

n 100/var/log/messages

结果如下所示:

Oct 12 15:19:44 centos1 heartbeat: [4074]: info: Link centos2.mypharma.com:eth2 up.

Oct 12 15:19:44 centos1 heartbeat: [4074]: info: Status update for node centos2.mypharma.com: status init

Oct 12 15:19:44 centos1 heartbeat: [4074]: info: Status update for node centos2.mypharma.com: status init

Oct 12 15:19:44 centos1 heartbeat: [4074]: info: Link centos2.mypharma.com:eth3 up.

Oct 12 15:19:44 centos1 heartbeat: [4074]: info: Status update for node centos2.mypharma.com: status up

Oct 12 15:19:44 centos1 harc[6268]: info: Running /etc/ha.d/rc.d/status status

Oct 12 15:19:44 centos1 harc[6284]: info: Running /etc/ha.d/rc.d/status status

Oct 12 15:19:44 centos1 heartbeat: [4074]: info: Status update for node centos2.mypharma.com: status active

Oct 12 15:19:44 centos1 harc[6300]: info: Running /etc/ha.d/rc.d/status status

Oct 12 15:19:45 centos1 heartbeat: [4074]: info: remote resource transition completed.

Oct 12 15:19:46 centos1 heartbeat: [4074]: info: Link centos2.mypharma.com:eth0 up.

待系统稳定以后,隔段时间用命令抽查一下Heatbeat日志,命令如下:

[root@centos1 ~]# tail -n 100 /var/log/ha-log

此命令显示结果如下所示:

heartbeat[4063]: 2012/10/15_16:57:46 info: cl_malloc stats:668/1965676344080/21163 44080/21163

heartbeat[4063]: 2012/10/16_16:57:59 info: RealMalloc stats: 52392 total malloc bytes. pid [4085/HBWRITE]

heartbeat[4063]: 2012/10/16_16:57:59 info: Current arena value: 0

heartbeat[4063]: 2012/10/16_16:57:59 info: MSG stats: 0/0 ms age 4639692810

heartbeat[4063]: 2012/10/16_16:57:59 info: cl_malloc stats: 360/414819 52960/25724

heartbeat[4063]: 2012/10/16_16:57:59 info: RealMalloc stats: 45564 total malloc bytes. pid [4086/HBREAD]

heartbeat[4063]: 2012/10/16_16:57:59 info: Current arena value: 0

heartbeat[4063]: 2012/10/16_16:57:59 info: These are nothing to worry about.

heartbeat[4063]: 2012/10/17_16:58:12 info: Daily informational memory statistics

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 6/1036311 ms age 0

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 578/32771436 115384/56399

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 597304 total malloc bytes. pid [4063/MST_CONTROL]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/4 ms age 430777840

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 312/413 36320/16115

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 38892 total malloc bytes. pid [4080/HBFIFO]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/0 ms age 4726092800

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 332/273119 39824/18379

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 48136 total malloc bytes. pid [4081/HBWRITE]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/0 ms age 4726092800

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 333/518422 39916/18443

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 40740 total malloc bytes. pid [4082/HBREAD]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/0 ms age 4726092800

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 344/273149 41952/19771

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 50264 total malloc bytes. pid [4083/HBWRITE]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/0 ms age 4726092800

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 356/518505 44400/21427

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 45748 total malloc bytes. pid [4084/HBREAD]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/0 ms age 4726092800

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 356/273179 44080/21163

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 52392 total malloc bytes. pid [4085/HBWRITE]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: MSG stats: 0/0 ms age 4726092800

heartbeat[4063]: 2012/10/17_16:58:12 info: cl_malloc stats: 360/518499 52960/25724

heartbeat[4063]: 2012/10/17_16:58:12 info: RealMalloc stats: 45564 total malloc bytes. pid [4086/HBREAD]

heartbeat[4063]: 2012/10/17_16:58:12 info: Current arena value: 0

heartbeat[4063]: 2012/10/17_16:58:12 info: These are nothing to worry about.

最后一句话表示整个Heartbeat+DRBD+MySQL环境是稳定的,没什么可以担心的了,笔者负责的网站已经稳定运行了1059天,DRBD+Heartbeat也没有任何异常,用uptime命令观察可以得知,系统正常稳定,命令如下所示:

uptime

命令显示如果如下:

15:21:30 up 159 days, 22:25, 1 user, load average: 0.11, 0.04, 0.01

不过,DRBD+Heartbeat也存在着一定的问题,下面来看看。

·“脑裂”问题,这个是大家在工作中讨论得最多的问题,但是在网站的维护工作中我们发现,由于NFS服务器和MySQL采用的都是DRBD双机,因此只要不轻易触碰机器的交叉线(即心跳线),保证交换机的稳定性,出现此问题的概率几乎微乎其微。

·I/O消耗,这个是由DRBD本身的写文件机制造成的,我们通过Sysbench做基准测试时也能发现此问题,建议将除系统表之外的所有表引擎转都换成InnoDB引擎,避免DRBD写机制对数据库中的表的影响。如果觉得这样太麻烦,可以直接采用MySQL5.5或更高级别的MySQL版本(因为它们的默认引擎就是InnoDB)。

·DRBD+Heartbeat浪费了宝贵的服务器资源,DRBD的备机目前还不能提供读功能,生产环境下的MySQL服务器硬件基本上都是顶配的,这样就浪费了一台机器资源,感觉还是非常可惜的。

下面附上MySQL中MyISAM转InnoDB的Shell脚本,脚本如下:

#/bin/bash

#Date:2012/09/27

DB=pharma

USER=root

PASSWD=root@change

/usr/local/mysql/bin/mysql -u$USER -p$PASSWD $DB -e "select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='"$DB"' and ENGINE='"MyISAM"';" | grep -v "TABLE_NAME" > mysql_table.txt

#for t_name in `cat tables.txt`

cat mysql_table.txt | while read LINE

do

echo "Starting convert table engine..."

/usr/local/mysql/bin/mysql -u$USER -p$PASSWD $DB -e "alter table $LINE engine='"InnoDB"'"

sleep 1

done

整个实施过程需要注意如下几点:

·在Secondary主机上,用来做DRBD的硬盘可以跟Primary主机的大小不一样,但请不要小于Primary主机,以免发生数据丢失的现象,生产环境下建议保持大小一致,如果确实不能保持一样的大小,Secondary机器的DRBD分区应大于Primary机器。

·服务器网卡及交换机推荐采用千兆系列的,在测试中发现其同步速率带宽介于100MB~200MB,这里采用官方的建议,以带宽最小值的30%来设置带宽,即100MB*30%,大家也可根据自己的实际网络环境来设定此值。

·DRBD对网络的环境的要求很高,建议用单独的交叉线来作为两台主机之间的心跳线,如果条件允许,可以考虑用两根以上的心跳线;如果这个环节做得好,基本上“脑裂”的问题是不存在的。其实整个实验初期都可以在同一网络环境下实现,后期再加心跳线也是可行的。

·安装Heartbeat时需要安装两遍,即yum-y install heartbeat要执行两次。

·建议不要用根分区作为MySQL的datadir,不然执行show database命令时会发现出现了名为“#mysql50#lost+found”的数据库,这也是笔者将MySQL的数据库目录设置成/drbd/data的原因。

·就算发生“脑裂”的问题,DRBD也不会丢失数据,手动解决此脑裂问题即可,况且用两根或两根以上的心跳线的话,出现“脑裂”的概率非常之少;正因为DRBD可靠,MySQL也推荐将其作为MySQL实现高可用方案之一。

·MySQL的DRBD此方案不能达到毫秒级的切换速度,MyISAM引擎的表在系统宕机后需要很长的修复时间,而且也有可能发生表损坏的情况,建议大家将除了系统表之外的所有表引擎均改为InnoDB引擎。