DRBD實現文件同步詳解
????Distributed Replicated Block Device(DRBD)是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲復制解決方案。其核心功能通過Linux的內核實現,比文件系統更加靠近操作系統內核及IO棧。DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。可以理解為網絡RAID1.
復制原理
????每個設備(drbd 提供了不止一個設備)都有一個狀態,可能是‘主’狀態或‘從’狀態。在主節點上,應用程序應能運行和訪問drbd設備(/dev/drbd*)。每次寫入都會發往本地磁盤設備和從節點設備中。從節點只能簡單地把數據寫入它的磁盤設備上。 讀取數據通常在本地進行。 如果主節點發生故障,心跳(
?
1、復制方式
單主模式 任何特定時間範圍內,集群只存在一個主節點,可用於任何文件系統上,包括ext3、ext4等
雙主模式 任何特定時間範圍內,集群存在兩個主節點,不過這種模式需要借助一個共享的文件系統,如GFS和MFS等
2、復制協議
協議A:異步復制協議。本地寫成功後立即返回,數據放在發送buffer中,可能丟失。
協議B:內存同步(半同步)復制協議。本地寫成功並將數據發送到對方後立即返回,如果雙機掉電,數據可能丟失。
協議C:同步復制協議。本地和對方寫成功確認後返回。如果雙機掉電或磁盤同時損壞,則數據可能丟失。對網絡依賴比較大。?
配置工具
drbdadm:高級管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta發送指令。
drbdsetup:配置裝載進kernel的DRBD模塊,平時很少直接用。
drbdmeta:管理META數據結構,平時很少直接用。
配置文件
????DRBD的主配置文件為/etc/drbd.conf;為了管理的便捷性,目前通常會將些配置文件分成多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d
在配置文件中,global段僅能出現一次,且如果所有的配置信息都保存至同一個配置文件中而不分開為多個文件的話,global段必須位於配置文件的最開始處。目前global段中可以定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
??? common段則用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義。實際應用中,common段並非必須,但建議將多個資源共享的參數定義為common段中的參數以降低配置文件的復雜度。
??? resource段則用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須為其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或drbd的默認中進行繼承而無須定義。各個對等節點之間需要進行數據通信,所以需要配置主機互信機制。
????資源角色有primary、secondary兩種。primary可以進行不受限制的讀和寫操作,可用來創建和掛載文件系統、初始化I/O的塊設備。secondary接收所有來自對等節點的更新,不能被應用也不能被讀寫訪問。主要目的是保持緩沖及數據一致性。
人工幹預和管理程序的自動聚類算法都可以改變資源的角色。資源可以由被變換為主,以及主到備。
?
腦裂通知和自動恢復
????split brain實際上是指在某種情況下,造成drbd的兩個節點斷開連接,都以primary的身份來運行。當drbd某primary節點連接對方節點準備發送信息的時候如果發現對方也是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
9、在161機器上啟動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
11、讓161機器為primary節點
[root@MidApp?~]#?drbdadm?--?--force?primary?mysql
12、讓160機器同樣操作
[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
17、將161機器解除掛載,並降級為secondary
[root@MidApp?~]#?umount?/mydata [root@MidApp?~]#?drbdadm?secondary?mysql? [root@MidApp?~]#?drbd-overview? ?1:mysql/0??Connected?Secondary/Secondary?UpToDate/UpToDate
註:在單主模式下的DRBD,兩個節點同時處於連接狀態,任何一個節點都可以在特定的時間內變成主;但兩個節點中只能一為主,如果已經有一個主,需先降級才可能升級
?
18、將160節點升為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實現文件同步詳解