1. 程式人生 > >DRBD實現文件同步詳解

DRBD實現文件同步詳解

drbd

一、簡單介紹

????Distributed Replicated Block Device(DRBD)是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲復制解決方案。其核心功能通過Linux的內核實現,比文件系統更加靠近操作系統內核及IO棧。DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。可以理解為網絡RAID1.

復制原理

????每個設備(drbd 提供了不止一個設備)都有一個狀態,可能是‘主’狀態或‘從’狀態。在主節點上,應用程序應能運行和訪問drbd設備(/dev/drbd*)。每次寫入都會發往本地磁盤設備和從節點設備中。從節點只能簡單地把數據寫入它的磁盤設備上。 讀取數據通常在本地進行。 如果主節點發生故障,心跳(

heartbeatcorosync)將會把從節點轉換到主狀態,並啟動其上的應用程序。(如果您將它和無日誌FS 一起使用,則需要運行fsck)。如果發生故障的節點恢復工作,它就會成為新的從節點,而且必須使自己的內容與主節點的內容保持同步。當然,這些操作不會幹擾到後臺的服務

?

1、復制方式

單主模式 任何特定時間範圍內,集群只存在一個主節點,可用於任何文件系統上,包括ext3ext4

雙主模式 任何特定時間範圍內,集群存在兩個主節點,不過這種模式需要借助一個共享的文件系統,如GFSMFS

2、復制協議

協議A:異步復制協議。本地寫成功後立即返回,數據放在發送buffer中,可能丟失。

協議B:內存同步(半同步)復制協議。本地寫成功並將數據發送到對方後立即返回,如果雙機掉電,數據可能丟失。

協議C:同步復制協議。本地和對方寫成功確認後返回。如果雙機掉電或磁盤同時損壞,則數據可能丟失。對網絡依賴比較大。?

配置工具

drbdadm:高級管理工具,管理/etc/drbd.conf,向drbdsetupdrbdmeta發送指令。

drbdsetup:配置裝載進kernelDRBD模塊,平時很少直接用。

drbdmeta:管理META數據結構,平時很少直接用。

配置文件

????DRBD的主配置文件為/etc/drbd.conf;為了管理的便捷性,目前通常會將些配置文件分成多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d

目錄中的配置文件為global_common.conf和所有以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每一個.res的文件用於定義一個資源。

在配置文件中,global段僅能出現一次,且如果所有的配置信息都保存至同一個配置文件中而不分開為多個文件的話,global段必須位於配置文件的最開始處。目前global段中可以定義的參數僅有minor-count, dialog-refresh, disable-ip-verificationusage-count

??? common段則用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義。實際應用中,common段並非必須,但建議將多個資源共享的參數定義為common段中的參數以降低配置文件的復雜度。

??? resource段則用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須為其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或drbd的默認中進行繼承而無須定義。各個對等節點之間需要進行數據通信,所以需要配置主機互信機制。

????資源角色有primarysecondary兩種。primary可以進行不受限制的讀和寫操作,可用來創建和掛載文件系統、初始化I/O的塊設備。secondary接收所有來自對等節點的更新,不能被應用也不能被讀寫訪問。主要目的是保持緩沖及數據一致性。

人工幹預和管理程序的自動聚類算法都可以改變資源的角色。資源可以由被變換為主,以及主到備。

?

腦裂通知和自動恢復

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

?

drbd 腦裂主要在 net 配置,有以下關鍵字:

after-sb-0pri:裂腦已經被探測到,但是現在沒有節點處於主角色,對於這個選項, drbd 有以下關鍵字:

????disconnect:

????????不需要自動恢復,僅僅是調用裂腦處理程序的腳本(如果配置了),斷開連接並出在斷開模式。

????discard-younger-primary:

????????放棄和回滾最後成為主的上面所做的修改。

????discard-least-changes:

????????放棄和回滾,變動比較少的主機上的修改。

????discard-zero-changes:

????????如果任何節點都沒有發生任何變化,僅僅申請在一個節點上做出繼續修改即可。

?

????after-sb-1pri:裂腦已經被探測到,現有有一個節點處於主角色,對於這個選項, drbd 有以下關鍵字:

????disconnect: after-sb-0pri 一樣, 調用裂腦處理程序的腳本(如果配置了),斷開連接並出在斷開模式。

????consensus: after-sb-0pri 中同樣的修復策略。 如果利用這些策略裂腦危害能選擇,那就能自動解決。 否則,同樣斷開指定的動作。

????call-pri-lost-after-sb: after-sb-0pri 中同樣的修復策略。如果利用這些策略裂腦危害能選擇,就在受危害的節點上調用

????pri-lost-after-sb 程序。這個程序必須確認在 handlers 中配置,並考慮到從集群中移除該節點。

????discard-secondary:不管哪個主機只要處於次角色,都是裂腦的危害者。

????after-sb-2pri:在兩個節點都處於主角色時,裂腦被發現。次選項使用和after-sb-1pri同樣的關鍵字,丟棄次節點並達成共識。

二、配置過程

1修改主機名

[root@MidApp?~]#?cat?/etc/hosts
127.0.0.1???localhost?localhost.localdomain?localhost4?localhost4.localdomain4
::1?????????localhost?localhost.localdomain?localhost6?localhost6.localdomain6
192.168.221.161?MidApp
192.168.221.160?DB

2配置兩臺機器的互信機制

[root@MidApp?~]#?ssh-keygen?
Generating?public/private?rsa?key?pair.
Enter?file?in?which?to?save?the?key?(/root/.ssh/id_rsa):?
Enter?passphrase?(empty?for?no?passphrase):?
Enter?same?passphrase?again:?
Your?identification?has?been?saved?in?/root/.ssh/id_rsa.
Your?public?key?has?been?saved?in?/root/.ssh/id_rsa.pub.
The?key?fingerprint?is:
0c:39:e2:6d:cf:02:b9:94:7b:1f:b7:6f:b1:49:3d:a1?root@MidApp
The?key‘s?randomart?image?is:
+--[?RSA?2048]----+
|?????????????????|
|???????.?????????|
|????.?+??????????|
|???.?=?+??????.??|
|????*?o?S????o?.?|
|???.?=?o????E?o??|
|????o?o?+?..?+?.?|
|?????.?o?o?.+????|
|????????.?.o.????|
+-----------------+
[root@MidApp?pgsql]#?ssh-copy-id?192.168.221.160
[email protected]‘s?password:?
Now?try?logging?into?the?machine,?with?"ssh?‘192.168.221.160‘",?and?check?in:
?
??.ssh/authorized_keys
?
to?make?sure?we?haven‘t?added?extra?keys?that?you?weren‘t?expecting.
?
[root@MidApp?pgsql]#?ssh?DB
The?authenticity?of?host?‘db?(192.168.221.160)‘?can‘t?be?established.
RSA?key?fingerprint?is?3c:83:03:dc:63:6e:f3:e1:db:db:43:fc:c3:03:19:c2.
Are?you?sure?you?want?to?continue?connecting?(yes/no)??yes
Warning:?Permanently?added?‘db‘?(RSA)?to?the?list?of?known?hosts.
Last?login:?Mon?Dec??4?20:00:47?2017?from?172.30.25.29

3設置時鐘同步

[root@MidApp?~]#?crontab?-l
*/5?*?*?*?*?ntpdate?cn.pool.ntp.org

4安裝DRBD程序包

yum?install?-y?glibc?
rpm?--import?https://www.elrepo.org/RPM-GPG-KEY-elrepo.org?
rpm?-Uvh?http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
yum?install?-y?kmod-drbd84?drbd84-utils

若遇到下面問題,要安裝nss

[root@MidApp?~]#?rpm?--import?https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
curl:?(35)?SSL?connect?error
error:?https://www.elrepo.org/RPM-GPG-KEY-elrepo.org:?import?read?failed(2).
[root@MidApp?pgsql]#?yum?update?nss

:前4步,兩個節點做相同操作

5修改全局配置文件

[root@MidApp?~]#?cat?/etc/drbd.d/global_common.conf?
?
global?{
usage-count?no;
}
?
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";
split-brain?"/usr/lib/drbd/notify-split-brain.sh?root";
}
?
startup?{
#?wfc-timeout?degr-wfc-timeout?outdated-wfc-timeout?wait-after-sb
}
?
options?{
#?cpu-mask?on-no-data-accessible
}
?
disk?{
on-io-error?detach;?#配置I/O錯誤處理策略為分離
}
?
net?{
after-sb-0pri?discard-zero-changes;#如果任何節點都沒有發生任何變化,僅僅申請在一個節點上做出繼續修改即可
after-sb-1pri?discard-secondary;
after-sb-2pri?disconnect;
}
syncer?{
????????rate?1024M;????#設置主備節點同步時的網絡速率
????}
}


6創建資源配置文件

[root@MidApp?~]#?cat?/etc/drbd.d/mysql.res?
resource?mysql?{
protocol?C;
meta-disk?internal;
device?/dev/drbd1;#相關的塊設備需命名為/dev/drbdm,其中m是設備的次要號碼
syncer?{
verify-alg?sha1;#支持復制傳輸數據完整性驗證(MD5、SHA-1、CRC-32C)
}
net?{
allow-two-primaries;
}
on?MidApp?{
disk?/dev/sdb1;?#在node1創建的分區
address?192.168.221.161:7789;
}
on?DB?{
disk?/dev/sdb1;?#在node2創建的分區
address?192.168.221.160:7789;
}
}

7把配置文件拷貝到另一臺機器

scp?-rp??/etc/drbd.d/*?DB:/etc/drbd.d/


8提前添加一塊硬盤,創建分區

[root@MidApp?~]#?fdisk?/dev/sdb?
Device?contains?neither?a?valid?DOS?partition?table,?nor?Sun,?SGI?or?OSF?disklabel
Building?a?new?DOS?disklabel?with?disk?identifier?0xa2f4da2f.
Changes?will?remain?in?memory?only,?until?you?decide?to?write?them.
After?that,?of?course,?the?previous?content?won‘t?be?recoverable.
?
Warning:?invalid?flag?0x0000?of?partition?table?4?will?be?corrected?by?w(rite)
?
WARNING:?DOS-compatible?mode?is?deprecated.?It‘s?strongly?recommended?to
?????????switch?off?the?mode?(command?‘c‘)?and?change?display?units?to
?????????sectors?(command?‘u‘).
?
Command?(m?for?help):?n
Command?action
???e???extended
???p???primary?partition?(1-4)
p
Partition?number?(1-4):?1
First?cylinder?(1-261,?default?1):?
Using?default?value?1
Last?cylinder,?+cylinders?or?+size{K,M,G}?(1-261,?default?261):?
Using?default?value?261
Command?(m?for?help):?p
?
Disk?/dev/sdb:?2147?MB,?2147483648?bytes
255?heads,?63?sectors/track,?261?cylinders
Units?=?cylinders?of?16065?*?512?=?8225280?bytes
Sector?size?(logical/physical):?512?bytes?/?512?bytes
I/O?size?(minimum/optimal):?512?bytes?/?512?bytes
Disk?identifier:?0xa2f4da2f
?
???Device?Boot??????Start?????????End??????Blocks???Id??System
/dev/sdb1???????????????1?????????261?????2096451???83??Linux
?
Command?(m?for?help):?w
The?partition?table?has?been?altered!
?
Calling?ioctl()?to?re-read?partition?table.
Syncing?disks.
You?have?new?mail?in?/var/spool/mail/root


9161機器上啟動DRBD

[root@MidApp?~]#?drbdadm?create-md?mysql
initializing?activity?log
NOT?initializing?bitmap
Writing?meta?data...
New?drbd?meta?data?block?successfully?created.


10內核加載DRBD模塊

[root@MidApp?~]#?modprobe?drbd
[root@MidApp?~]#?drbdadm?up?mysql
[root@MidApp?~]#??lsmod?|?grep?drbd
drbd??????????????????374888??2?
libcrc32c???????????????1246??1?drbd


11161機器為primary節點

[root@MidApp?~]#?drbdadm?--?--force?primary?mysql


12160機器同樣操作

[root@DB?~]#?drbdadm?create-md?mysql
[root@DB?~]#?modprobe?drbd
[root@DB?~]#?drbdadm?up?mysql

?

13創建一個/mydata目錄

mkdir?-p?/mydata

14格式化設備並掛載

[root@MidApp?~]#?mkfs.ext4?/dev/drbd1
mke2fs?1.41.12?(17-May-2010)
Filesystem?label=
OS?type:?Linux
Block?size=4096?(log=2)
Fragment?size=4096?(log=2)
Stride=0?blocks,?Stripe?width=0?blocks
131072?inodes,?524087?blocks
26204?blocks?(5.00%)?reserved?for?the?super?user
First?data?block=0
Maximum?filesystem?blocks=536870912
16?block?groups
32768?blocks?per?group,?32768?fragments?per?group
8192?inodes?per?group
Superblock?backups?stored?on?blocks:?
32768,?98304,?163840,?229376,?294912
?
Writing?inode?tables:?done????????????????????????????
Creating?journal?(8192?blocks):?done
Writing?superblocks?and?filesystem?accounting?information:?done
?
This?filesystem?will?be?automatically?checked?every?27?mounts?or
180?days,?whichever?comes?first.??Use?tune2fs?-c?or?-i?to?override.
You?have?new?mail?in?/var/spool/mail/root
[root@MidApp?~]#?mount?/dev/drbd1?/mydata
[root@MidApp?~]#?df?-h
Filesystem??????Size??Used?Avail?Use%?Mounted?on
/dev/sda2????????18G???12G??4.6G??73%?/
tmpfs???????????491M???72K??491M???1%?/dev/shm
/dev/sda1???????283M???59M??209M??23%?/boot
/dev/drbd1??????2.0G??3.0M??1.9G???1%?/mydata


15查看狀態

[root@MidApp?~]#?drbd-overview?
?1:mysql/0??Connected?Primary/Secondary?UpToDate/UpToDate?/mydata?ext4?2.0G?3.0M?1.9G?1%

?也可以通過下面方式查看

[root@MidApp?~]#?cat?/proc/drbd?
version:?8.4.9-1?(api:1/proto:86-101)
GIT-hash:?9976da086367a2476503ef7f6b13d4567327a280?build?by?mockbuild@Build64R6,?2016-12-13?18:38:15
?1:?cs:Connected?ro:Primary/Secondary?ds:UpToDate/UpToDate?C?r-----
????ns:2162724?nr:120?dw:66496?dr:2098842?al:25?bm:0?lo:0?pe:0?ua:0?ap:0?ep:1?wo:f?oos:0


16寫入測試數據

[root@MidApp?~]#?echo?"123"?>?/mydata/test.txt?
[root@MidApp?~]#?cat?/mydata/test.txt?
123


17161機器解除掛載,並降級為secondary

[root@MidApp?~]#?umount?/mydata
[root@MidApp?~]#?drbdadm?secondary?mysql?
[root@MidApp?~]#?drbd-overview?
?1:mysql/0??Connected?Secondary/Secondary?UpToDate/UpToDate

:在單主模式下的DRBD,兩個節點同時處於連接狀態,任何一個節點都可以在特定的時間內變成主;但兩個節點中只能一為主,如果已經有一個主,需先降級才可能升級

?

18160節點升為primary節點,並掛載

[root@DB?~]#?drbdadm?primary?mysql
[root@DB?~]#?mount?/dev/drbd1?/mydata/

19查看狀態

[root@DB?~]#?drbd-overview
?1:mysql/0??Connected?Primary/Secondary?UpToDate/UpToDate?/mydata?ext4?2.0G?3.0M?1.9G?1%?
[root@DB?~]#?df?-h
Filesystem??????Size??Used?Avail?Use%?Mounted?on
/dev/sda3????????36G???22G???12G??66%?/
tmpfs???????????774M???72K??774M???1%?/dev/shm
/dev/sda1???????283M???69M??200M??26%?/boot
/dev/drbd1??????2.0G??3.0M??1.9G???1%?/mydata


20驗證數據

[root@DB?~]#?cat?/mydata/test.txt?
123

至此,DRBD環境搭建完成!

?

?

?


DRBD實現文件同步詳解