在企業應用中,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
設置雙機互信
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
正常啓動DRBD之查看其狀態
從第一張圖片看出,主、備機的狀態分別爲Primary和Secondary,主機磁盤狀態爲UpToDate,備機磁盤狀態爲Inconsistent,同時還能夠看出數據正在同步中,即主機正在將磁盤上的數據傳遞到備用機上
如今是同步完成後的狀態
從輸出信息看,磁盤狀態爲UpToDate,表示數據同步完成
ro:角色信息
ds:磁盤狀態,顯示數據是否一致
ns:網絡發送的數據包
dw:磁盤寫操做
dr:磁盤讀操做
5.DRBD的維護和管理
掛載DRBD分區以前,首先確認當前主機的DRBD分區是Primary狀態,能夠從cat /proc/drbd 命令中查詢節點狀態
Primary/Secondary:表示當前服務器爲Primary狀態,能夠執行掛載操做,若是顯示爲「
Secondary/Primary」表示當前主機爲Secondary狀態,處於這個狀態的主機不能對DRBD設備執行掛載操做
若是當前是Secondary狀態,能夠經過命令 drbdadm primary all,把當前主機更改成Primary狀態
掛載DRBD的分區到/database目錄
DRBD設備角色切換
分爲兩種狀況,中止drbd服務切換和正常切換
(1)中止服務切換
中止服務後,此時掛載的drbd分區就自動在主節點卸載了,而後在備用節點上執行切換命令
若是出現報錯信息,就執行以下命令
此時節點就正常切換了,擋在備用節點執行主節點命令後,原來的主節點就變成了備節點,無需在主節點執行備節點的命令,再進行掛載
(2)正常切換
在主節點卸載磁盤掛載分區,而後執行在主節點執行以下命令
若是不執行這個命令,直接在備用節點上執行主節點命令會報錯,接着在備用節點上執行
再進行掛載磁盤分區
注:啓動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
解決辦法:是由於兩臺服務器未關閉防火牆,之間不能進行通訊形成的,關閉防火牆,或開放端口