利用heartbeat和drbd實現HDFS的雙機熱備


利用heartbeat和drbd實現HDFS的雙機熱備

              written by aaronwxb,2012.03.30

主要原理:

利用DRBD實現共享存儲空間,在主服務器(primary)將元數據寫入本機時同時要寫入備份節點(secondary),才算一次寫操作完成,實現元數據的實時備份。

利用heartbeat實現自動切換功能,雙方之間發送心跳,若備份節點一旦其無法檢測到主服務器的“心跳”則自動接管主服務器的資源。

 

虛擬機環境配置:

用vbox安裝虛擬機,OS為ubuntu11.10,虛擬機雙網卡,網卡配置為橋接方式,主要設置如下:

主機

IP地址

配置

master(主節點)

eth0: 192.168.123.41

eth1: 192.168.123.42 (HA心跳使用地址)

eth0:0: 192.168.123.40 (虛擬IP)

 

容量:G

接口標准:

轉速:rpm

緩存容量:M

平均尋道時間:ms

傳輸標准:

backup(從節點)

eth0: 192.168.123.44

eth1: 192.168.123.46 (HA心跳使用地址)

eth0:0: 192.168.123.40 (虛擬IP)

 

容量:G

接口標准:

轉速:rpm

緩存容量:M

平均尋道時間:ms

傳輸標准:

slave(數據節點)

eth0:192.168.123.47

 

 

master:

網卡配置:

bobo@master:~$ cat /etc/network/interfaces

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

address    192.168.123.41

netmask  255.255.255.0

gateway 192.168.123.1

 

auto eth1

iface eth1 inet static

address 192.168.123.42

netmask 255.255.255.0

 

hosts文件

bobo@master:~$ cat /etc/hosts

127.0.0.1  localhost

127.0.1.1  bobo-VirtualBox

 

192.168.123.41         master

192.168.123.44         backup

192.168.123.47         slave

 

192.168.123.40         vip

 

192.168.123.42         master

192.168.123.46         backup

 

backup:

網卡配置:

bobo@backup:~$ cat /etc/network/interfaces

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

address    192.168.123.44

netmask  255.255.255.0

gateway 192.168.123.1

 

auto eth1

iface eth1 inet static

address 192.168.123.46

netmask 255.255.255.0

 

hosts文件

同master

slave(datanode):

網卡配置:

bobo@slave:~$ cat /etc/network/interfaces

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

address    192.168.123.47

netmask  255.255.255.0

gateway 192.168.123.1

hosts文件

同master

 

配置SSH無密碼訪問:

master

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

cat ~/.ssh/id_dsa.pub >> authorized_keys

 

backup

 

關閉selinux(所有機器)

SELinux是一種基於 域-類型 模型(domain-type)的強制訪問控制(MAC)安全系統,它由NSA編寫並設計成內核模塊包含到內核中,相應的某些安全相關的應用也被打了SELinux的補丁,最后還有一個相應的安全策略。Lustre存儲服務器和元數據目錄服務器通信會使用一些特殊端口,最好關閉SELINUX。

編輯文件/etc/sysconfig/selinux,設置:

SELINUX=disabled

然后reboot

 

沒有selinux

 

關閉防火牆(所有機器)

如果系統啟動了Iptables服務,需要為相關服務打開端口 (988, 1021 ~ 1023等),簡單的處理是關閉防火牆。

#清除規則

iptables –F

#保存

service iptables save

chkconfig --level 2345 iptables off

service iptables stop

 

沒有防火牆ufw

iptables沒有開啟,默認都是ACCEPT

 

DRBD部署

原理

DRBD(Distributed Replicated Block Device)是基於Linux系統下的塊復制分發設備。它可以實時的同步遠端主機和本地主機之間的數據,類似與Raid1的功能,我們可以將它看作為網絡 Raid1。在服務器上部署使用DRBD,可以用它代替共享磁盤陣列的功能,因為數據同時存在於本地和遠端的服務器上,當本地服務器出現故障時,可以使用遠端服務器上的數據繼續工作,如果要實現無間斷的服務,可以通過drbd結合另一個開源工具heartbeat,實現服務的無縫接管。DRBD的工作原理如下圖:

 

編譯linux內核

由於2.4.9缺少CONNECTOR,導致drbd無法安裝,因此必須編譯內核。

 

linux內核2.6之后就帶有CONNECTOR,這里用的是:

bobo@master:~$ uname -a

Linux master 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:50:42 UTC 2011 i686 i686 i386 GNU/Linux

 

安裝drbd

分別在兩台主機上安裝。

sudo apt-get install drbd8-utils

 

配置drbd

1.DRBD使用的硬盤分區

這兩個分區的大小必須相同。

 

為虛擬機master和backup添加一塊虛擬硬盤,大小為2G,利用fdisk分區,得到:

Disk /dev/sdb: 2147 MB, 2147483648 bytes

22 heads, 16 sectors/track, 11915 cylinders, total 4194304 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x80d3501f

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     4194303     2096128    5  Extended

/dev/sdb5            4096     4194303     2095104   83  Linux

我們指定兩台主機的/dev/sdb5分區作為DRBD的使用的分區.這兩個分區大小都為2G。分區需為空白。

主機1 :master, IP地址為 192.168.123.42,DRBD分區為/dev/sdb5

主機2 :backup,IP地址為 192.168.123.46,DRBD分區為/dev/sdb5

這里用eth1作為兩個主機的通信接口。

 

2.drbd.conf配置文件

DRBD運行時,會讀取一個配置文件/etc/drbd.conf。這個文件里描述了DRBD設備與硬盤分區的映射關系,和DRBD的一些配置參數:

       # 是否參加DRBD使用者統計.默認是yes

       global { usage-count yes; }

       # 設置主備節點同步時的網絡速率最大值,單位是字節.

       common { syncer { rate10M; } }

       # 一個DRBD設備(即:/dev/drbdX),叫做一個"資源".里面包含一個DRBD設備的主備節點的相關信息.

       resource r0 {

            # 使用協議C.表示收到遠程主機的寫入確認后,則認為寫入完成.

           protocol C;

           disk {

                        on-io-error   detach;

            }

                net {

             #見其他——split brain問題處理

after-sb-0pri discard-younger-primary;

                                  after-sb-1pri discard-secondary;

                                  after-sb-2pri call-pri-lost-after-sb;

             rr-conflict disconnect; #incompatible resync decision

            }

                   syncer {

            rate10M;    #(設置網絡同步速率)

             al-extents 257;      #A higher number of extents gives longer resync times but less updates to the meta-data. The default number of extents is 127. (Minimum: 7, Maximum: 3843)

                        }

            # 每個主機的說明以"on"開頭,后面是主機名.在后面的{}中為這個主機的配置.

            on master {

                 # /dev/drbd1使用的磁盤分區是/dev/hdb1

                 device    /dev/drbd0;

                 disk      /dev/sdb5;                    #/dev/hdb5;

                 # 設置DRBD的監聽端口,用於與另一台主機通信

                 address   192.168.123.42:7788;

                 flexible-meta-disk internal;

            }

            on backup {

                 device    /dev/drbd0;

                 disk      /dev/sdb5;                    #/dev/hda5;

                 address   192.168.123.46:7788;

                 flexible-meta-disk internal;

            }

       }

3 將drbd.conf文件復制到備機上

scp /etc/drbd.conf backup:/etc

初始化drbd

1、加載模塊

drbd采用的是模塊控制的方式,所以先要加載drbd.ko 模塊

#insmod drbd.ko或者modprobe drbd

使用lsmod來查看模塊是否加載成功。

 

成功

Module                  Size  Used by

nls_utf8               12493  1

isofs                  39549  1

drbd                  260222  4

2、主備創建數據塊

drbdadm create-md r0

3、主備啟動drbd

/etc/init.d/drbd start

 

bobo@master:~$ cat /proc/drbd

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 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:2095004

 

bobo@backup:/etc$ cat /proc/drbd

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 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:2095004

 

4、設置主節點

在master上執行以下命令,設置master為主節點:

sudo drbdadm -- --overwrite-data-of-peer primary all

 

5、查看連接

netstat -atn的輸出結果,說明兩台機器的drbd服務已經連接上了:

tcp        0      0 192.168.1.42:57769      192.168.1.46:7788    ESTABLISHED

tcp        0      0 192.168.1.42:7788       192.168.1.46:33762   ESTABLISHED

 

6、查看同步狀態

cat /proc/drbd

主節點上執行這個命令后的結果,顯示數據正在同步中:

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----

    ns:62464 nr:0 dw:0 dr:63264 al:0 bm:3 lo:7 pe:0 ua:8 ap:0 ep:1 wo:f oos:2032540

[>....................] sync'ed:  3.2% (2032540/2095004)K

finish: 0:03:14 speed: 10,408 (10,408) K/sec

 

等待同步完畢

7、創建文件系統

在主節點上的設備/dev/drbd0上創建一個文件系統,可以把DRBD設備掛載到/mnt/drbd目錄上使用。從節點的DRBD設備無法被掛載,因為它是用來接收主機數據的,由DRBD負責操作。因此不需要這個過程。在master上執行:

mkfs.ext3 /dev/drbd0

mkdir /mnt/drbd

mount /dev/drbd0  /mnt/drbd

查看掛載結果:

df

/dev/drbd0            30963708    176200  29214644   1% /mnt/drbd

8、設置drbd開機自動啟動

chkconfig drbd on

 

 

主備機切換

有時,需要將DRBD的主備機互換一下,可以執行下面的操作:

1、在主節點上,先要卸載掉DRBD設備。

sudo umount /mnt/drbd0

2、將主節點master降級為“從節點”:

sudo drbdadm secondary r0

3、在從節點backup上,將它升級為“主節點”:

sudo drbdadm primary r0

4、在從節點backup上,掛載drbd設備

sudo mount /dev/drbd0  /mnt/drbd

 

drbd手動切換同步測試

1)在master上

cd /mnt/drbd

dd if=/dev/zero of=/mnt/drbd/testfile bs=104857600 count=2

umount /mnt/drbd

drbdadm secondary all

 

2)在backup上

drbdadm primary all

mkdir -p /mnt/drbd

mount /dev/drbd0 /mnt/drbd

ls -l /mnt/drbd

可以看到文件testfile在主節點寫入,在從節點馬上可以看到。

 

heartbeat部署

安裝heartbeat

先在主節點上安裝,命令如下:

sudo apt-get install heartbeat

 

配置

/etc/ha.d/ha.cf定義位於不同節點上的heartbeat進程間如何進行通信/etc/ha.d/authkeys 定義Heartbeat包在通信過程中如何進行加密

/etc/ha.d/haresources 定義對某個資源來說哪個服務器是主節點,以及哪個節點應該擁有客戶端訪問資源時的目標IP地址

 

配置/etc/ha.d/ha.cf

配置heartbeat守護進程使用交叉網絡發送和接收心跳數據包。

1、 解壓/usr/share/doc/heartbeat/ha.cf樣本配置文件:

sudo gunzip ha.cf.gz

 

2、 使用下面的命令將樣本配置文件復制到適當的位置:

sudo cp ha.cf /etc/ha.d/ha.cf

 

3、 編輯/etc/ha.d/ha.cf文件,取消注釋符號或增加以下內容:

logfile /var/log/ha-log

#heartbeat的日志文件 

udpport 694    

#設置廣播通信使用的端口,694為默認使用的端口號

ucast eth1 192.168.123.46

#采用單播ucast方式,使用網卡eth1在主服務器和備用服務器之間發送心跳消息。指定對端ip,即在master上指定192.168.123.46,在backup上指定192.168.123.42

 

4、 同時,取消keepalive,deadtime和initdead這三行的注釋符號:

keepalive 2

#心跳消息之間的時間間隔,默認時間單位為秒 

deadtime 30

#超出該時間間隔未收到對方節點的心跳,則認為對方已經死亡。 

warntime 10

#超出該時間間隔未收到對方節點的心跳,則發出警告並記錄到日志中。 

initdead 120

#在某些系統上,系統啟動或重啟之后需要經過一段時間網絡才能正常工作,選項用於解決這種情況產生的時間間隔。取值至少為deadtime的兩倍。 

 

5、添加下面兩行:

node master

node backup

 

#這里填寫主、備用服務器的名字(uname -n命令返回的值)。

6、使用Heartbeat重新啟動守護進程

指定與heartbeat一同啟動和關閉的進程,該進程被自動監視,遇到故障則重新啟動。

最常用的進程是ipfail,該進程用於檢測和處理網絡故障,需要配合ping語句指定的ping node來檢測網絡連接。在/etc/ha.d/ha.cf中使用下面這樣一行:

ping 192.168.123.1  #一般ping網關,不能ping集群中的節點

respawn root /usr/lib/heartbeat/ipfail

apiauth ipfail gid=root uid=root #執行ipfail的用戶和組ID

 

7、auto_failback的相關配置

用於決定,當擁有該資源的屬主恢復之后,資源是否變遷:是遷移到主上(設置為on),還是在當前節點上繼續運行,直到當前節點出現故障(off)。

 

auto_failback off

 

8、STONITH配置

stonith_host master null backup

stonith_host backup null master

# stonith的主要作用是使出現問題的節點從集群環境中脫離,進而釋放集群資源,避免兩個節點爭用一個資源的情形發生。保證共享數據的安全性和完整性。 

 

配置/etc/ha.d/authkeys

authkeys文件用於heartbeat的鑒權設置,共有三種可用的鑒權方式:crc、md5和sha1。三種方式安全性依次提高,但同時占用的系統資源也依次擴大。crc安全性最低,適用於物理上比較安全的網絡,sha1提供最為有效的鑒權方式,占用的系統資源也最多。 

其配置語句格式如下: 

auth <number> 

<number> <authmethod> [<authkey>] 

 

1、 將authkeys文件復制到適當的位置:

cp /usr/share/doc/heartbeat/authkeys /etc/ha.d

2、 編輯/etc/ha.d/authkeys文件,取消下面兩行內容前的注釋符號:

auth1

1 crc

3、 確保authkeys文件只能由root讀取:

chmod 600 /etc/ha.d/authkeys

 

配置/etc/ha.d/haresources

格式如下:

primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2]

主服務擁有的資源的名字,它告訴heartbeat程序哪個機器擁有某個資源,資源名實際上是/etc/init.d目錄或/etc/ha.d/resource.d目錄下的一個腳本。(這個腳本的副本必須同時存在於主服務器和備用服務器上)

 

master 192.168.123.40 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs

 

在備用服務器上安裝Heartbeat

安裝完包之后,直接在主服務器上執行下面的命令復制所有配置文件到備用服務器上:

scp -r /etc/ha.d backup:/etc/ha.d

scp命令是安全復制命令,它使用SSH協議在兩個節點之間復制數據,-r選項指定scp復制主服務器上/etc/ha.d目錄下的所有文件和所有子目錄。

 

啟動Heartbeat

1 在主服務器和備用服務器上把heartbeat配置為開機自動啟動

chkconfig --level 35 heartbeat on

 

2 手工啟停方法

/etc/init.d/heartbeat start

或者

service heartbeat start

/etc/init.d/heartbeat stop

或者

service heartbeat stop

 

 

heartbeat自動切換測試

1)啟動heartbeat

在master和backup上執行:

/etc/init.d/heartbeat start

 

已經啟動

 

2)在master上到ifconfig

可以看到虛擬IP已經啟動

eth0:0    Link encap:Ethernet  HWaddr 00:11:D8:94:C6:1C 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

3)在master上停止heartbeat服務或關機

/etc/init.d/heartbeat stop

 

4)在backup上ifconfig

可以看到虛擬IP已經啟動

eth0:0    Link encap:Ethernet  HWaddr 00:11:2F:85:F9:DD 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

 

通過haresources配置自動切換

如果不使用heartbeat的情況下,DRBD只能手工切換主從關系,現在修改heartbeat的配置文件,使DRBD可以通過heartbeat自動切換。

 

創建資源腳本

1 新建腳本hdfs,用於啟停hdfs文件系統,內容如下:

cd /etc/ha.d/resource.d

vi hdfs

#!/bin/sh

case "$1" in

start)

# Start commands go here

cd /home/bobo/hadoop-0.20.203.0/bin

msg=` su - bobo -c "sh /home/bobo/hadoop-0.20.203.0/bin/start-dfs.sh"`

logger $msg

;;

stop)

# Stop commands go here

cd /home/bobo/hadoop-0.20.203.0/bin

msg=` su - bobo -c "sh /home/bobo/hadoop-0.20.203.0/bin/stop-dfs.sh"`

logger $msg

;;

status)

# Status commands go here

;;

esac

 

2 修改權限

chmod 755 /etc/ha.d/resource.d/hdfs

 

3 把腳本拷貝到備份機並同樣修改權限

scp /etc/ha.d/resource.d/hdfs backup: /etc/ha.d/resource.d/

chmod 755 /etc/ha.d/resource.d/hdfs

 

配置haresources

1 修改/etc/ha.d/haresources

vi /etc/ha.d/haresources

master 192.168.123.40 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs

 

注釋:

master                               主服務器名

192.168.123.40                     對外服務IP別名

drbddisk::r0                         資源drbddisk,參數為r0

Filesystem::/dev/drbd0::/mnt/drbd::ext3  資源Filesystem,mount設備/dev/drbd0到/mnt/drbd目錄,類型為ext3

hdfs                           hdfs文件系統資源

 

 

drbd,heartbeat,hdfs聯調測試

測試1 創建文件和目錄

1、41上heartbeat和drbd啟動

由於41為主節點,在啟動heartbeat服務后,虛擬地址192.168.123.40被配置到master上,同時掛載了drbd文件系統在/mnt/drbd。

1)執行ifconfig可以看到

eth0:0    Link encap:Ethernet  HWaddr 00:11:D8:94:C6:1C 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

2)在41上執行cat /proc/drbd,可以看到41和44之間同步正常,41為主節點

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:84 nr:8 dw:88 dr:2058 al:2 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

3)在44上執行cat /proc/drbd,可以看到44和41之間同步正常,44為備份節點

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----

    ns:8 nr:84 dw:92 dr:1025 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

4)在41上執行df,看到drbd已掛載

/dev/drbd0             2062060     35876   1921436   2% /mnt/drbd

 

2、在hdfs文件系統創建目錄

# 必須切換到hdfs用戶才可以訪問hdfs文件系統

# su bobo

cd /home/hdfs/hdfsinstall/hadoop/bin

# 創建目錄testdir

hadoop  dfs  -mkdir  testdir

 

3、把本地文件hello拷貝到HDFS的根目錄下

hadoop dfs -put ~/hadoopfile/1.file testfile

 

4、查看現有的文件和目錄

Found 2 items

drwxr-xr-x   - bobo supergroup          0 2012-03-26 01:24 /user/bobo/testdir

-rw-r--r--   1 bobo supergroup          0 2012-03-26 01:26 /user/bobo/testfile

 

測試2 主備節點切換

1、在41上停止heartbeat

在41上執行sudo service heartbeat stop

 

2、查看44

1)執行ifconfig可以看到虛擬ip已經切換到44上

eth1:0    Link encap:以太網  硬件地址 08:00:27:9a:2a:f5 

          inet 地址:192.168.1.40  廣播:192.168.1.255  掩碼:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數:1

2)在44上執行cat /proc/drbd,看到44切換為主節點Primary

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:2760 nr:1960 dw:4756 dr:3797 al:14 bm:14 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oo

s:0

3)執行df,看到drbd已掛載

/dev/drbd0             2062060     35876   1921436   2% /mnt/drbd

 

3、在44上查看hdfs文件系統

/home/hdfs/hdfsinstall/hadoop/bin/hadoop  dfs  -ls

查看現有的文件和目錄。顯示是正常的。

-rw-r--r--   1 hdfs supergroup    1951937 2009-01-14 17:15 /user/hdfs/hello

drwxr-xr-x   - hdfs supergroup          0 2009-01-13 16:44 /user/hdfs/testdir

 

測試3 主備節點再次切換

1、先開啟41上的heartbeat,在44上停止heartbeat

在44上執行/etc/init.d/heartbeat stop

 

2、查看41

1)執行ifconfig可以看到虛擬ip已經切換到41上

eth0:0    Link encap:Ethernet  HWaddr 00:11:D8:94:C6:1C 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

2)在41上執行cat /proc/drbd,看到41切換為主節點Primary

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:2300 nr:2824 dw:5040 dr:4093 al:13 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oo

s:0

3)執行df,看到drbd已掛載

/dev/drbd0            30963708    185580  29205264   1% /mnt/drbd

 

3、在41上查看hdfs文件系統

bin/hadoop  dfs  -ls

查看現有的文件和目錄。顯示是正常的。

-rw-r--r--   1 hdfs supergroup    1951937 2009-01-14 17:15 /user/hdfs/hello

drwxr-xr-x   - hdfs supergroup          0 2009-01-13 16:44 /user/hdfs/testdir

測試4 split brain自動處理

1、按照其他中描述配置split brain自動處理

上面已經配置了

 

2、重新啟動41和44,等待幾分鍾后

 

3、查看41

cat /proc/drbd

顯示Connected,表示同步正常。

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:336 nr:64 dw:400 dr:765 al:7 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

 

4、查看44

cat /proc/drbd

顯示Connected,表示同步正常。

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----

    ns:0 nr:336 dw:336 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

 

5、在41上查看hdfs文件系統

bin/hadoop  dfs  -ls

查看現有的文件和目錄。顯示是正常的。

-rw-r--r--   1 hdfs supergroup    1951937 2009-01-14 17:15 /user/hdfs/hello

drwxr-xr-x   - hdfs supergroup          0 2009-01-13 16:44 /user/hdfs/testdir

 

其他

用戶映射

   在41上和44上我們的都創建相同的用戶/口令:bobo/bobo,但在/etc/passwd和/etc/group中可以看到,在兩台機器上,用戶和組所對應的useid和groupid是不同的,這樣會導致,drbd切換時,drbd的存儲在兩台機器上映射到不一致的用戶和組。因此需要在創建用戶和組時指定useid和groupid。目前我們采用修改44的方式:

1 首先打開41上的/etc/passwd和/etc/group,得到bobo的useid和groupid值為1000。

2 在44上修改bobo的useid和groupid值為1000。

usermod -u 1000 bobo

groupmod  -u 1000 bobo

3 這樣drbd切換時,就不會出現權限問題。

 

split brain問題處理(參考)

split brain實際上是指在某種情況下,造成drbd的兩個節點斷開了連接,都以primary的身份來運行。當drbd某primary節點連接對方節點准備發送信息的時候如果發現對方也是primary狀態,那么會會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日志中記錄以下信息:“Split-Brain detected,dropping connection!”當發生split brain之后,如果查看連接狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是StandAlone(如果是同時發現split brain狀態),也有可能是WFConnection的狀態。

錯誤狀態

1 節點重新啟動時,在dmesg中出現錯誤提示:

drbd0: Split-Brain detected, dropping connection!

drbd0: self055F46EA3829909E:899EC0EBD8690AFD:FEA4014923297FC8:3435CD2BACCECFCB

drbd0: peer 7E18F3FEEA113778:899EC0EBD8690AFC:FEA4014923297FC8:3435CD2BACCECFCB

drbd0: helper command: /sbin/drbdadm split-brain minor-0

drbd0: meta connection shut down by peer.

 

2在44查看cat /proc/drbd,44運行為StandAlone狀態

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@backup, 2008-12-30 17:16:32

 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r---

    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:664

 

3在41查看cat /proc/drbd,41運行為StandAlone狀態

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@master, 2008-12-30 17:23:44

 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r---

    ns:0 nr:0 dw:4 dr:21 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:68

 

4 原因分析

由於節點重啟導致數據不一致,而配置文件中沒有配置自動修復錯誤的內容,因而導致握手失敗,數據無法同步。

split brain有兩種解決辦法:手動處理和自動處理。

手動處理

1 在44上停止heartbeat

Heartbeat會鎖定資源,只有停止后才能釋放

/etc/init.d/heartbeat stop

2 在作為secondary的節點上放棄該資源的數據

在44上

/sbin/drbdadm --  --discard-my-data connect r0

3在作為primary的節點重新連接secondary

在41上

/sbin/drbdadm disconnect r0

/sbin/drbdadm connect r0

把41設置為主節點

/sbin/drbdadm primary r0

4在44上重新啟動heartbeat

/etc/init.d/heartbeat start

5 查看41狀態 cat /proc/drbd,顯示為Connected,已經恢復了正常。

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@master, 2008-12-30 17:23:44

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---

    ns:768 nr:0 dw:800 dr:905 al:11 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

6查看44狀態 cat /proc/drbd,顯示為Connected,已經恢復了正常。

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@backup, 2008-12-30 17:16:32

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r---

    ns:0 nr:768 dw:768 dr:0 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

 

(實際采用的恢復方法)

先選擇好一個備機,在備機上執行:

sudo drbdadm secondary r0

sudo drbdadm disconnect r0

sudo drbdadm -- --discard-my-data connect r0

在主上執行:

sudo drbdadm connect r0

 

 

自動處理

通過/etc/drbd.conf配置中設置自動處理策略,在發生數據不一致時自動處理。自動處理策略定義如下:

1 after-sb-0pri.

當兩個節點的狀態都是secondary時,可以通過after-sb-0pri策略自動恢復。

1)disconnect

默認策略,沒有自動恢復,簡單的斷開連接。

2)discard-younger-primary

在split brain發生前從主節點自動同步。

3)discard-older-primary

在split brain發生時從變成primary的節點同步數據。

4)discard-least-changes

在split brain發生時從塊最多的節點同步數據。

5)discard-node-NODENAME

自動同步到名字節點

 

2 after-sb-1pri

當兩個節點的狀態只有一個是primary時,可以通過after-sb-1pri策略自動恢復。

1)disconnect

默認策略,沒有自動恢復,簡單的斷開連接。

2)consensus

丟棄secondary或者簡單的斷開連接。

3)discard-secondary

丟棄secondary數據。

4)call-pri-lost-after-sb

按照after-sb-0pri的策略執行。

 

3 after-sb-2pri

當兩個節點的狀態都是primary時,可以通過after-sb-2pri策略自動恢復。

1)disconnect

默認策略,沒有自動恢復,簡單的斷開連接。

2)violently-as0p

按照after-sb-0pri的策略執行。

3)call-pri-lost-after-sb

按照after-sb-0pri的策略執行,並丟棄其他節點。

 

4 配置自動恢復

編輯/etc/drbd.conf,找到resource r0部分,配置策略如下,所有節點完全一致。

#after-sb-0pri disconnect;  

    after-sb-0pri discard-younger-primary;

 

    #after-sb-1pri disconnect;

    after-sb-1pri discard-secondary;

 

   #after-sb-2pri disconnect;

    after-sb-2pri call-pri-lost-after-sb;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM