本来,一开问mysql HA的问题,

相关聊天记录如下

(05:04:01 PM) 周涛: 生产当中mysql的HA,如果master挂了,slave真的会自动切换过去吗?
(05:05:59 PM) 银狐→风℃: mmm差不多
(04:58:44 PM) 我为SUN狂: 用keepalive
(05:04:29 PM) 周涛: 我说两台
(04:59:12 PM) 我为SUN狂: 不过主好了的话要手动切,否则容易出事。
(05:06:39 PM) 红昼: 北京|梁木(5717746) 17:05:44 还送个光纤转换器 你是什么时候给接的光纤呢
(05:04:53 PM) 周涛: 我在想如果master挂了,表是不是锁了
(05:07:47 PM) action: 光猫爽啊,下载东西就怕电脑硬盘受不了
(05:06:41 PM) 银狐→风℃: drbd
(05:06:46 PM) 银狐→风℃: 主就不挂了
(05:05:15 PM) 周涛: drbd是啥?
(05:07:09 PM) 红昼: raid1
(05:07:17 PM) 红昼: 网络版

对于drbd还没听说过搜之~

以下是实验文档包括F.A.Q

------------------------------------------------------------------------------------------------------------

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

在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,
切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
DRBD的工作原理如下图:
        +--------+
        |  文件系统 |
        +--------+
             |
             V
        +----------+
        |   块设备层  |
        | (/dev/drbd1) |
        +----------+
         |            |
         |            |
         V           V
   +----------+  +-----------+
   |  本地硬盘   |   | 远程主机硬盘 |
   | (/dev/hdb1)  |   | (/dev/hdb1)  |
   +----------+  +-----------+

drbp配置
yum -y install kmod-drbd

DRBD配置
192.168.3.131
192.168.3.131

1:准备部分
你需要为本地主机和远程主机,指定一个DRBD使用的硬盘分区.这两个分区的大小必须相同.
我们指定两台主机的/dev/sdb2分区作为DRBD的使用的分区.这两个分区大小都为20G

  fdisk /dev/sdb
  partprobe
  mkdir /drbd130
  mkfs.ext3 /dev/sdb2
  mount /dev/sdb2 /drbd130/
[root@localhost ~]# df -h | grep /dev/sdb2
/dev/sdb2              19G  173M   18G   1% /drbd130



  fdisk /dev/sdb
  partprobe
  mkdir /drbd131
  mkfs.ext3 /dev/sdb2
  mount /dev/sdb2 /drbd131/
[root@localhost ~]# df -h | grep /dev/sdb2
/dev/sdb2              19G  173M   18G   1% /drbd131



drdb.conf配置文件
DRBD运行时候会读取/etc/drbd.conf 文件描述了drbd设备与硬盘分区的映射关系

编辑drbd.conf
[root@localhost /]# cat /etc/drbd.conf
global { usage-count yes; }
common { syncer { rate 1M; } }
 resource r0 {
# 使用协议C.表示收到远程主机的写入确认后,则认为写入完成.
            protocol C;
            net {
# 设置主备机之间通信使用的信息算法.
                 cram-hmac-alg sha1;
                 shared-secret "FooFunFactory";
            }
            on g130 {
# /dev/drbd1使用的磁盘分区是/dev/hdb1
                 device    /dev/drbd1;
                 disk      /dev/sdb2;
# 设置DRBD的监听端口,用于与另一台主机通信
                 address   192.168.3.130:7898;
                 meta-disk  internal;
            }
            on g131 {
                 device    /dev/drbd1;
                 disk      /dev/sdb2;
                 address   192.168.3.131:7898;
                 meta-disk  internal;
            }
       }

相同的配置文件scp到另外一台上面


drbd启动


1:在启动DRBD之前,你需要分别在两台主机的hdb1分区上,创建供DRBD记录信息的数据块.分别在
两台主机上执行

drbdadm create-md r0 #r0为drbd.conf中定义的
2:启动drbd
/etc/init.d/drbd start
3:查看drbd状态,
[root@130-g ~]# cat /proc/drbd
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:26:57

 1: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
        resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

”/proc/drbd”中显示了drbd当前的状态.第一行的st表示两台主机的状态,都是”备机”状态.
ds是磁盘状态,都是”不一致”状态.
这是由于,DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据.所以,我们需要初始化
一个主机.在130-g上执行:
[root@130-g ~]# drbdsetup /dev/drbd1 primary -o

在查看130状态
[root@130-g ~]# cat /proc/drbd
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:26:57

 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:17792 nr:0 dw:0 dr:17792 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
        [>....................] sync'ed:  0.2% (19064/19084)M
        finish: 3:07:44 speed: 1,652 (1,368) K/sec
        resync: used:0/61 hits:1110 misses:2 starving:0 dirty:0 changed:2
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

主备机状态分别是”主/备”,主机磁盘状态是”实时”,备机状态是”不一致”.
在第3行,可以看到数据正在同步中,即主机正在将磁盘上的数据,传递到备机上.现在的进度是0.2%.
现在看一下131-g上面的DRBD状态.

[root@131-g ~]# cat /proc/drbd
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:26:57

 1: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r---
    ns:0 nr:138880 dw:138880 dr:0 al:0 bm:8 lo:0 pe:0 ua:0 ap:0
        [>....................] sync'ed:  0.8% (18948/19084)M
        finish: 3:46:22 speed: 1,400 (1,284) K/sec
        resync: used:0/61 hits:8671 misses:9 starving:0 dirty:0 changed:9
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

稍等一会,在数据同步完后,再查看一下130-g的DRBD状态:

先撤,同步好慢,1M/S有点儿操单,
[zhoutao@WorkSpace ~]$ date
Wed Feb 29 19:13:36 CST 2012
先回家做饭,晚上远程过来看看


主节点上进行格式化并创建文件系统
mkfs.ext3 /dev/drbd1
mount /dev/drbd1 /opt
建一个test文件
touch test
对主节点进行卸载降级
umount /opt
drbdadm secondary r0

------------
对备份节点进行升级挂载
drbdadm primary r0
mount /dev/drbd1 /opt
文件一直备份成功










----------------------------------------------------------------------------------------------------------
F.A.Q
drbdadm create-md r0
/etc/drbd.conf:19: in resource r0, on g130 { ... } ... on g131 { ... }:
        There are multiple host sections for the peer.
        Maybe misspelled local host name 'localhost.localdomain'?
/etc/drbd.conf:19: in resource r0, there is no host section for this host.
        Missing 'on localhost.localdomain {...}' ?
[root@localhost /]# vim /etc/drbd.conf
定义hostname和/etc/drbd.conf19行一样


drbdadm create-md r0
/etc/drbd.conf:11: Parse error: 'TK_STRING' expected,
        but got '130' (TK 277)
[root@localhost /]# vim /etc/drbd.conf
[root@localhost /]# vim /etc/drbd.conf
[root@localhost /]#
[root@localhost /]#
[root@localhost /]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb2 on /drbp131 type ext3 (rw)
[root@localhost /]# umount /dev/sdb2

/etc/drbd.conf:11: Parse error: 'TK_STRING' expected,
        but got '130' (TK 277)

还有报错
修改hostname为130-g就没问题了,大概不支持全数字妈的
继续报错
drbdadm create-md r0
v08 Magic number not found
md_offset 20012068864
al_offset 20012036096
bm_offset 20011421696

Found ext3 filesystem which uses 19543040 kB
current configuration leaves usable 19542404 kB

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 /dev/drbd1 v08 /dev/sdb2 internal create-md' terminated with exit code 40
drbdadm aborting
说sdb2上已经有数据存在,尝试用dd插除,在次运行没问题

启动drbd是报错
[root@130-g ~]# service drbd start
Starting DRBD resources:    Can not load the drbd module.
yum -y install kmod-drbd
报错!发现yum安装drbd错了,安装的是drbd82,卸载,然后yum -y install kmod-drbd

Total download size: 263 k
Downloading Packages:
(1/2): kmod-drbd-8.0.16-5.el5_3.x86_64.rpm            | 107 kB     00:00    
(2/2): drbd-8.0.16-5.el5.centos.x86_64.rpm            | 155 kB     00:00