### 知识补充,一定要看哦:

工作原理:指定heartbeat服务器作为主服务器,则另外一台将自动成为热备服务器,然后热备服务器上的配置heartbeat守护程序来监听来自主服务器的心跳,如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源及服务的所有权,阶梯主服务器继续提供不间断服务从而达到资源及服务高可用性的目的。

和keepalived服务器一样,heartbeat高可用是服务器级别的,不是服务级别的。

heartbeat切换的常见条件:

1、服务器宕机

2、heartbeat服务本身故障

3、心跳连接故障(心跳线坏了,网卡,驱动坏了,ip配置及冲突问题 ,心跳线间连接的设备故障(网卡鸡交换机),仲裁的机器出问题)

服务故障不会导致切换。可以通过服务宕机 把heartbeat服务停掉

心跳连接:

 heartbeat主机之间通信的一些常用的可行方法:

1、串行电缆,通过交换机等网络设备连接

2、一根以太网电缆两网卡直连(交叉线)

3、以台网电缆,通过交换机等网络设备连接(增加交换机故障点,同时线路不是专用心跳线,容易受其他数据传输的影响。导致心跳报文发送问题)

裂脑:

由于两台高可用服务器之间在指定时间内,无法相互检测到对方心跳而各自启动故障转移功能,取得了资源及服务的所有权,而此时的两台高可用服务都还存活着并在正常运行,这样会导致同一个IP或者服务在两端同时启动二发生冲突的严重问题,最严重问题是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据丢失,为脑裂,分区集群或者大脑垂直分割

HEARTBEAT消息类型:

心跳消息:150字节的数据包,可能是单播,广播或多播方式控制心跳

集群转换消息:ip-request主服务器请求接管资源ip-request-resp:得到请求后,背机回复主机信息(可以人工控制或者参数控制)

重传请求:

 

心跳控制消息都使用UDP协议发送到ha.cf文件指定的任意端口或指定的多播地址

heartbeat是通过IP地址接管和ARP广播进行故障转移的

ARP广播,在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(清除失败服务器的VIP和MAC地址的解析记录)

 ######测试过程看测试报告

1、操作前准备:两台机器各加一块10G的硬盘及配置网卡IP

IPem1:192.168.28.28   IPem1:192.168.28.29

M:em2:172.16.0.1/25   S:172.16.0.2/25心跳IP地址(心跳网卡不要配置网关,使用直连线

 

软件版本:drbd-8.4.3.tar.gz

黄色字体是我们需输入的,绿色字体是我们需看到的信息

操作步骤如下:

2、 修改主机名 (两台主机都需操作)

[root@localhost ~]# vi /etc/hosts

  1. 168.28.28  node1

  2. 168.28.29  node2

注:将如上两行添加到hosts文件

[root@localhost ~]# vi /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=node1    ##从机上写node2

3、 停止IPTABLES:service iptables stop ###避免端口被阻塞,如drbd设置的端口

4、添加心跳路由:

主机A上:添加心跳路由/sbin/routeadd -host 172.16.0.2 dev eth2###ip为对端的IP地址(B主机)

主机B上:添加心跳路由/sbin/route add -host 172.16.0.1dev eth2 

对端的IP地址(A主机)

永久生效:echo '/sbin/route add -host 172.16.0.2 dev eth1'>>/etc/rc.local  对端##的IP地址(A主机)从备3机上,主一样

route -n

5、 MSDRBDHEARBEAT的配置文件一模一样

6、 添加互信,rsa添加主机之间的互信

 

  • 为新添加的磁盘sbd分区并格式化, MS都要分区,只要格式一边磁盘即可(mkfs.ext4 /dev/sdb1),

[root@localhost ~]#fdisk /dev/sdb

…………

Command (m for help): n  ##输入n

Command action

  e   extended

  p   primary partition (1-4)

p                       ##输入P

Partition number (1-4): 1       ##输入1

First cylinder (1-1305, default 1):

Using default value 1

Last cylinder, +cylinders or +size{K,M,G}(1-1305, default 1305):

Using default value 1305

 

Command (m for help): w      ##输入w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

 

[root@localhost ~]# ls /dev |grep sdb

sdb

sdb1

[root@localhost ~]# mkfs.ext4 /dev/sdb1

[root@localhost ~]#mkdir /data ###MS都要添加此目录

[root@localhost ~]# mount /dev/sdb1 /data

[root@localhost ~]# df –h          ##可以查看到已挂载上

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda1              26G  1.2G  24G   5% /

tmpfs                 244M     0 244M   0% /dev/shm

/dev/sdb1             9.9G  151M 9.2G   2% /data

  • 安装

   [root@localhost ~]#yum -yinstall flexkernel-headers  ##安装后再安装kernel-devel###这里是个坑,如果直接yum –y kernel后面操作会有问题,不能这么干,需要执行yum update –y kernel 直接匹配当前的内核版本,升级后重启服务器,即可用uname –a 和/usr/src/kernels看到信息是一致的,否则必出问题。

 

    [root@node1 ~]# cat /proc/version ###查看内核信息

Linux version 2.6.32-358.el6.x86_64(mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013

         [root@node1 ~]#cd /usr/local

     [root@node1local]# tar zxvfdrbd-8.4.3.tar.gz

     [root@node1local]# cd drbd-8.4.3

[root@node1 drbd-8.4.3]# ./configure--prefix=/usr/local/drbd --with-km   ##--with-km是启用内核模块

checking for gcc... no

checking for cc... no

checking for cl.exe... no

configure:error: in `/usr/local/drbd-8.4.3':

configure:error: no acceptable C compiler found in $PATH

See `config.log' for more details

注:如出现如上报错,执行如下安装

[root@node1 drbd-8.4.3]# yum -y install gcc make automakeautoconf  rpm-build

[root@node1 drbd-8.4.3]# ./configure--prefix=/usr/local/drbd --with-km

[root@node1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/

注意KDIR的路径,这个内核源码路径2.6.32-358.el6.x86_64需要根据自己的系统修改

[root@node1 drbd-8.4.3]# make install

[root@node1 drbd-8.4.3]#  mkdir -p /usr/local/drbd/var/run/drbd

[root@node1 drbd-8.4.3]# cp/usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/

安装drbd模块

[root@node1 drbd-8.4.3]# cd drbd

[root@node1 drbd]# make clean

rm -rf .tmp_versions Module.markersModule.symvers modules.order

rm -f *.[oas] *.ko .*NaNd .*.d .*.tmp*.mod.c .*.flags .depend .kernel*

rm -f compat/*.[oas] compat/.*NaNd

[root@node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/

[root@node1 drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/

[root@node1 drbd]# modprobe drbd  ##加载drbd模块

[root@node1 drbd]# lsmod|grep drbd    ##查看模块是否加载成功

drbd                 325658  0

libcrc32c               1246  1 drbd

[root@node1 drbd]# cd /usr/local/drbd/etc/

[root@node1 etc]# cat drbd.conf      ##查看drbd的主配置文件

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

 

include"drbd.d/global_common.conf";

include"drbd.d/*.res";

以上可见:主配置文件里面已经包含了全部配置文件和drbd目录下以.res结尾的文件。

[root@node1 etc]# cd drbd.d/

[root@node1 drbd.d]# pwd

/usr/local/drbd/etc/drbd.d

[root@node1 drbd.d]# ls

global_common.conf

[root@node1 drbd.d]# vim global_common.conf    ##修改全局配置文件

pri-on-incon-degr

pri-lost-after-sb

local-io-error

注:将文件中上面的三行前的#号去掉

[root@node1 drbd.d]# pwd

/usr/local/drbd/etc/drbd.d

[root@node1 drbd.d]# vim drbd.res

resource r1{

 onnode1 {    ##主机名

  device /dev/drbd0;

  disk /dev/sdb1;  #前面格式化磁盘分区的名字

  address 172.16.0.1:7789;  M心跳IP

  meta-disk internal;

         }

 onnode2 {

  device /dev/drbd0;

  disk /dev/sdb1;   #前面格式化磁盘分区的名字

  address 172.16.0.1:7789; #S心跳IP

  meta-disk internal;

         }

}

##这里写心跳IP地址,不建议写管理IP地址,DRBD数据传输直接通过心跳,速度什么都比通过管理IP的来的快,而且还更稳定 等等。

 

[root@node1 drbd.d]# drbdadm create-md r1   ##在node1上初始化资源 如果出现

##“no resources defined! ”的错误时,用-c指定需初始化的资源

##  drbdadm -c /usr/local/drbd/etc/drbd.d/drbd.res  create-md r1 

--== Thank you for participating in the global usage survey  ==--

The server's response is:

you are the 19713th user to install thisversion

Writing meta data...

md_offset 10733953024

al_offset 10733920256

bm_offset 10733592576

Found ext3 filesystem

   10482380 kB data area apparently used

   10482024 kB left usable by current configuration

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)

   * shrinkthat filesystem first

   *zero out the device (destroy the filesystem)

Operation refused.

 

Command'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40

若出现如上错误,这是因为sdb1已经有文件系统了,已经有数据存在了,请执行如下语句,

[root@node1 drbd.d]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.197574 s,531 MB/s

[root@node1 drbd.d]# drbdadm create-md r1  ###执行上面语句后再重新创建drbd设备

Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfullycreated.

Success

 

[root@node1 drbd.d]# umount /data       ##umount/dev/sdb1设备

[root@node1 drbd.d]# service drbd restart   ##重启drbd服务

Stopping all DRBD resources: .

Starting DRBD resources: [

     create res: r1

   preparedisk: r1

    adjustdisk: r1

    adjust net: r1

]

.#######

到此DRBD配置完成,若出现一端起来一段还在等待过程,说明配置有问题,若启动DRBD不能同时出现如上信息,说明配置前期工作没做好,如网络或者磁盘,MS操作基本一致

[root@node1 drbd.d]# netstat -anput|grep 7789      ##查看监听端口,如启动防火墙,需把该端口打开

tcp  0   0 192.168.28.28:35114    192.168.28.29:7789          ESTABLISHED -   

tcp  0   0 192.168.28.28:7789    192.168.28.29:33549         ESTABLISHED -  

[root@node1 drbd.d]# drbdadm role r1  

Secondary/Secondary

#### ##第一次启动drbd时,两个drbd节点默认都处于Secondary状态

由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下命令:

[root@node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary all

第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令drbdadm primary r1(r1是定义资源的角色)或者drbdadm primary all

在选择的设置主节点的主机上执行该命令

[root@node1 drbd.d]#  drbdadm cstate r1      ##查看资源的连接状态

Connected

资源的连接状态;一个资源可能有以下连接状态中的一种

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:以本地节点为验证目标的线上设备验证正在执行

[root@node1 drbd.d]# drbdadm role r1   #在主上执行,显示的是主/从。前面为当前节点

Primary/Secondary

[root@node2 drbd.d]# drbdadm role r1   ##在从上执行,显示的是从/主,前面为当前节点

Secondary/Primary

Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上

Secondary 次:资源目前为次,正常接收对等节点的更新

Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态

[root@node1 drbd.d]#  drbdadm dstate r1  ##查看磁盘状态

UpToDate/UpToDate

本地和对等节点的硬盘有可能为下列状态之一:

Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离

Attaching:读取无数据时候的瞬间状态

Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘

Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态

Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态

Outdated:数据资源是一致的,但是已经过时

DUnknown:当对等节点网络连接不可用时出现这种状态

Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated

UpToDate:一致的最新的数据状态,这个状态为正常状态

 

 

[root@node1 drbd.d]# cat /proc/drbd    ##查看同步进度

version: 8.4.3 (api:1/proto:86-101)

GIT-hash:89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2014-08-2017:03:49

 0:cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

ns:10482024 nr:0 dw:0 dr:10482688 al:0bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

注: ds是磁盘状态信息

dw是磁盘写信息

dr是磁盘读信息

[root@node1 drbd.d]# ls /dev |grep drbd  ##查看drbd设备

drbd0

[root@node1 drbd.d]# mkfs.ext4 /dev/drbd0  ##格式化文件系统(文件格式根据自己的系统环境选择是ext3,还是ext4,可以根据如下命令来判断:

[root@node2 drbd.d]# df -Th

Filesystem   Type    Size  Used Avail Use% Mounted on

/dev/sda1    ext4     26G 1.5G   23G   7% /

mke2fs 1.41.12 (17-May-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

655360 inodes, 2620506 blocks

131025 blocks (5.00%) reserved for the superuser

First data block=0

Maximum filesystem blocks=2684354560

80 block groups

32768 blocks per group, 32768 fragments pergroup

8192 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376, 294912,819200, 884736, 1605632

Writing inode tables: done                           

Creating journal (32768 blocks): done

Writing superblocks and filesystemaccounting information: done

This filesystem will be automaticallychecked every 30 mounts or

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

[root@node1 drbd.d]# mount /dev/drbd0 /data/   ##挂载DRBD资源必须把DRBD设置成MS模式才可以。

[root@node1 drbd.d]# mkdir /data/test

[root@node1 drbd.d]# ls /data/

lost+found  test

[root@node1 drbd.d]# umount /data/  ##在切换主从节点前,必须先umount

 [root@node1drbd.d]# drbdadm secondaryr1    ##将node1变成备用节点

[root@node1 drbd.d]# drbdadm role r1 ##查看Node1的角色

Secondary/Secondary

[root@node2 drbd.d]# drbdadm primary r1    ##将node2变成主节点

[root@node2 drbd.d]# drbdadm role r1    ##查看Node2的角色

Primary/Secondary

[root@node2 drbd.d]# cat /proc/drbd  

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 buildby root@node2, 2014-08-20 18:01:37

 0: cs:Connected ro:Primary/Secondaryds:UpToDate/UpToDate C r-----

    ns:0 nr:10779912dw:10779912 dr:664 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 drbd.d]# mount /dev/drbd0 /data/

 [root@node2drbd.d]# ls /data/       ##看到数据同步进来了。

lost+found test

 

下面可以在里面写入数据,umount,从主切换成从,从上切换成主,查看数据的同步情况

第二节:在两台主机上都安装MYSQL实例,在主的/data目录里安装mysql数据库,进行主从切换,看数据同步情况

在主节点安装好数据库,数据目录为/data/的目录(为DRBD的挂载目录),配置文件存放在/etc/my.cnf下。备节点只要设置好basedir和my.cnf和主几点一样即可

1、数据库安装省略,在数据库里建库,建表

mysql> create database otdb;

mysql> use otdb;

mysql> create table t_players ( id intauto_increment primary key,c_userid int ,c_playername varchar(24) );

mysql> show tables;

+----------------+

| Tables_in_otdb |

+----------------+

| t_players      |

+----------------+

1 row in set (0.00 sec)

在数据库里添加新表t_players.

第三节:安装HEARTBEAT

根据系统的版本下载下应的heartbeat 的rpm包

[root@node1 ~]# cat /etc/redhat-release

CentOS release 6.4 (Final



wKioL1gl9KziMUL8AAB44RfnprY156.png-wh_50

                             

使用yum安装heartbeat

yum--enablerepo=epel install heartbeat

或报错:

运行yum报错Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

辑/etc/yum.repos.d/epel.repo,把基础的恢复,镜像的地址注释掉

#baseurl

mirrorlist

改成

baseurl

#mirrorlist

再次执行:

yum --enablerepo=epel install heartbeat

[root@node1 local]#cp/usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/

[root@node1 local]#cp/usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/

[root@node1 local]#cp/usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/

[root@node1 local]#vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

    logfile/var/log/ha-log

    logfacilitylocal0

    keepalive 2

    deadtime 30

    warntime 10

    initdead     120

    udpport 694

 

   mcast eth1 255.0.0.181 694 1 0 ##心跳广播方式,

这里需要特别说明的是,我在这里遇到两个问题,

1) ha.cf里面的心跳信息传播方式如果选择ucast会有如下报错导致服务启动不 了,在网上查资料说是内核得升级才能解决问题:

Mar 17 14:34:59 node3.xxx.com heartbeat: [24573]: ERROR: glib: ucast:error setting option SO_REUSEPORT(w): Protocol not available

Mar 17 14:34:59 node3.xxx.com heartbeat: [24573]: ERROR:make_io_childpair: cannot open ucast eth0

2) 在启动heartbeat服务之前,我没有启动drbd服务,导致下面的错误产生:

ResourceManager(default)[28960]: 2014/03/17_14:49:47 ERROR: Return code 1from /etc/ha.d/resource.d/drbddisk

碰到如此问题,可以改变检测方式

Bcast eth0检测

 #使用DRBD,一般都要置为OFF

   auto_failback off

 #PING 网关,不建议PING对端的管理ip或者心跳IP地址,可以开启PING-GROUP1设置多个IP地址,避免单一网络线路检测

    ping192.168.28.254

    node node1

node node2

 

[root@node1 local]#vi /etc/ha.d/authkeys

auth 1

  1crc

 [root@node1 local]#ll /etc/ha.d/authkeys

-rw-r--r-- 1 root root 647 Aug 27 17:27 /etc/ha.d/authkeys

[root@node1 local]# chmod 600/etc/ha.d/authkeys

禁止随机启动,防止他起在DRBD前面,而要加载/etc/rc.local里面

[root@node1 local]#chkconfig heartbeat off  (#chkconfig - - list | grep heart 查看)

[root@node1 local]# chkconfig --list |grep heart

heartbeat       0:off  1:off   2:off   3:off  4:off   5:off   6:off

[root@node1 local]# vi /etc/rc.local

service heartbeat start

[root@node1 data]#vim/etc/ha.d/haresources  #在节点1上添加如下行

Node1IPaddr::192.168.28.208/24/eth0:0 drbddisk::r1Filesystem::/dev/drbd0::/data::ext4 mysql

 

[root@node2 data]#vim/etc/ha.d/haresources  #在节点2上添加如下行

Node1IPaddr::192.168.28.208/24/eth0:0 drbddisk::r1Filesystem::/dev/drbd0::/data::ext4 mysql

上面资源组中的各项含义如下:

Node1 指当前primary节点名。192.168.28.208 指让heartbeat帮你管理一个server ip,会跟着主节点一起漂移。Drbddisk告诉heartbeat要管理drdb的资源,在这里是r1Filesystem指告诉heartbeat需要管理文件系统资源,实际上就是执行mount/umount的命令,后面跟的是设备名和mount的目录。Mysql指告诉需要管理mysql

 

IPaddr::192.168.28.208/24/eth0:0 设置虚拟IP,

drbddisk::r1 告诉heartbeat要管理DRBD的资源r1

Filesystem::/dev/drbd0::/data::ext4 设定需要挂载的DRBD设备采用的文件系统,即执行mount与umount操作

Mysql 设定要随heartbeat启动的服务

[root@node1 ~]# service heartbeat start   #DRBD先启动,在主机子上启动heartbeat,再在从机子上启动

故障解决:

Heartbeat正常启动,但是日志发现cannot locate resource script ***,进入heartbeat配置文件目录/etc/ha.d/resource.d,查看下是否存在***脚本文件;若不存在,需要建立该脚本文件。一般在相关服务安装后,在系统中会生成相关的脚本文件,可以find命令找到***的脚本文,cp或者ln到/etc/ha.d/resource.d 下即可。注意mysql脚本中用的是my.cnf文件,我们将我们的数据库配置文件设成my.cnf, 这样就不用做任何myql脚本的改动。

/etc/rc.d/init.d/mysql

/etc/ha.d/resource.d/drbddisk

脚本在后面附上

Heartbeat启动正常后,我们可以看到mysql启动,虚拟IP在主的机子上。

[root@node1 ~]#ifdown eth0  #在主的机子上断网卡eth0,看VIP漂移到从机子上不

[root@node2 data]# ip a    ##大致30秒内,看到VIP在从机上,而且MYSQL启动了

[root@node2 data]# cat /proc/drbd  ##这时会看到两节点的连接状态不一样。称为脑裂

version: 8.4.3 (api:1/proto:86-101)

GIT-hash:89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-08-2018:01:37

 0:cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r-----

   ns:120 nr:1724 dw:2672 dr:18276 al:10 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:596

 

以下是处理方法:

在现有的从节点上执行:

[root@node1 ~]# service heartbeat stop   ###也可以不执行

[root@node1 ~]# drbdadm -- --discard-my-dataconnect r1

在现在的主节点上执行:

[root@node2 data]# drbdadm disconnect r1

r1: Failure: (162) Invalid configurationrequest

additional info from kernel:

unknown connection

Command 'drbdsetup disconnectipv4:192.168.28.29:7789 ipv4:192.168.28.28:7789' terminated with exit code 10

[root@node2 data]# drbdadm connect r1

[root@node2 data]# drbdadm primary r1

[root@node2 data]# cat /proc/drbd

version: 8.4.3 (api:1/proto:86-101)

GIT-hash:89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-08-2018:01:37

 0:cs:Connected ro:Primary/Secondaryds:UpToDate/UpToDateC r-----

   ns:696 nr:0 dw:2672 dr:18972 al:10 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:0

 

在从节点上执行:

[root@node1 ~]# service heartbeat start

###若裂脑出现一个状态是uptodate/dunknow主要是是因为drbd/heartbeat设置自启动的缘故,所以要设置chkconfig drbdoff/heartbeat

解决脑裂:

在Slave节点:

#drbdadm disconnect r2

#drbdadm -- --discard-my-dataconnect r2

在主节点操作,连接下即可:

#drbdadm connect r2

###heartbeat的配置文件MS都要一致即可

检测DRBD+MYSQL+HEARTBEAT架构在数据库停止是否能够自动切换(需要MYSQL检测脚本msyqlmon.sh)

##脚本的配置的连接的用户名和密码一定要成TCP/IP方式连接,否则在线上必出问题,此脚本只要在主库后台执行即可。从库可存放一个

当在运行时候 停止数据库,查看是否会切换到备库上。