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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章