mysql+heartbeat+DRBD+LVS实现mysql高可用<一>

   在企业应用中,mysql+heartbeat+DRBD+LVS是一套成熟的集群解决方案,通过heart+DRBD实现mysql的主节点写操作的高可用性,而通过mysql+LVS实现数据库的主从复制和mysql的读操作的负载均衡。整个方案在读写方面进行了分离,融合了写操作的高可用和读操作的负载均衡,是一个完美又廉价的企业应用解决方案

   目前流行的高可用解决方案:

   mysql的复制功能是通过建立复制关系和两台和多台机器环境中,一台机器出现故障切换到另一台机器上保证一定程度的可用性

   mysql的复制功能加一些集群软件

   mysql+heartbeat+DRBD的复制功能

   共享存储+mysql的复制功能


DRBD:(分布式块设备复制)是linux内核的存储层中的一个分布式存储系统,可利用DRBD在两台linux服务器之间共享块设备、文件系统和数据。当地数据写入本地主节点的文件系统时,这些数据会通过网络发送到另一台主节点上,本地主节点和远程主节点数据通过TCP/IP协议保持同步,主节点故障时,远程节点保存着相同的数据,可以接替主节点继续提供数据。两个节点之间使用heartbeat来检测对方是否存活

   同步过程

   1:在node1上写操作被提交,通过内核传给DRBD模块

   2:DRBD发送写操作到node2

   3:在node2上的DRBD发送写操作给本地磁盘

   4:在node2上的DRBD向node1发确认信息,确认接收到写操作并发送给本地次哦按

   5:在node1上的DRBD发送写操作给本地磁盘

   6:node1内核回应写操作完成

1.配置之前的准备

   设置hostname及解析

[root@drbd1 ~]# vim /etc/hosts
192.168.253.129 drbd1
192.168.253.140 drbd2

   设置双机互信

wKiom1Mr4NjBmIo3AATvK5I6u-g244.jpg

   drbd2 同上相同的步骤



2.DRBD的部署

[root@drbd1 ~]# uname -a
Linux drbd1 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux

   安装DRBD时,应先安装所有的依赖kernel,记得重启服务器啊

[root@drbd1 ~]# yum -y install kernel kernel-devel
[root@drbd1 ~]# reboot

通过yum安装drbd服务    

   默认centos6.x中并没有提供DRBD的源,这时要么采用源码编译方法,要么使用第三方的YUM源。这里使用了http://elrepo.org/tiki/tiki-index.php提供的源

[root@drbd1 ~]#  rpm -Uvh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@drbd1 yum.repos.d]# rpm -qa | grep elrepo-release
elrepo-release-6-5.el6.elrepo.noarch

实际上就是往yum.repos.d里面添加一个源配置elrepo.repo

   使用yum  list查看,进行安装

[root@drbd1 yum.repos.d]# yum list all | grep drbd
drbd83-utils.x86_64                    8.3.16-1.el6.elrepo              elrepo
drbd84-utils.x86_64                    8.4.4-2.el6.elrepo                elrepo
kmod-drbd83.x86_64                     8.3.16-1.el6.elrepo               elrepo
kmod-drbd84.x86_64                     8.4.4-1.el6.elrepo                elrepo
[root@drbd1 ]# yum --enablerepo=elrepo install drbd83-utils kmod-drbd83

   检查DRBD是否安装完成,若安装完成,让内核加载DRBD模块

[root@drbd1 ~]# modprobe drbd
[root@drbd1 ~]# modprobe -l | grep -i drbd
weak-updates/drbd83/drbd.ko
[root@drbd1 ~]# lsmod | grep drbd
drbd                  351464  0

   如上图所示,表示安装成功了

   复制样例配置文件为即将使用的配置文件

vim /usr/share/doc/drbd83-utils-8.3.16/drbd.conf.example




3.配置DRBD

[root@drbd1 etc]#  vim /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

   配置 vim /etc/drbd.d/global_common.conf

vim /etc/drbd.d/global_common.conf
global {
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
}
common {
        protocol C;
        handlers {
                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 120;
                #degr-wfc-timeout 120;
        }
        disk {
                on-io-error detach;
                #fencing resource-only;
        }
        net {
                cram-hmac-alg "sha1";
                shared-secret "mydrbdlab";
        }
        syncer {
                rate 1000M;
        }
}

配置/etc/drbd.d/web.res

[root@drbd2 etc]# vim /etc/drbd.d/web.res
resource web {
  on drbd1 {
    device    /dev/drbd0;
    disk      /dev/sda;
    address   192.168.253.129:7789;
    meta-disk internal;
  }
  on drbd2 {
    device    /dev/drbd0;
    disk      /dev/sda;
    address   192.168.253.140:7789;
    meta-disk internal;
  }
}

   复制drbd1的配置文件到drbd2

[root@drbd1 drbd.d]# scp /etc/drbd.* drbd2:/etc/
drbd.conf                    100%  133     0.1KB/s   00:00
/etc/drbd.d: not a regular file
[root@drbd1 drbd.d]# scp /etc/drbd.d/* drbd2:/etc/drbd.d/



4.启动DRBD

   分别在(drbd1  drbd2)

   创建DRBD元数据库信息

[root@drbd1 ~]# drbdadm create-md all
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.


[root@drbd2 drbd.d]# drbdadm create-md all
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.


   创建DRBD元数据库时,可能出现以下错误

[root@drbd1 ~]# drbdadm create-md all
md_offset 21474832384
al_offset 21474799616
bm_offset 21474144256
Found ext3 filesystem
    20971520 kB data area apparently used
    20970844 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)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
Operation refused.
Command 'drbdmeta 0 v08 /dev/sda internal create-md' terminated with exit code 40
drbdadm create-md web: exited with code 40

   这时需要如下命令覆盖文件系统中的设备块信息

[root@drbd1 ~]# dd if=/dev/zero of=/dev/sda bs=1M count=128
记录了128+0 的读入
记录了128+0 的写出
134217728字节(134 MB)已复制,0.448662 秒,299 MB/秒

    再重创建DRBD数据库,启动DRBD服务,可以通过dmesg命令查看DRBD的启动过程

[root@drbd1 drbd.d]# /etc/init.d/drbd start
Starting DRBD resources: [ d(web) s(web) n(web) ]..........


[root@drbd2 drbd.d]# /etc/init.d/drbd  start
Starting DRBD resources: [ d(web) s(web) n(web) ]..........

   关闭防火墙,或者开放端口,否则两台服务器不能进行通信,会失败的

[root@drbd1 drbd.d]# service iptables stop
iptables:清除防火墙规则:                                 [确定]
iptables:将链设置为政策 ACCEPT:filter                    [确定]
iptables:正在卸载模块:                                   [确定]

   在drbd1上设置为主节点

[root@drbd1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary all
    此命令把此节点设置为primary节点,从头开始同步

   格式化文件系统drbd0

wKiom1Mr5nnCoWSGAAQ94Dh0C1c573.jpg


   正常启动DRBD之查看其状态

wKioL1Mr3YTQ0fB1AARTHIbs3S4638.jpg

wKioL1Mr3YTTVL8-AAKlVf20-vY393.jpg

从第一张图片看出,主、备机的状态分别为Primary和Secondary,主机磁盘状态为UpToDate,备机磁盘状态为Inconsistent,同时还可以看出数据正在同步中,即主机正在将磁盘上的数据传递到备用机上

   现在是同步完成后的状态

wKiom1Mr3xvjxJIcAAHHamXzLFA733.jpg

wKioL1Mr3vTRAzh1AAHYdh6c6go896.jpg

从输出信息看,磁盘状态为UpToDate,表示数据同步完成

ro:角色信息

   ds:磁盘状态,显示数据是否一致

   ns:网络发送的数据包    

   dw:磁盘写操作

   dr:磁盘读操作


5.DRBD的维护和管理

   挂载DRBD分区之前,首先确认当前主机的DRBD分区是Primary状态,可以从cat /proc/drbd 命令中查询节点状态

wKioL1Mr47Gg2rr_AAESgR8NN_U269.jpg

Primary/Secondary:表示当前服务器为Primary状态,可以执行挂载操作,如果显示为“

Secondary/Primary”表示当前主机为Secondary状态,处于这个状态的主机不能对DRBD设备执行挂载操作

   如果当前是Secondary状态,可以通过命令 drbdadm primary all,把当前主机更改为Primary状态

   挂载DRBD的分区到/database目录

wKiom1Mr5xKQkUI8AAM9ExpsHq8824.jpg

DRBD设备角色切换

   分为两种情况,停止drbd服务切换和正常切换

   (1)停止服务切换

   停止服务后,此时挂载的drbd分区就自动在主节点卸载了,然后在备用节点上执行切换命令wKiom1Mr5-KDmv7XAABIJ9JwMWY998.jpg

   如果出现报错信息,就执行如下命令

wKioL1Mr6DiixG4bAABsALUmPIQ689.jpg

   此时节点就正常切换了,挡在备用节点执行主节点命令后,原来的主节点就变成了备节点,无需在主节点执行备节点的命令,再进行挂载

   (2)正常切换

   在主节点卸载磁盘挂载分区,然后执行在主节点执行如下命令

wKiom1Mr6WWCfA9YAABN7nvpWSk286.jpg

   如果不执行这个命令,直接在备用节点上执行主节点命令会报错,接着在备用节点上执行

wKioL1Mr6bKRgMENAABIJ9JwMWY308.jpg

   再进行挂载磁盘分区



注:启动drbd服务之后,设置主节点,出现以下错误

[root@drbd1 drbd.d]# cat /proc/drbd
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2013-09-27 16:00:43
 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s
    ns:0 nr:0 dw:0 dr:664 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20970844

解决办法:是因为两台服务器未关闭防火墙,之间不能进行通信造成的,关闭防火墙,或开放端口

你可能感兴趣的:(mysql的高可用)