预计阅读本页时间:-
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引擎。