DRBD(Distributed Replicated Block Device)
Distributed Replicated Block Device(DRBD)是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲復制解決方案。
1.環境介紹
兩台Centos6.5
test01 eth0 192.168.1.88
ech1 192.168.10.88(用作DRBD)
兩硬盤 /dev/sda /dev/sdb
test01 eth0 192.168.1.99
ech1 192.168.10.99(用作DRBD)
兩硬盤 /dev/sda /dev/sdb
##添加yum源(163yum)
cd /etc/yum.repos.d/
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
sed -i '/mirrorlist/d' CentOS-Base-163.repo
sed -i '/\[addons\]/,/^$/d' CentOS-Base-163.repo
sed -i 's/\$releasever/6/' CentOS-Base-163.repo
sed -i 's/RPM-GPG-KEY-CentOS-5/RPM-GPG-KEY-CentOS-6/' CentOS-Base-163.repo
#清理並重新生成yum緩存
yum clean metadata
yum makecache
#######注意事項
(1) 修改/etc/hosts文件 。使之互相解析的test01和test02為eth2接口IP。
(2) 關閉selinux(setenforce 0)關閉iptables (service iptables stop)或者寫入規則。
2.DRBD安裝
(1) 首先我們要升級內核,升級之後我們重啟 yum -y update kernel*
yum install kernel-devel 這裡請注意要加載新的內核
(2) rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
(3) 安裝DRBD yum -y install drbd83-utils kmod-drbd8
(4) 加載DRBD模塊到內核 modprobe drbd
(5) 檢測DRBD是否安裝成功 lsmod | grep drbd #lsmod = list modules
%%%%%kernel*不升級的話 可能會導致加載DRBD模塊到內核失敗。
(6) modprobe -l | grep -i drbd 可以查看路徑
安裝完成後會在/etc/init.d/drbd生成啟動腳本
3.初始化磁盤
(1) 首先使用fdisk –l 確定你新加虛擬磁盤的盤號
(2) 使用fdisk /dev/盤號 進行分區不需要格式化
4.DRBD配置
(DRBD的配置文件主要分三個比分:global、common和resource。在運行的時候默認讀取配置文件的路徑是/etc/drbd.conf,這個文件描述了DRBD的一些配置參數以及設備與硬盤分區的映射關系,默認情況下是空的,不過在DRBD的源代碼包中包含了配置文件的樣例)
一般情況下global_common.conf(本次實驗文件所在目錄/etc/drbd.d/)文件僅包含global和common部為分配置(理解全局配置),在/etc/drbd.d/*.res的文件定義於一個資源(理解為主機定義)。
其實可以將DRBD配置整合到drbd.conf文件中,不過這樣做在資源比較多的情況下會變得混亂。
(1) 本次采用分布式配置首先我們來配置/etc/drbd.d/global_common.conf
內容如下:
global {
usage-count no; #是否參加DRBD使用者統計,默認是參加
}
common {
syncer {rate 200M;} #主節點和備用節點同步時最大的網絡速率
protocol C; #使用DRBD的第三種同步協議,表示收到遠程主機的寫入確認後認為寫入完成
handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ;halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ;halt -f";
local-io-error "echo o >/proc/sysrq-trigger ;halt -f";
fence-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";
pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert'root";
split-brain "/usr/lib/drbd/notify-splot-brain.sh root";
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
}
net { #DRBD同步時使用的驗證方式和密碼
cram-hmac-alg "sha1";
shared-secret "MySQL-HA";
}
disk { #使用dpod功能(drbd outdate-peer daemon)保證數據在同步時不能進行切換
on-io-error detach;
fencing resource-only;
}
startup {
wfc-timeout 120;
degr-wfc-timeout 120;
}
}
(2) 其次我們在drbd.d目錄下創建以.res為後綴的文件,本次創建的文件是drbd.res目錄是/etc/drbd.d/
內容如下:(兩台同時)
resource r0 { #定義資源名稱為r0
on test01 { #每個主機的說明以on開頭 後面是主機名hostname
device /dev/drbd0; #定義DRBD使用磁盤的邏輯路徑
disk /dev/sdb1; #/dev/drbd0 使用的磁盤分區
address 192.168.1.13:7788; #設置DRBD的監聽端口,與另一台主機通信
meta-disk internal; #DRBD元數據存放方式 internal 內部
}
on test02 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.12:7788;
meta-disk internal;
}
}
(3) 創建haclient組並設置權限 原因是:我們會使用drbd-peer-outdater fence-peer程序。使用該機制dopd心跳插件程序,就需要能夠調用drbdsetup和drbdmeta根特權。
命令如下:(兩台同時)
groupadd haclient
chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta
(4) 在啟動DBRD之前,需要分別在兩台主機上的指定分區(這裡是sdb4)上創建提供DRBD記錄信息的數據塊
drbdadm create-md r0(r0表示之前定義的資源)或者執行drbdadm create-md all
正確的提示是:
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
%%%%%%%%%%drbdadm create-md r0: exited with code 40
解決辦法:初始化磁盤文件格式, dd if=/dev/zero bs=1M count=1 of=/dev/sdb; sync
(5) 在兩個節點上啟動DRBD服務 服務腳本位於/etc/init.d/drbd
/etc/init.d/drbd start
(6) 執行cat /proc/drbd
輸出內容如下
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10482024
輸出解釋:
ro表示角色信息,第一次啟動DRBD時,兩個節點默認都處於Secondary狀態
ds表示磁盤狀態信息,“Inconsistent/Inconsistent”即 “不一致/不一致”狀態表示兩個節點的磁盤數據不一樣
ns表示網絡發送的數據包信息
dw表示磁盤寫信息
dr表示磁盤讀信息
(7) 設置主用節點在默認情況下沒有主用節點和備用節點之分因此需要設置兩個主機的主次,選擇需要設置為主用節點的主機執行以下命令
drbdsetup /dev/drbd0 primary -o 也可以執行以下命令 drbdadm -- --overwrite-data-of-peer primary all
執行之後需要設置哪個主用節點就可以使用另一條命令
/sbin/drbdadm primary r0 或者/sbin/drbdadm primary all
稍等片刻後查看/proc/drbd
輸出如下:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:10482024 nr:0 dw:0 dr:10482696 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
ro的狀態變成Primary/Secondary
ds狀態也變成UpToDate/UpToDate 表示實時同步
(8) 掛載DRBD設備在主節點上掛載以下操作
mkfs.ext4 /dev/drbd0
mount /dev/drbd0 /mnt (這裡是掛載到mnt下根據需要自行掛載)
(9) 測試DRBD數據鏡像
在主節點卸載磁盤分區,然後執行
[root@drbd1 ~]#drbdadm secondary all
如果不執行這個命令,直接在備用節點執行切換到主節點的命令,會報錯:
2: State change failed: (-1) Multiple primaries not allowed by config
Command 'drbdsetup 2 primary' terminated with exit code 11
接著,在備用節點執行
[root@test02 ~]#drbdadm primary all
最後在備用節點掛載磁盤分區即可:
[root@test02 ~]#mount /dev/drbd0 /mnt
3、注意點
1)mount drbd設備以前必須把設備切換到primary狀態。
2)兩個節點中,同一時刻只能有一台處於primary狀態,另一台處於secondary狀態。
3)處於secondary狀態的服務器上不能加載drbd設備。
4)主備服務器同步的兩個分區大小最好相同,這樣不至於浪費磁盤空間,因為drbd磁盤鏡像相當於網絡raid 1。
DRBD的管理維護
創建DRBD資源
配置好drbd以後,就需要使用命令在dbserver1和dbserver2上創建配置的drbd資源,使用如下命令:
drbdadm create-md r0# r0為配置文件中定義的資源名
DRBD的啟動和停止
/etc/rc.d/init.d/drbd start#啟動drbd
/etc/rc.d/init.d/drbd stop#停止drbd
/etc/rc.d/init.d/drbd restart#重啟drbd
查看DRBD狀態
watch -n 1 cat /proc/drbd
/etc/init.d/drbd status
以上兩種方式都可以查看drbd的狀態
設置當前節點為主節點,並進行格式化和掛載
drbdadm -- --overwrite-data-of-peer primary all
mkfs.ext3 /dev/drbd0
mkdir /drbd
mount /dev/drbd0 /drbd
掛在後可以往/drbd目錄寫入一些測試數據,看看是否能同步到從節點上。
遷移mysql的數據到drdb(假設你的mysql已經在該服務器上安裝好了)
DRBD已經安裝並且能正常同步了,那麼我們接下來要做的就是將本機的已安裝的mysql的數據遷移到drbd上,這裡為了簡單就不考慮新安裝數據庫的情形了,因為新安裝的時候只需要將數據目錄指定到drbd中並將my.cnf配置文件放到drbd中即可。具體的數據遷移步驟如下:
關閉dbserver1和dbserver2的mysql,/etc/rc.d/init.d/mysqld stop
在dbserver1上創建存放數據庫數據的目錄:mkdir /drbd/dbdata
在dbserver1將配置文件放到drbd目錄中:
mv /etc/my.cnf /drbd/dbdata/
刪除dbserver2上的/etc/my.cnf,rm -f /etc/my.cnf
在dbserver1和dbserver2上執行如下命令創建軟鏈接。
ln -s /drbd/dbdata/my.cnf /etc/my.cnf
修改/etc/my.cnf的數據目錄指向/drbd/dbdata
將原來的mysql數據文件移動到/drbd/dbdata
執行chown -R mysql.mysql /drbd/dbdata
啟動mysql
手工切換DRBD
在沒有安裝配置drbd之前,drbd是不能自動切換的,我們可以寫出過程來加深對drbd的理解,也更能明白heartbeat的工作流程,下面是手工切換的步驟:
在dbserver1上停止mysql,/etc/rc.d/init.d/mysqld stop。
在dbserver1上執行umount /dev/drbd0。
在dbserver1上執行drbdadm secondary all切換到從模式。當兩個節點都是secondary模式的時候才可以將dbserver2設置成primary。
在dbserver2上執行drbdadmprimary all,將dbserver2提升為主模式,並觀察/proc/drbd是否正常。
在dbserver2上執行mount /dev/drbd0 /drbd掛在文件系統。
啟動dbserver2的mysql,/etc/rc.d/init.d/mysqld start。
注意:dbserver1和dbserver2上的mysql用戶的uid和gid要一樣。不然切換後會導致mysql數據目錄的屬主不正確而啟動失敗。
主從切換
主切換成從,需要先卸載文件系統,再執行降級為從的命令:
umount /dev/drbd0
drbdadm secondary all
從切換成主,要先執行升級成主的命令然後掛在文件系統:
drbdadmprimary all如果不成功drbdsetup /dev/drbd0 primary -o
mount /dev/drbd0 /drbd/
DRBD腦裂後的處理
當DRBD出現腦裂後,會導致drbd兩邊的磁盤不一致,處理方法如下:
在確定要作為從的節點上切換成secondary,並放棄該資源的數據:
drbdadm secondary r0
drbdadm -- --discard-my-data connect r0
在要作為primary的節點重新連接secondary(如果這個節點當前的連接狀態為WFConnection的話,可以省略),使用如下命令連接:
drbdadm connect r0
http://xxxxxx/Linuxjc/1134373.html TechArticle