mysql+heartbeat+DRBD+LVS實現mysql高可用<一>

   在企業應用中,mysql+heartbeat+DRBD+LVS是一套成熟的集羣解決方案,經過heart+DRBD實現mysql的主節點寫操做的高可用性,而經過mysql+LVS實現數據庫的主從複製和mysql的讀操做的負載均衡。整個方案在讀寫方面進行了分離,融合了寫操做的高可用和讀操做的負載均衡,是一個完美又廉價的企業應用解決方案
php

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

   mysql的複製功能是經過創建複製關係和兩臺和多臺機器環境中,一臺機器出現故障切換到另外一臺機器上保證必定程度的可用性
python

   mysql的複製功能加一些集羣軟件
mysql

   mysql+heartbeat+DRBD的複製功能
linux

   共享存儲+mysql的複製功能
web


DRBD:(分佈式塊設備複製)是linux內核的存儲層中的一個分佈式存儲系統,可利用DRBD在兩臺linux服務器之間共享塊設備、文件系統和數據。當地數據寫入本地主節點的文件系統時,這些數據會經過網絡發送到另外一臺主節點上,本地主節點和遠程主節點數據經過TCP/IP協議保持同步,主節點故障時,遠程節點保存着相同的數據,能夠接替主節點繼續提供數據。兩個節點之間使用heartbeat來檢測對方是否存活sql

   同步過程
數據庫

   1:在node1上寫操做被提交,經過內核傳給DRBD模塊
vim

   2:DRBD發送寫操做到node2
centos

   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

解決辦法:是由於兩臺服務器未關閉防火牆,之間不能進行通訊形成的,關閉防火牆,或開放端口

相關文章
相關標籤/搜索