CentOS6安装NFS HA架构部署(NFS + Heartbeat + DRBD)

因业务需求,使用NFS共享服务,为了避免硬件故障导致的服务不可用,使用NFS + Heartbeat + DRBD架构实现NFS高可用。(我当时在测试环境操作的/dev/sdb 有时候写成了/dev/xvdb,请大家自行统一下指向自己实际的磁盘下),建议大家先通读整篇文章,之后在进行配置,可以避免一些配置疑问。
一、安装配置drbd
1、测试环境:
CentOS 6.4
主testserver2.bj 10.111.32.51 挂载sdb1  10G
备testserver3.bj 10.111.32.52 挂载sdb1  10G
Heartbeat虚拟IP: 10.111.32.177
网关:10.111.32.1

这里使用的业务共用的网卡举例(eth0),如果是线上环境,一定要使用另外一个网卡进行网卡直连(eth1),

这样数据同步都会由这个网卡进行,不影响业务,不然数据量超过10、20G后可能会影响业务,首次同步数据会按照硬盘大小进行同步(4T数据同步了25小时)。

2、初始设置

分别设置两台服务器的主机名

修改两台服务器的 /etc/hosts ,内容相同:
# vi /etc/hosts
10.111.32.51    testserver2.bj
10.111.32.52    testserver3.bj

对磁盘进行分区,这里模拟大于2T硬盘进行分区
parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 0% 100%


确定两台服务器的本地硬盘,这里我们使用的都是 /dev/sdb ,并为其创建一个单独的分区 /dev/sdb1
# fdisk -l /dev/sdb
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 1305 10482381 83 Linux
注:DRBD是以数据块方式同步的,因此,在创建镜像磁盘前,不要创建文件系统。

3、两台服务器都安装 DRBD,这里使用 yum 安装:
yum -y install gcc flex libxslt
yum install kernel kernel-devel kernel-headers -y (安装后重启服务器)

cd /usr/local/src/  
wget http://oss.linbit.com/drbd/8.4/drbd-8.4.6.tar.gz  
wget http://oss.linbit.com/drbd/drbd-utils-8.9.2.tar.gz  

安装DRBD:

tar -zxvf drbd-utils-8.9.2.tar.gz
cd drbd-utils-8.9.2
./configure --prefix=/usr/local/drbd-utils-8.9.2 --without-83support #编译安装drbd-utils工具,因为安装的DRBD是8.4以上版本,所以不需要支持8.3版本
make
make install

tar -zxvf drbd-8.4.6.tar.gz  
cd drbd-8.4.6
----------------------#开始编译安装drbd,和8.4.5之前版本有所不同,这里不用./configure,直接make就可以了
./configure --prefix=/usr/local/drbd-utils-8.9.2 --with-km --with-heartbeat --sysconfdir=/etc/
----------------------
make KDIR=/usr/src/kernels/2.6.32-642.11.1.el6.x86_64/   #修改自己环境的内核版本 #uname -r查看
make install

ll /usr/local/drbd-utils-8.9.2/etc/rc.d/init.d/drbd  #如果没有找到文件,请检查drbd-utils-8.9.2.tar.gz的安装是否正常完成
cp /usr/local/drbd-utils-8.9.2/etc/rc.d/init.d/drbd /etc/rc.d/init.d/ #复制drbd文件到init.d目录下

mkdir -p /usr/local/drbd-utils-8.9.2/var/run/drbd 不然启动会有报错找不到这个路径
chkconfig --add drbd
chkconfig drbd on

#链接drbd的命令到系统命令路径

ln -s /usr/local/drbd-utils-8.9.2/sbin/*  /usr/bin/

ln -s /usr/local/drbd-utils-8.9.2/sbin/*  /sbin/


确认两台服务器的drbd模块加载是否正常:
# modprobe drbd #加载DRBD模块  
# lsmod | grep drbd #查看模块是否安装成功若显示如下状态证明成功加载DRBD模块
drbd 245928 0


4、配置

本次编译安装配置文件位置:/usr/local/drbd-utils-8.9.2/etc/drbd.conf
也可以,为便于管理,创建个符号链接:cd /etc/;ln -s /usr/local/drbd-utils-8.9.2/etc/drbd.conf drbd.conf

a.配置 /usr/local/drbd-utils-8.9.2/etc/drbd.conf ,这里我们先在testserver2.bj主节点直接编辑它:
[root@TM-Master ~] vi drbd.conf
global {
        usage-count no;
}
common {
        syncer { rate 2000M; }  
}
resource r0 {  
        protocol C;     
        startup {
                wfc-timeout 120;
                degr-wfc-timeout 120;

        }
        disk {
                on-io-error detach;    
        }
        net{
                timeout 60;     
                connect-int 10;
                ping-int 10;    
                max-buffers 2048;
                max-epoch-size 2048;
                cram-hmac-alg "sha1";
                shared-secret "tj-drbd";
        }
        on testserver2.bj {  
                device /dev/drbd0;      
                disk   /dev/sdb;        
                address 10.111.32.51:5566;
                meta-disk internal;
        }
        on testserver3.bj {
                device /dev/drbd0;
                disk   /dev/sdb;
                address 10.111.32.52:5566;
                meta-disk internal;
        }
}

配置说明:
global {
        usage-count no; #是否参加DRBD使用者统计
}
common {
        syncer { rate 2000M; }  #设置主用节点和备用节点同步时的网络速率最大值
}
resource r0 {  #资源名字为r0
        protocol C;     #使用DRBD的第三种同步协议(A B C),大多数用C,表示收到远程主机的写入确认后认为写入完成
        startup {
                wfc-timeout 120;
                #在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间
的,默认为0,即不限制,永远等待。
                degr-wfc-timeout 120;
                #用于限制等待时间,它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
        }
        disk {
                on-io-error detach;     #策略:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作
        }
        net{
                timeout 60;     #如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡
                connect-int 10; #如果无法立即连接上远程DRBD设备,系统将断续尝试连接
                ping-int 10;    #如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等
节点是否还存活
                max-buffers 2048;
                #该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些bu
ffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。
                max-epoch-size 2048;    #该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系
统性能。大一点好。
                cram-hmac-alg "sha1";
                #该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包
含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。
                shared-secret "tj-drbd";  #用来设定在对待节点授权中使用的密码,最长64个字符。
        }
        on mysql1 {  #每个主机的说明以on 开头,后面是hostname
                device /dev/drbd0;      #drbd设备名称
                disk   /dev/sdb;        #/dev/drbd0使用的磁盘分区是/dev/sdb,重点说下,网上有写成/dev/sdb1,因我使用一整块硬盘共享,就一个分区号,我测试了下,两种都可以
                address 10.0.0.11:5566;     #设置DRBD的监听端口,用于与另一台主机通信
                meta-disk internal;     #DRBD的元数据存放方式
        }
        on mysql2 {
                device /dev/drbd0;
                disk   /dev/sdb;
                address 10.0.0.12:5566;     #两台主机端口必须一致
                meta-disk internal;
        }
}

b. 复制Master 的配置文件到Slave 上:
[root@testserver2.bj ~]# scp /usr/local/drbd-utils-8.9.2/etc/drbd.conf root@testserver2.bj:/usr/local/drbd-utils-8.9.2/etc/drbd.conf

c. 在两台服务器上分别初始化分区,并启动服务:
# drbdadm create-md r0
initialising activity log
NOT initialized bir0ap
Writing meta data…
New drbd meta data block sucessfully created.

备注:
1) “r0”是在drbd.conf里定义的资源名称.
2)如果配置文件位置变了 需要指定drbdadm -c /etc/drbd.conf create-md r0

调整双机的系统防火墙:
在主机node1上开放5566端口允许node2
-A INPUT -s 10.111.32.52/32 -m state --state NEW -m tcp -p tcp --dport 5566 -j ACCEPT  
在主机node2上开放5566端口允许node1
-A INPUT -s 10.111.32.51/32 -m state --state NEW -m tcp -p tcp --dport 5566 -j ACCEPT  

启动两台主机的drbd服务:
# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

……….

DRBD's startup script waits for the peer node(s) to appear.
 - If 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
   is 120 seconds. [wfc-timeout]
   (These values are for resource 'r0'; 0 sec -> wait forever)
 To abort waiting enter 'yes' [  57]:

这里会等待其他服务器也start,操作第一台后,马上启动第二台。

这里我用到了r0, 你也可以用你的资源组名称,譬如本例的 db。
查看两台机器的状态,用cat /proc/drbd 或 /etc/init.d/drbd status:
[root@testserver2.bj ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C

我的环境:
[root@testserver2.bj ~]# /etc/init.d/drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]
outdated-wfc-timeout has to be shorter than degr-wfc-timeout
outdated-wfc-timeout implicitly set to degr-wfc-timeout (120s)
.
WARN: nothing stacked for this host (testserver3.bj), nothing to do in stacked mode! 有这个没影响

[root@testserver3.bj ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
现在两机器都是处于Secondary,即备机状态。(红色部分标记),如果是Unknow,则检查两台是否配置一样。

说明:
cs:表示连接状态
ro: 表示主从关系 上面的表示都为从

ds:硬盘状态信息 上面表示已经实时同步中,Inconsistent:不一致

会出现这个设备drbd0

ls -l /dev/drbd*0  
brw-rw---- 1 root disk 147, 0 Nov 17 16:47 /dev/drbd0 


# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db01.mysql.com, 2015-06-24 13:47:15
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:40088 nr:0 dw:0 dr:40248 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

查看版本
#cat /proc/drbd

查看位置
whereis drbd 

5、操作
第一步:首先操作主节点
#设置主从第一次执行
#drbdadm -- --overwrite-data-of-peer primary all  #前面就是-- --这样的
执行此命令后,初始化同步开始进行。同步的过程视磁盘大小和网络通信带宽而定,400GB磁盘可能需要2个小时。

可以通过查看cat /proc/drbd或service drbd status 检测同步的进展情况。同步的时间和设备的大小有一定的关系。

# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db01.mysql.com, 2015-06-24 13:47:15
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:40088 nr:0 dw:0 dr:40248 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
说明:ro状态变为ro:Primary/Secondary;ds状态为:UpToDate/UpToDate(inconsisten) 即"实时/实时(不一致)"

[root@testserver2.bj ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
… sync’ed: 8.8% (9350/10236)M
0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C

[root@testserver3.bj ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
… sync’ed: 13.7% (8847/10236)M
0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C

通过/proc/drbd,可以查看磁盘的复制状态:
[root@TM-Master ~]# cat /proc/drbd
+
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—
ns:2151328 nr:0 dw:0 dr:2151328 al:0 bm:131 lo:0 pe:0 ua:0 ap:0 oos:8330696
[===>................] sync’ed: 20.6% (8135/10236)M
finish: 0:12:48 speed: 10,804 (10,244) K/sec
[root@TM-Slave ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
0: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r—
ns:0 nr:1791904 dw:1791904 dr:0 al:0 bm:109 lo:0 pe:0 ua:0 ap:0 oos:8690120
[==>.................] sync’ed: 17.2% (8486/10236)M
finish: 0:11:18 speed: 12,792 (10,236) K/sec

至此,镜像分区已创建完成,我们在两台服务器上设置为开机自启动:
# chkconfig drbd on


磁盘格式化(只对primary节点格式化)
同步完毕之后,就可以对空白磁盘格式化了.
#drbd-overview
 0:r0/0  Connected Primary/Secondary UpToDate/UpToDate


6、挂载使用
在 Primary 主节点上,即 TM-Master ,格式化文件系统并挂载DRBD分区到本地(只能在primary节点上挂载)
[root@TM-Master ~]# mkfs.ext4 /dev/drbd0
This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@TM-Master ~]# tune2fs -c 0 -i 0 /dev/drbd0  (我的环境未操作)
[root@TM-Master ~]# mkdir /drbd_data   (这个目录两个节点都创建下)
[root@TM-Master ~]# mount /dev/drbd0 /drbd_data

注:drbd 设备只能在 Primary 端使用,为避免误操作,当机器重启后,默认都处于 Secondary 状态,如要使用drbd设备,需手动把其设置为Primary。

第二步:在从节点上进行挂载  
将主节点drbd的状态变为从  
umount /drbd_data
drbdadm secondary all  


在从节点上进行挂载  
drbdadm primary all  
mount/dev/drbd0 /drbd_data


常见命令

查看资源角色(前面代表当前资源角色)
# drbdadm role r0  
Primary/Secondary

查看资源连接状态
#drbdadm cstate r0  
Connected

查看硬盘数据状态
# drbdadm dstate r0  
UpToDate/UpToDate

节点及数据同步状态
主drbd-overview
0:r0/0  Connected Primary/Secondary UpToDate/UpToDate /drbd_data ext4 9.8G 43M 9.2G 1%
从drbd-overview
0:r0/0  Connected Secondary/Primary UpToDate/UpToDate
 
注意事项
1.主备服务器同步的两个分区大小最好相同(网上没有关于分区大小是否一定要相同的确切说法)
2.开始同步两个节点的磁盘,需要一定时间,在同步完成前,不要重启,否则会重新同步。
3.挂载之前一定要先切换当前节点为主节点
4.两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态。
5.处于从节点(secondary)状态的服务器不能加载drbd块设备
6.将主节点切换为从节点之前要先卸载
7.一台主机切换为主节点之前,要确保另一台主机已切换为从节点。


生成测试数据

#touch /drbd_data/test.txt
#dd  if=/dev/zero  of=/drbd_data/test.tmp  bs=1M  count=20
# drbdadm dstate r0  
UpToDate/UpToDate

将主节点drbd的状态变为从

# drbdadm role r0  
Primary/Secondary

#umount /drbd_data
#drbdadm secondary all

# drbdadm role r0  
Secondary/Secondary

在从节点上进行挂载

#drbdadm role r0
Secondary/Secondary

#drbdadm primary all

#drbdadm role r0
Primary/Secondary

#mkdir /drbd_data
#mount /dev/drbd0 /drbd_data/
(drbd服务没有启动的话看不到/dev/drbd0设备)

# ls -ls /drbd_data/
total 20493
   12 drwx------ 2 root root    12288 Jun 24 17:02 lost+found
20481 -rw-r--r-- 1 root root 20971520 Jun 24 17:20 test.tmp

测试成功.

DRBD相关内容:

查看资源的连接状态:drbdadm cstate r0  
一个资源可能有以下连接状态之一:
    StandAlone独立的:网络配置不可用。资源还没有被连接或者是被管理断开(使用drbdadm disconnect命令),或者是由于出现认证失败或者是裂脑的情况。
    Disconnecting断开:断开只是临时状态,下一个状态将是StandAlone独立的。
    Unconnected悬空:是尝试连接前的临时状态,可能的下一个状态为WFconnection和WFReportParams。
    Timeout超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空。
    BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空。
    NetworkFailure:与对等节点失去连接后的临时状态,下一个状态为Unconected悬空。
    ProtocolError. 与对等节点失去连接后的临时状态,下一个状态为Unconected悬空。
    TearDown拆解:临时状态,对等节点连接关闭,下一个状态为Unconected悬空。
    WFConnection.等待和对等节点建立网络连接。
    WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包。
    Connected连接:Drbd已经建立连接,数据镜像现在可用,节点处于正常状态。
    StartingSyncS:完全同步,有管理员发起的刚刚开始同步。未来可能的状态为SyncSource或PausedSyncS。
    StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID。
    WFBitMapS:部分同步刚刚开始,下一步可能的状态:SyncSource或PausedSyncS。
    WFBitMapT:部分同步刚刚开始,下一步可能的状态:WFSyncUUID。
    WFSyncUUID:同步即将开始,下一步可能的状态:SyncTarget或PausedSyncT。
    SyncSource:以本节点为同步源的同步正在进行。
    SyncTarget:以本节点为同步目标的同步正在进行。
    PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停。可能是因为另外一个同步正在进行或者是使用命令drbdadm pause-sync暂停了同步。
    PausedSyncT:以本地节点为持续的同步目标,但是目前同步已经暂停,这可能是因为另外一个同步正在进行或者是使用命令drbdadm pause-sync暂停了同步。
    VerifyS:以本地节点为验证源的线上设备验证正在执行。
    VerifyT:以本地节点为目标源的线上设备验证正在执行。

查看资源的磁盘状态:drbdadm dstate r0  

本地节点一般显示在前,对等节点资源显示在后。本地和对等节点的磁盘状态都有可能是一下状态之一:
    Diskless无盘:本地没有块设备分配给DRBD使用,这就意味着没有可用的后背设备,或者使用drbdadm 命令手工分离或者是底层的I/O错误导致自动分离。
    Attaching:读取元数据时候的瞬间状态。
    Failed失败:本地块设备报告I/O错误的下一个状态。其下一个状态为Diskless无盘。
    Negotiating:在已经连接的DRBD设备进行Attach读取元数据前的瞬间状态。
    Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态。
    Outdated:数据资源是一致的,但是已经过时。
    DUnknown:当对等节点网络连接不可用时出现这种状态。
    Consistent:一个没有连接的节点数据一致。当建立连接时,它决定数据是UpToDate 或者是Outdated。
    UpToDate:一致的最新的数据状态,这个状态是正常的状态。    

查看I/O状态标志:

cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql1, 2016-11-17 15:25:56  
     0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----  
      
cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql1, 2016-11-17 15:25:56  
     0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----  
        ns:409587464 nr:0 dw:0 dr:409588128 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0  
       
I/O状态标志包含在/proc/drbd中的有关I/O操作的当前资源的信息。I/O状态表示一共六种,具体信息如下:

        I/O suspension,r表示运行I/O,s表示suspended I/O,正常情况下为r
        Serial resynchronization 串行同步:当资源等待同步时却推迟了重新同步,这则个标志变成A,正常情况为 –
        Peer-initiated sync suspension 对等节点发起的同步暂停:当资源正在等待重新同步时,对等节点因为一些原因发起暂停同步。这个标志变成p。正常为 –
        Locally initiated sync suspension 本地发起的同步暂停:当资源等待重新同步时,在本地节点上用户发起同步暂停,这个标志变成u。正常为 –
        Locally blocked I/O 。正常为 -。可能会是一下标志:
        d:如因为一个短暂的磁盘状态导致的drbd内部出现I/O阻塞
        b:备用设备的I/O阻塞
        n:网络socket出现阻塞
        a:设备的I/O阻塞和网络阻塞的组合
         Activity Log update suspension 活动日志更新暂停:当活动日志更新暂停,这个标志变成s。正常为 –

查看绩效指标:
/proc/drbd第二行包含每个资源的计数器和仪表状况的信息:

    NS(network send 网络发送):net数据以kibyte通过网络连接发送到对等节点
    NR(network receive 网络接收):通过网络连接以kibyte接收net数据
    DW(disk write 磁盘写入):net数据以kibyte写入本地磁盘
    DR(disk read 磁盘读取):net数据以kibyte读取本地磁盘数据
    AL(activity log 活动日志):活动日志区的元数据更新
    BM(bit map 位图):位图区元数据更新
    LO(local count 本地计数):DRBD请求的开放本地I/O子系统的数量
    PE(pengding 待定):发送到对等节点但是尚未节点对方回答的请求的数目
    UA(unacknowledged 未确认):通过网络连接接收到对等节点的请求,但是尚未得到回复
    AP(alllication pending应用程序挂起):数据块I/O请求转发到DRBD,但是DRBD尚未回答
    EP(epochs):一定数量的epoch对象,通常为1,使用阻碍或者是没有排序写的方法时可能增加I/O负载。
    WO(write order 写入顺序)目前使用的写入顺序的方法:b(barrier障碍)、f(flush 刷新)、d(drain 漏)或者是n(none无)
    OOS(out of sync):以kububyte同步当前存储

手动启用或停用资源:
通常drbd已经设置为随系统自启动,但也支持通过如下进行手动操作:
    drbdadm up r0  
    drbdadm down r0  

升级和降级资源:
可以通过手工发出如下命令更改资源的角色,或者从次切换为主或者是从主到次:
    drbdadm primary r0  
    drbdadm secondary r0  

drbd故障处理与恢复
关于drbd的磁盘故障、替换、脑裂的处理方法,下面只说明一种处理脑裂问题的方法,更多内容详见以下链接中的内容。或查看附件的PDF文档查找管理资料。

在双机正常运行期间,人为的中断了node2主机的网卡,造成双机间drbd数据同步中断。在重新恢复网络后,再查看双机上drbd的状态信息如下,两个主机的drbd服务发生了脑裂:

    [root@node1 etc]# cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql1, 2016-11-17 15:25:56  
     0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----  

    [root@node2 ~]# cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql2, 2016-11-17 15:28:41  
     0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----  


在node2的网络断开后,node1主机上会继续有业务写入数据,所以当node2的网络重新恢复时,自然是与node1的数据不一致的。有时也会看到node1主机会继续以下面的状态运行,本机的磁盘和服务运行在单机模式下。

    [root@mysql1 etc]# cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql1, 2016-11-17 15:25:56  
     0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r-----  
        ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:520  


针对以上脑裂问题的处理方法:
    在发生问题的主机上,如上面的node2, 执行drbdadm secondary r0
    在发生问题的主机上,如上面的node2, 执行drbdadm connect --discard-my-data r0,从主节点同步数据,并且discard自己的数据
    使用cat /proc/drbd查看双机的drbd运行状态信息


如果此时在node1节点上drbd状态已经切换到了"standalone",请先确认node1节点处于primary状态,再执行drbdadm connect r0以恢复服务。

    [root@node1 ~]# cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql1, 2016-11-17 15:25:56  
     0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r-----  
        ns:0 nr:324 dw:800 dr:37201 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:416  

    [root@node1 ~]# drbdadm connect r0  

    [root@node1 ~]# cat /proc/drbd  
    version: 8.4.6 (api:1/proto:86-101)  
    GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@mysql1, 2016-11-17 15:25:56  
     0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----  
        ns:488 nr:0 dw:800 dr:37689 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0  

更多DRBD故障恢复知识详见下面链接。
http://www.cnblogs.com/feisky/archive/2011/12/25/2310346.html


二、Heartbeat安装与配置实现高可用

以下均是在两个主机上执行。

1、安装heartbeat

yum install ca-certificates (这个是避免使用epel出现[Errno 14] problem making ssl connection问题,安装epel-release之前装好)

yum install epel-release (安装扩展)

yum -y install heartbeat

yum装完后heartbeat版本为3.0.4

安装完后会自动建立用户hacluster和组haclient确保两个节点上hacluster用户的的UID和GID相同在两台节点上分别执行:
cat /etc/passwd | grep hacluster | awk -F ":"  '{print $3}'
cat /etc/passwd | grep hacluster | awk -F ":"  '{print $4}'
cat /etc/group | grep haclient | awk -F ":"  '{print $3}'
结果都相同即可

2、编辑配置文件
hearbeat配置文件目录为 /etc/ha.d/ 脚本存放目录:/etc/ha.d/resource.d/
cp /usr/share/doc/heartbeat-3.0.4/{authkeys,ha.cf,haresources} /etc/ha.d/

cd /etc/ha.d
编辑认证文件
vi /etc/ha.d/authkeys
auth 1
1 crc

chmod 600 authkeys

这个是mysql的例子,编辑资源配置文件

vi /etc/ha.d/haresources 

testserver2.bj IPaddr::10.0.0.10/24/eth0:1 drbddisk::r0 Filesystem::/dev/drbd0::/hadata::ext4 mysqld


NFS的配置资源文件,把参数直接追加进去了
#echo "testserver2.bj IPaddr::10.111.32.177/24/eth0:1 drbddisk::r0 Filesystem::/dev/drbd0::/drbd_data::ext4 killnfsd" >> /etc/ha.d/haresources
testserver2.bj为主机名(主备写一样的名字)

解释:10.111.32.177 是虚拟ip地址,/drdb_data 是共享的文件,下面还需要创建一个文件关于nfs的,要受到heartbeat的控制

# cd /etc/ha.d/resource.d/
# touch killnfsd
#chmod 755 /etc/ha.d/resource.d/killnfsd (改变它的权限)

(把参数追加进去)

#echo "ps -ef|grep nfs|grep -v 'grep'|awk '{print $2}'|xargs kill -9 ; /etc/init.d/nfs restart; exit 0" >> /etc/ha.d/resource.d/killnfsd

或者
#echo "killall -9 nfsd; /etc/init.d/nfs restart; exit 0" >> /etc/ha.d/resource.d/killnfsd
建议使用 下边的方式,需要将nfs的当前链接全部断开,之后重启下,不然客户端链接有时候有问题。

注:双机上该配置内容一致。

3、修改配置文件ha.cf
vi  /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
bcast     eth0    //这个位置如果有心跳网卡,些心跳网卡的名字eth1
auto_failback off
node     testserver2.bj
node     testserver3.bj
ping     10.111.32.1
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
compression     bz2
compression_threshold 2
注:主、备机参数一样。
注:heartbeat的两台主机分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点并由从节点运行服务。

说明:
debugfile /var/log/ha-debug #用于记录heartbeat的调试信息
logfile /var/log/ha-log #用于记录heartbeat的日志信息
logfacility local0 #系统日志级别
keepalive 2 #设定心跳(监测)间隔时间,默认单位为秒
warntime 10 ##警告时间,通常为deadtime时间的一半
deadtime 30 # 超出30秒未收到对方节点的心跳,则认为对方已经死亡
initdead 120 #网络启动时间,至少为deadtime的两倍。
hopfudge 1 #可选项:用于环状拓扑结构,在集群中总共跳跃节点的数量
udpport 694 #使用udp端口694 进行心跳监测
bcast eth0 #指明心跳使用以太网广播方式,并且是在eth0接口上进行广播
ucast eth0 10.111.32.52 #采用单播,进行心跳监测,IP为对方主机
node TM-Mater #设置集群中的节点,节点名须与uname –n相匹配
node TM-Slave #节点2
ping 10.111.32.1 #ping集群以外的节点,这里是网关,用于检测网络的连接性
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root #设置所指定的启动进程的权限


-------------------下边将其他参数说明列在这里----------

debugfile /var/log/ha-debug  #用于记录heartbeat 的调试信息
logfile /var/log/ha-log      #指定heartbeat的日志存放位置
logfacility   local0         #如果未定义上述的日志文件,那么日志信息将送往local0(/var/log/messages),
#如果这3个日志文件都未定义,那么heartbeat 默认情况下将在/var/log下建立ha-debug和ha-log来记录相应的日志信息
keepalive 2                 #发送心跳报文的间隔,默认单位为秒,指定毫秒为单位, 需要在后面跟 ms 单位,如 1500ms 即代表 1.5s
deadtime 30                 #指定若备用节点没有收到主节点的心跳信号后多长时间立即接管主节点的服务资源
warntime 10                 #指定心跳延迟的时间为10秒,即发出最后的心跳警告信息的间隔          
#当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务
initdead 120  #在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作
#该选项用于解决这种情况产生的时间间隔,取值至少为deadtime的两倍
udpport 694    #设置广播/单播通信使用的端口,694为默认使用的端口号
baud 1920      #设置串行通信的波特率
serial /dev    #选择串行通信设备,用于双机使用串口线连接的情况。如果双机使用以太网连接,则应该关闭该选项
ucast eth0 IP  #采用网卡eth0的udp单播来传递心跳,后面跟的IP地址应为双机对方的IP地址
mcast eth0     #采用网卡eth0的Udp组播来传递心跳,如果采用组播通讯,在这里可以设置组播通讯所使用的接口
#绑定的组播ip地址(在 224.0.0.0 - 239.255.255.255 间),通讯端口,ttl(time to live)所能经过路由的跳数
#是否允许环回(也就是本地发出的数据包时候还接收) 一般在备用节点不止一台时使用
#Bcast、ucast和mcast分别代表广播、单播和组播,是组织心跳的三种方式,任选其一即可  
auto_failback  #用来定义当主节点恢复后,是否将服务自动切回
stonith        #stonith的主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,
#避免两个节点争用一个资源的情形发生,保证共享数据的安全性和完整性
watchdog /dev/watchdog    #可选配置,通过Heartbeat来监控系统的运行状态使用该特性,需要在内核中载入"softdog"内核模块
#用来生成实际的设备文件,如果系统中没有这个内核模块,就需要指定此模块,重新编译内核,编译完成输入"insmod softdog"加载该模块
#grep misc /proc/devices(应为10)
#cat /proc/misc |grep watchdog(应为130)
最后生成设备文件:"mknod /dev/watchdog c 10 130" 即可使用此功能。  
ping 192.168.60.1   #选择ping的节点,ping节点选择的越好,HA集群就越强壮,可以选择固定的路由器作为ping节点,或者应用服务器
#但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接。如果指定了多个ping节点如ping 192.168.0.1 192.168.0.2
那么只有当能ping通所有ping节点时才认为网络是连通的,否则则认为不连通
ping_group group1 172.16.103.254 172.16.103.212
#ping_group就是同时ping多个ip,只有所有的ip都无法ping通时,ipfail才会执行切换的动作
#保证了不会是因为被ping的ip出了问题而产生误切换,ping_group不能和ping同时使用
respawn hacluster /usr/lib/heartbeat/ipfail
#该选项是可选配置,表示以hacluster这个用户身份运行/usr/lib/heartbeat/ipfail这个插件
#respawn列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程遇到故障可以自动重新启动。最常用的进程是ipfail,此进程用于检测和处理网络故障,需要配合ping或者ping_group语句,其中指定的ping node来检测网络的连通性。在v2版本中,ipfail和crm有冲突,不能同时使用,如果启用crm的情况下,可以使用pingd插件代替ipfail
apiauth ipfail gid=haclient uid=hacluster
#指定对客户端api的访问控制,缺省为不可访问
#如果指定有权限访问ipfail用户和组,apiauth的语法如下
apiauth apigroupname [uid=uid1,uid2 ...] [gid=gid1,gid2 ...]
示例apiauth  ping gid=haclient uid=alanr,root
在指定api访问权限时,可以指定具有访问权限的组或者用户,也可以同时指定组和用户
当进行同时指定时,只要用户是所指定的组或者用户中的其中一员即可访问api库,也可以配置api默认用户组,命令如下
apiauth default  gid=haclient
当配置了默认用户组时,其他所有api授权命令失效且该用户组中的成员可以访问任何api库
如果不在ha.cf文件指定api库的访问权限,则默认的访问权限如下
service         default apiauth
ipfail          uid=hacluster
ccm         gid=haclient
ping            gid=haclient
cl_status       gid=haclient
lha-snmpagent   uid=root
crm         uid=hacluster
crm respawn #是否开启Cluster Resource Manager(集群资源管理)功能
注意当使用crm时,默认会自动使用下列命令
apiauth  stonithd   uid=root
apiauth  crmd       uid=hacluster
apiauth  cib        uid=hacluster       
respawn hacluster       ccm
respawn hacluster       cib
respawn root            stonithd
respawn root            lrmd
respawn hacluster       crmd
关于上述命令,和ipfail插件命令的意义相同,这里不再赘述
autojoin   none  #该选项作用是将知道集权节点间密钥的服务器自动加入节点
autojoin三个选项各自的意义为:
none: #不使用autojoin功能
other:#ha.cf文件中列出来的节点应自动加入集群,没有列出来的就无法自动加入集群
any:  #任何节点都可以自动加入集群
hopfudge 1   #设置串口的心跳信息最少的被转发次数,默认值为1
deadping 30  #设置的用来ping的节点的死亡时间,当超过该时间时则认为该节点网络无法连通
#该值设置太小将导致系统过快的认为节点死亡;设置过大,则会延误系统判定时间
realtime     #允许/禁止实时执行将Heartbeat设置为高优先级,缺省为 on
msgfmt  classic/netstring  #网线中的信息格式,可以是 classic 或 netstring
classic      #利用base64库将二进制值转换为string值在网线中传输,该选项为默认选项
netstring     #在网线中直接传输二进制值,该选项由于不需要转换效率更高
use_logd yes/no     #是否使用记录监控和日志的功能相似
conn_logd_time 6    #如果前一个连接失败了再次连接到记录监控器的间隔
compression         #配置压缩模块,可以为 zlib 或 bz2
#可以通过查看/usr/lib/heartbeat/plugins/HBcompress/目录下的文件以确定是否有相应的库。一般在CPU空闲且网络资源紧张的情况下启用该选项
compression_threshold  #配置压缩的限度
#这个值决定压缩一个信息的限度,例如:如果限度为1,那么任何大于 1KB 的消息都会被压缩,缺省为2 (KB)

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


4、检查下启动管理脚本drbddisk,没有自己创建下
请把下面的脚本文件上传到两个主机的/etc/ha.d/resource.d路径下,该脚本的功能是管理和切换drbd角色,以配合heartbeat的双机服务切换。
vim /etc/ha.d/resource.d/drbddisk
------------------开始----------------
#!/bin/bash
#
# This script is inteded to be used as resource script by heartbeat
#
# Copright 2003-2008 LINBIT Information Technologies
# Philipp Reisner, Lars Ellenberg
#
###

DEFAULTFILE="/etc/default/drbd"
DRBDADM="/sbin/drbdadm"

if [ -f $DEFAULTFILE ]; then
. $DEFAULTFILE
fi

if [ "$#" -eq 2 ]; then
    RES="$1"
    CMD="$2"
else
    RES="all"
    CMD="$1"
fi

## EXIT CODES
# since this is a "legacy heartbeat R1 resource agent" script,
# exit codes actually do not matter that much as long as we conform to
# http://wiki.linux-ha.org/HeartbeatResourceAgent
# but it does not hurt to conform to lsb init-script exit codes,
# where we can.
# http://refspecs.linux-foundation.org/LSB_3.1.0/
#LSB-Core-generic/LSB-Core-generic/iniscrptact.html
####

drbd_set_role_from_proc_drbd(){
    local out
    if ! test -e /proc/drbd; then
        ROLE="Unconfigured"
        return
    fi

dev=$( $DRBDADM sh-dev $RES )
minor=${dev#/dev/drbd}
if [[ $minor = *[!0-9]* ]] ; then
# sh-minor is only supported since drbd 8.3.1
    minor=$( $DRBDADM sh-minor $RES )
fi
if [[ -z $minor ]] || [[ $minor = *[!0-9]* ]] ; then
    ROLE=Unknown
    return
fi

if out=$(sed -ne "/^ *$minor: cs:/ { s/:/ /g; p; q; }" /proc/drbd); then
    set -- $out
    ROLE=${5%/**}
    : ${ROLE:=Unconfigured} # if it does not show up
else
    ROLE=Unknown
fi
}

case "$CMD" in
  start)
# try several times, in case heartbeat deadtime
# was smaller than drbd ping time
    try=6
    while true; do
        $DRBDADM primary $RES && break
        let "--try" || exit 1 # LSB generic error
        sleep 1
    done
    ;;
  stop)
# heartbeat (haresources mode) will retry failed stop
# for a number of times in addition to this internal retry.
    try=3
    while true; do
        $DRBDADM secondary $RES && break
    # We used to lie here, and pretend success for anything != 11,
    # to avoid the reboot on failed stop recovery for "simple
    # config errors" and such. But that is incorrect.
    # Don't lie to your cluster manager.
    # And don't do config errors...
        let --try || exit 1 # LSB generic error
        sleep 1
    done
    ;;
  status)
    if [ "$RES" = "all" ]; then
      echo "A resource name is required for status inquiries."
      exit 10
    fi
    ST=$( $DRBDADM role $RES )
    ROLE=${ST%/**}
    case $ROLE in
        Primary|Secondary|Unconfigured)
    # expected
        ;;
        *)
    # unexpected. whatever...
    # If we are unsure about the state of a resource, we need to
    # report it as possibly running, so heartbeat can, after failed
    # stop, do a recovery by reboot.
    # drbdsetup may fail for obscure reasons, e.g. if /var/lock/ is
    # suddenly readonly. So we retry by parsing /proc/drbd.
            drbd_set_role_from_proc_drbd
    esac
    case $ROLE in
        Primary)
            echo "running (Primary)"
            exit 0 # LSB status "service is OK"
        ;;
        Secondary|Unconfigured)
            echo "stopped ($ROLE)"
            exit 3 # LSB status "service is not running"
        ;;
        *)
    # NOTE the "running" in below message.
    # this is a "heartbeat" resource script,
    # the exit code is _ignored_.
            echo "cannot determine status, may be running ($ROLE)"
            exit 4 # LSB status "service status is unknown"
        ;;
    esac
    ;;
  *)
    echo "Usage: drbddisk [resource] {start|stop|status}"
    exit 1
    ;;
esac

exit 0
-----------------结束----------------------

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

脚本中的DRBDADM="/sbin/drbdadm"就是开始文章中为什么要做软连接的原因


#service heartbeat start
再次确认drbd是否工作,主NFS设置drbdadm primary r0
#drbdadm primary r0
#/etc/init.d/drbd status
#ifconfig

chkconfig --add heartbeat
chkconfig heartbeat on
chkconfig nfs off  
这里设置NFS开机不要自动运行,因为/etc/ha.d/resource.d/killnfsd 该脚本内容控制NFS的启动。

三、NFS安装配置
启动nfs服务

service nfs start

# vi /etc/exports
/drbd_data *(rw,no_root_squash)

重启NFS服务:
service nfs restart

技巧提示:修改了/etc/exports文件后不需要重启nfs,只要重新扫描一次/etc/exports文件,并且重新将设定加载即可,直接使用#exportfs -a 命令

其他参数 exportfs [-aruv]
参数说明如下:
1)-a:全部挂载(或卸载)/etc/exports文件内的设定。
2)-r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。
3)-u:卸载某一目录。
4)-v:在export时将共享的目录显示在屏幕上。

最终测试NFS服务

在另外一台LINUX的客户端挂载虚IP:192.168.7.90,挂载成功表明NFS+DRBD+HeartBeat大功告成.
# mount -t nfs 10.111.32.177:/drbd_data /test_nfs
# df -h

NFS客户端启动的服务:nfslock、rpcbind
service rpcbind start
service nfslock start
chkconfig rpcbind on
chkconfig nfslock on

测试中有一个问题待解决,偶尔主节点上的heartbeat无法停止,手动killall之后Node2会接管资源持续提供服务,如果是实际down机应该不会出现,我测试过shutdown
[root@Node1 rc.d]# service heartbeat stop
Aug 19 23:25:31 Node1 heartbeat: [2841]: WARN: Shutdown delayed until current resource activity finishes.
[root@Node1 rc.d]# killall heartbeat

drbd没有切换过去
[root@20 ~]# drbdadm secondary all
0: State change failed: (-12) Device is held open by someone
Command 'drbdsetup-84 secondary 0' terminated with exit code 11
在执行这个命令前必须执行# umount /dev/drbd0 如果不行请使用fuser -km /dev/drbd0

此时会出现两个节点都存在VIP的情况,先service heartbeat restart,在service heartbeat stop 此台的VIP就会消失
[root@20 ~]# service heartbeat restart
Stopping High-Availability services: Done.

Waiting to allow resource takeover to complete:Done.

Starting High-Availability services: INFO:  Running OK
CRITICAL: Resource IPaddr::192.168.1.19/24/eth0:1 is active, and should not be!
CRITICAL: Non-idle resources can affect data integrity!
info: If you don't know what this means, then get help!
info: Read the docs and/or source to /usr/share/heartbeat/ResourceManager for more details.
CRITICAL: Resource IPaddr::192.168.1.19/24/eth0:1 is active, and should not be!
CRITICAL: Non-idle resources can affect data integrity!
info: If you don't know what this means, then get help!
info: Read the docs and/or the source to /usr/share/heartbeat/ResourceManager for more details.
CRITICAL: Non-idle resources will affect resource takeback!
CRITICAL: Non-idle resources may affect data integrity!
Done.

问题处理参考:
0: State change failed: (-12) Device is held open by someone
http://blog.chinaunix.net/uid-26719405-id-4774449.html

WARN: Shutdown delayed until current resource activity finishes.
http://blog.sina.com.cn/s/blog_a7b22c930102wok9.html

实例-drbd脑裂恢复
http://blog.csdn.net/levy_cui/article/details/56484618


如果开启防火墙设置下规则

在mysql1主机上配置iptables并增加以下规则:
-A INPUT -s 10.0.0.2/32 -p udp -m udp --dport 694 -j ACCEPT  

在mysql2主机上配置iptables并增加以下规则:
-A INPUT -s 10.0.0.1/32 -p udp -m udp --dport 694 -j ACCEPT  

启动heartbeat服务
在node1主机上启动heartbeat软件并观察系统IP、磁盘挂载和nfs服务启动的变化信息。可以观察/var/log/ha-log,以掌握heartbeat运行信息。
在主机1上第一次启动heartbeat时,因为此时主机2上还未启动heartbeat,所以它会等待30秒以确认节点2的dead状态。
然后主机1才会继续加载各项资源,生成浮动IP、挂载/dev/drbd0磁盘和启动mysqld服务。在确认主机1上各项服务均正常后,直接在主机2上启动heartbeat服务即可。

高可用测试
在node1主机上执行service heartbeat stop,观察浮动IP、/dev/drbd0磁盘和mysqld服务的切换过程和结果。
在node1主机上执行service heartbeat start,观察两个主机上/var/log/ha-log日志输出,观察两个主机上cat /proc/drbd信息。
在node2主机上执行service heartbeat stop, 观察浮动IP、/dev/drbd0磁盘和mysqld服务是否正常切换回mysql1节点,观察日志和drbd状态信息。
在node2主机上执行service heartbeat start,测试结束。

大功告成,之前在不使用drbd的情况下,heartbeat也可以切换apache、dhcpd、portmap、nfs等等服务,
但是 nfs服务切换后,必须重新mount一下nfs共享出来的目录,否则会报 Stale NFS file handle 的错误。
现在heartbeat+drbd配合使用后,nfs等等服务可以无缝切换,不必再重新mount一下nfs目录了
(开始我还出现这个Stale NFS file handle问题,后来发现配置写错了vi /etc/ha.d/haresources里的/drbd_data一个错误的写成了/drdb_data修改正确就好了)


问题总结:
问题一:
linux rhel /usr/src/kernels 目录下没有系统内核源码--解决方法
ls /usr/src/kernels/ 空
解决:
yum install kernel-devel 过5分钟后就有了

问题二:
DRBD安装编译后: modprobe drdb FATAL: Module drdb not found

DRBD安装编译后,加载DRBD出现module不存在:
[root@drbd-1 drbd-8.4.4]# lsmod  |grep drbd
[root@drbd-1 drbd-8.4.4]#
[root@drbd-1 drbd-8.4.4]# modprobe drdb
FATAL: Module drdb not found.
报错信息:modprobe drdb FATAL: Module drdb not found

解决方法:
问题的原因就是没有整体更新kernel
yum install kernel-devel kernel kernel-deaders -y
重启既可解决问题,需要保证如下的能够找到。  (必须重启)
[root@drdb-1 drbd-8.4.4]# modprobe drbd
[root@drdb-1 drbd-8.4.4]#
[root@drdb-1 drbd-8.4.4]# lsmod |grep drbd
drbd                  327338  0
libcrc32c               1246  1 drbd

问题三:
drbdadm create-md r0
报错no resources defined!
解决方法:
使用drbdadm create-md创建DRBD元数据的时候需要使用-c指定配置文件,否则会提示“no resources defined!”。
drbdadm -c /etc/drbd.conf create-md r0


问题四:

NFS启动时报错:
[root@bjs ~]# /etc/init.d/portreserve start
Starting portreserve:                                      [  OK  ]
[root@bjs ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
                                                           [FAILED]
Starting NFS mountd:                                       [FAILED]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
                                                           [FAILED]
RH系操作系统在6.0版本之后没有portmap服务控制rpc的启动,由于NFS和nfslock的启动需要向rpc进行注册,rpc不启动的话就会报错。
解决方法:启动rpcbind&rpcidmap rpcbind是6.0版本后默认的RPC服务,所以要先于nfs启动。如果不启动rpcidmap则会造成用户权限的映射错误,用户的权限看起来是一串数字。
[root@bjs ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@bjs ~]# /etc/init.d/rpcidmapd start
Starting RPC idmapd:                                       [  OK  ]
[root@bjs ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]


参考文档:

http://blog.csdn.net/watermelonbig/article/details/53300252

http://www.cnblogs.com/gomysql/p/3674030.html

http://blog.csdn.net/yangzhawen/article/details/46800305
http://blog.chinaunix.net/uid-25266990-id-3803277.html
http://showerlee.blog.51cto.com/2047005/1211963
http://blog.itpub.net/9034054/viewspace-2056633/
http://blog.chinaunix.net/uid-11278770-id-148693.html

http://blog.itpub.net/9034054/viewspace-2056621/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值