Linux下DRBD配置
一、什么是DRBD
1、簡介?
? ?Distributed Replicated Block Device(DRBD)是一個用軟件實現(xiàn)的、無共享的、服務器之間鏡像塊設備內容的存儲復制解決方案。
數(shù)據(jù)鏡像:實時、透明、同步(所有服務器都成功后返回)、異步(本地服務器成功后返回)?DRBD的核心功能通過Linux的內核實現(xiàn),最接近系統(tǒng)的IO棧,但它不能神奇地添加上層的功能比如檢測到EXT3文件系統(tǒng)的崩潰。?DRBD的位置處于文件系統(tǒng)以下,比文件系統(tǒng)更加靠近操作系統(tǒng)內核及IO棧。
? ?在DRBD中,資源是特指某復制的存儲設備的所有方面。包括資源名稱、DRBD設備(/dev/drbdm,這里m是設備最小號,最大號可到147)、磁盤配置(使本地數(shù)據(jù)可以為DRBD所用)、網(wǎng)絡配置(與對方通信)?每個資源有個角色,是Primary或Secondary,下面簡稱“主”和“備” 。
主角色的DRBD設備可以不受限制的讀和寫,比如創(chuàng)建和映射文件系統(tǒng)、對于塊設備的raw或直接IO訪問。?
備角色的DRBD設備接受來自對方的所有修改,但是不能被應用程序讀寫,甚至只讀也不行。?角色也可以改變。
2、使用DRBD工具
drbdadm:高級管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta發(fā)送指令,?
drbdsetup:配置裝載進kernel的DRBD模塊,平時很少直接用?
drbdmeta:管理META數(shù)據(jù)結構,平時很少直接用。
3、復制模式
協(xié)議A:異步復制協(xié)議。本地寫成功后立即返回,數(shù)據(jù)放在發(fā)送buffer中,可能丟失。
協(xié)議B:內存同步(半同步)復制協(xié)議。本地寫成功并將數(shù)據(jù)發(fā)送到對方后立即返回,如果雙機掉電,數(shù)據(jù)可能丟失。
協(xié)議C:同步復制協(xié)議。本地和對方寫成功確認后返回。如果雙機掉電或磁盤同時損壞,則數(shù)據(jù)可能丟失。一般用協(xié)議C。選擇協(xié)議將影響流量,從而影響網(wǎng)絡時延。
4、DRBD結構圖
5、工作原理
? ?每個設備(drbd 提供了不止一個設備)都有一個狀態(tài),可能是‘主’狀態(tài)或‘從’狀態(tài)。在主節(jié)點上,應用程序應能運行和訪問drbd設備(/dev/drbd*)。每次寫入都會發(fā)往本地磁盤設備和從節(jié)點設備中。從節(jié)點只能簡單地把數(shù)據(jù)寫入它的磁盤設備上。 讀取數(shù)據(jù)通常在本地進行。 如果主節(jié)點發(fā)生故障,心跳(heartbeat或corosync)將會把從節(jié)點轉換到主狀態(tài),并啟動其上的應用程序。如果發(fā)生故障的節(jié)點恢復工作,它就會成為新的從節(jié)點,而且必須使自己的內容與主節(jié)點的內容保持同步。當然,這些操作不會干擾到后臺的服務。
6、DRBD與HA 集群
? ?大部分現(xiàn)行高可用性集群(如:惠普、IBM、Dell)使用的是共享存儲器,因此存儲器連接多個節(jié)點(用共享的SCSI 總線或光纖通道就可以做到)。DRBD 也可以作為一個共享的設備,但是它并不需要任何不常見的硬件。它在IP 網(wǎng)絡中運行,而且在價格上IP 網(wǎng)絡要比專用的存儲網(wǎng)絡經濟的多。目前,DRBD 每次只允許對一個節(jié)點進行讀寫訪問,這對于通常的故障切換高可用性集群來講已經足夠用了?,F(xiàn)在的版本將支持兩個節(jié)點同時進行讀寫存取。這很有用,比如對GFS 來講就是如此。兼容性DRBD可以在IDE、SCSI 分區(qū)和整個驅動器之上運行,但不能在回路模塊設備上運行。(如果您硬要這樣做,它就會發(fā)生死鎖)。DRBD 也不能在回送網(wǎng)絡設備中運行。(因為它同樣會發(fā)生死鎖:所有請求都會被發(fā)送設備占用,發(fā)送流程也會阻塞在sock_sendmsg()中。)有時,接收線程正從網(wǎng)絡中提取數(shù)據(jù)塊,并試圖把它放在高速緩存器中;但系統(tǒng)卻要把一些數(shù)據(jù)塊從高速緩存器中取到磁盤中。這種情況往往會在接收器的環(huán)境下發(fā)生,因為所有的請求都已經被接收器塊占用了。
7、DRBD 配置文件
? ?DRBD的主配置文件為/etc/drbd.conf;為了管理的便捷性,目前通常會將些配置文件分成多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d目錄中的配置文件為global_common.conf和所有以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每一個.res的文件用于定義一個資源。
? ?在配置文件中,global段僅能出現(xiàn)一次,且如果所有的配置信息都保存至同一個配置文件中而不分開為多個文件的話,global段必須位于配置文件的最開始處。目前global段中可以定義的參數(shù)僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
? ?common段則用于定義被每一個資源默認繼承的參數(shù),可以在資源定義中使用的參數(shù)都可以在common段中定義。實際應用中,common段并非必須,但建議將多個資源共享的參數(shù)定義為common段中的參數(shù)以降低配置文件的復雜度。?
? ?resource段則用于定義drbd資源,每個資源通常定義在一個單獨的位于/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須為其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯(lián)至的節(jié)點,其它參數(shù)均可以從common段或drbd的默認中進行繼承而無須定義。
8、DRBD 資源 舉例
Resource name:可以是除了空白字符的任意的ACSII碼字符?
DRBD device:在雙方節(jié)點上,此DRBD設備的設備文件;一般為/dev/drbdN,其主設備號147?
Disk configuration:在雙方節(jié)點上,各自提供的存儲設備?
Nerwork configuration:雙方數(shù)據(jù)同步時所使用的網(wǎng)絡屬性?
案例:
| 1234567891011121314 | resource?web?{?#資源名為“web”on?node1.example.com?{?#設置節(jié)點cluster1??device????/dev/drbd0;???#指出drbd的標示名??disk??????/dev/sda6;??????#指出作為drbd的設備address???192.168.1.9:7789;?#指定ip和端口號meta-disk?internal;???#網(wǎng)絡通信屬性,指定drbd的元數(shù)據(jù)在本機??}??on?node2.example.com?{??device????/dev/drbd0;??disk??????/dev/sda6;??address???192.168.1.10:7789;??meta-disk?internal;??}??} |
9、DRBD 配置步驟
安裝drbd?
配置資源文件(定義資料名稱,磁盤,節(jié)點信息,同步限制等)?
將drbd加入到系統(tǒng)服務chkconfig --add drbd ??
初始化資源組drbdadm create-md resource_name?
啟動服務 service drbd start?
設置primary主機,并同步數(shù)據(jù)?
分區(qū)、格式化/dev/drbd*?
一個節(jié)點進行掛載?
查看狀態(tài)
二、DRBD簡單安裝使用
說明:演示中我是學著使用ansible來安裝drbd的,下面就是我的ansible關于Host Inventory文件中的定義:
| 12345678 | #?vim?/etc/ansible/hosts[drbd]node1node2[node1]node1[node2]node2 |
1、實驗環(huán)境
2、安裝epel源
| 123456 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"wget?http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm?-P?/tmp"[root@Director?~]#?ansible?drbd?-m?shell?-a?"rpm?-ivh?/tmp/epel-release-6-8.noarch.rpm"[root@Director?~]#?ansible?drbd?-m?shell?-a?"rpm?-ivh?/tmp/epel-release-6-8.noarch.rpm"[root@Director?~]#?ansible?drbd?-m?shell?-a?"rpm?--import?/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6"[root@Director?~]#?ansible?drbd?-m?shell?-a?"rpm?-ivh?http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm"[root@Director?~]#?ansible?drbd?-m?shell?-a?"yum?list?" |
3、安裝DRBD
| 1 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"yum?-y?install?drbd84?kmod-drbd84" |
查看一下配置文件:
| 12345678910111213 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"ls?-l?/etc/drbd.conf"node2?|?success?|?rc=0?>>-rw-r--r--?1?root?root?133?Apr?10?04:19?/etc/drbd.confnode1?|?success?|?rc=0?>>-rw-r--r--?1?root?root?133?Apr?10?04:19?/etc/drbd.conf[root@Director?~]#?ansible?drbd?-m?shell?-a?"ls?-l?/etc/drbd.d/*"node2?|?success?|?rc=0?>>-rw-r--r--?1?root?root?2062?Apr?10?04:19?/etc/drbd.d/global_common.confnode1?|?success?|?rc=0?>>-rw-r--r--?1?root?root?2062?Apr?10?04:19?/etc/drbd.d/global_common.conf |
4、配置DRBD
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | [root@Director?~]#?scp?-p?root@node1:/etc/drbd.d/global_common.conf?./[root@Director?~]#?vim?global_common.conf?global?{??usage-count?no;?#讓linbit公司收集目前drbd的使用情況,yes為參加,我們這里不參加設置為no??#?minor-count?dialog-refresh?disable-ip-verification??}common?{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?degr-wfc-timeout?outdated-wfc-timeout?wait-after-sb??}options?{#?cpu-mask?on-no-data-accessible??}disk?{#?size?max-bio-bvecs?on-io-error?fencing?disk-barrier?disk-flushes??#?disk-drain?md-flushes?resync-rate?resync-after?al-extents??#?c-plan-ahead?c-delay-target?c-fill-target?c-max-rate??#?c-min-rate?disk-timeout??on-io-error?detach;?#同步錯誤的做法是分離??}net?{#?protocol?timeout?max-epoch-size?max-buffers?unplug-watermark??#?connect-int?ping-int?sndbuf-size?rcvbuf-size?ko-count??#?allow-two-primaries?cram-hmac-alg?shared-secret?after-sb-0pri??#?after-sb-1pri?after-sb-2pri?always-asbp?rr-conflict??#?ping-timeout?data-integrity-alg?tcp-cork?on-congestion??#?congestion-fill?congestion-extents?csums-alg?verify-alg??#?use-rle??cram-hmac-alg?"sha1";?#設置加密算法sha1??shared-secret?"mydrbdlab";?#設置加密key??}??}[root@Director?~]#?scp?-p?global_common.conf?root@node1:/etc/drbd.d/global_common.conf[root@Director?~]#?scp?-p?global_common.conf?root@node2:/etc/drbd.d/global_common.conf |
增加資源:
| 123456789101112131415 | [root@Director?~]#?vim?web.resresource?web?{on?node1{??device????/dev/drbd0;??disk??????/dev/sdb3;address???192.168.1.9:7789;????meta-disk?internal;??}??on?node2?{??????????device????/dev/drbd0;??disk??????/dev/sdb3;address???192.168.1.10:7789;meta-disk?internal;??}??} |
? ?注意:還需要在node1和node2手動創(chuàng)建磁盤分區(qū),建議要是做實驗就將磁盤空間弄小點。 若不識別磁盤試試用此命令partx -a /dev/sdb。
將資源文件復制到node1和node2上:
| 1234567 | [root@Director?~]#?ansible?drbd?-m?copy?-a?"src=/root/web.res?dest=/etc/drbd.d/"[root@Director?~]#?ansible?drbd?-m?shell?-a?"ls?-l?/etc/drbd.d/web.res"node1?|?success?|?rc=0?>>-rw-r--r--?1?root?root?291?Sep??7?20:28?/etc/drbd.d/web.resnode2?|?success?|?rc=0?>>-rw-r--r--?1?root?root?291?Sep??7?20:28?/etc/drbd.d/web.res |
node1與node2上初始化資源:
| 123456789 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"drbdadm?create-md?web"node2?|?success?|?rc=0?>>initializing?activity?logWriting?meta?data...New?drbd?meta?data?block?successfully?created.NOT?initializing?bitmapnode1?|?success?|?rc=0?>>initializing?activity?logWriting?meta?data...New?drbd?meta?data?block?successfully?created.NOT?initializing?bitmap |
node1與node2上啟動DRBD服務:
| 123456789101112131415 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"/etc/init.d/drbd?start"node1?|?success?|?rc=0?>>Starting?DRBD?resources:?[create?res:?webprepare?disk:?webadjust?disk:?webadjust?net:?web]node2?|?success?|?rc=0?>>Starting?DRBD?resources:?[create?res:?webprepare?disk:?webadjust?disk:?webadjust?net:?web] |
查看一下啟動狀態(tài):
| 123456 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"drbd-overview"node2?|?success?|?rc=0?>>0:web/0??Connected?Secondary/Secondary?Inconsistent/Inconsistent?node1?|?success?|?rc=0?>>0:web/0??Connected?Secondary/Secondary?Inconsistent/Inconsistent |
從上面的信息中可以看出此時兩個節(jié)點均處于Secondary狀態(tài)。于是,我們接下來將其中一個節(jié)點設置為Primary。
設置node1為Primary:
| 123456789 | [root@Director?~]#?ansible?node1?-m?shell?-a?"drbdadm?primary?--force?web"[root@Director?~]#?watch?-n1?'ansible?drbd?-m?shell?-a?"drbd-overview"'Every?1.0s:?ansible?drbd?-m?shell?-a?"drbd-overview"?????????Mon?Sep??7?20:28:37?2015node1?|?success?|?rc=0?>>0:web/0??SyncSource?Primary/Secondary?UpToDate/Inconsistent[===>................]?sync'ed:?21.5%?(1656176/2104408)Knode2?|?success?|?rc=0?>>0:web/0??SyncTarget?Secondary/Primary?Inconsistent/UpToDate[===>................]?sync'ed:?21.5%?(1656176/2104408)K |
兩者需要一段時間的初始化,初始化時間根據(jù)磁盤大小和硬件配置相關:
| 123456 | [root@Director?~]#?ansible?drbd?-m?shell?-a?"drbd-overview"node2?|?success?|?rc=0?>>0:web/0??Connected?Secondary/Primary?UpToDate/UpToDate?node1?|?success?|?rc=0?>>0:web/0??Connected?Primary/Secondary?UpToDate/UpToDate |
node1格式化并掛載 :
| 12345678 | [root@Director?~]#?ansible?node1?-m?shell?-a?"mke2fs?-j?/dev/drbd0"node1?|?success?|?rc=0?>>mke2fs?1.41.12?(17-May-2010)[root@Director?~]#?ansible?node1?-m?shell?-a?"mkdir?/drbd"node1?|?success?|?rc=0?>>[root@Director?~]#?ansible?node1?-m?shell?-a?"mount?/dev/drbd0?/drbd"node1?|?success?|?rc=0?>> |
將drbd目錄中寫入文件,下面好做測試:
| 12345 | [root@Director?~]#?ansible?node1?-m?copy?-a?"src=/etc/issue?dest=/drbd"[root@Director?~]#?ansible?node1?-m?shell?-a?"cat?/drbd/issue"node1?|?success?|?rc=0?>>CentOS?release?6.6?(Final)Kernel?\r?on?an?\m |
切換Primary和Secondary節(jié)點:
說明:對主Primary/Secondary模型的drbd服務來講,在某個時刻只能有一個節(jié)點為Primary,因此,要切換兩個節(jié)點的角色,只能在先將原有的Primary節(jié)點設置為Secondary后,才能原來的Secondary節(jié)點設置為Primary。
| 123456789101112131415161718192021222324252627282930313233 | [root@Director?~]#?ansible?node1?-m?shell?-a?"umount?/drbd"node1?|?success?|?rc=0?>>[root@Director?~]#?ansible?node1?-m?shell?-a?"drbdadm?secondary?web"node1?|?success?|?rc=0?>>[root@Director?~]#?ansible?drbd?-m?shell?-a?"drbd-overview"node1?|?success?|?rc=0?>>0:web/0??Connected?Secondary/Secondary?UpToDate/UpToDate?node2?|?success?|?rc=0?>>0:web/0??Connected?Secondary/Secondary?UpToDate/UpToDate?[root@Director?~]#?ansible?node2?-m?shell?-a?"drbdadm?primary?web"node2?|?success?|?rc=0?>>[root@Director?~]#?ansible?drbd?-m?shell?-a?"drbd-overview"node1?|?success?|?rc=0?>>0:web/0??Connected?Secondary/Primary?UpToDate/UpToDate?node2?|?success?|?rc=0?>>0:web/0??Connected?Primary/Secondary?UpToDate/UpToDate?[root@Director?~]#?ansible?node2?-m?shell?-a?"mkdir?/drbd"node2?|?success?|?rc=0?>>[root@Director?~]#?ansible?node2?-m?shell?-a?"mount?/dev/drbd0?/drbd"node2?|?success?|?rc=0?>>[root@Director?~]#?ansible?node2?-m?shell?-a?"cat?/drbd/issue"node2?|?success?|?rc=0?>>CentOS?release?6.6?(Final)Kernel?\r?on?an?\m |
三、DRBD 雙主模式配置示例
drbd 8.4中第一次設置某節(jié)點成為主節(jié)點的命令 ?
| 1 | [root@node?~]#?drbdadm?primary?--force?resource |
配置資源雙主模型的示例:
| 1234567891011121314151617181920212223242526272829 | resource?mydrbd?{net?{protocol?C;??allow-two-primaries?yes;??}startup?{become-primary-on?both;??}disk?{fencing?resource-and-stonith;??}handlers?{#?Make?sure?the?other?node?is?confirmed??#?dead?after?this!??outdate-peer?"/sbin/kill-other-node.sh";??}on?node1.magedu.com?{device??/dev/drbd0;??disk????/dev/vg0/mydrbd;??address?192.168.1.9:7789;??meta-disk???????internal;??}on?node2.magedu.com?{device??/dev/drbd0;??disk????/dev/vg0/mydrbd;??address?192.168.1.10:7789;??meta-disk???????internal;??}??} |
本文出自 “粗茶淡飯” 博客,請務必保留此出處http://cuchadanfan.blog.51cto.com/9940284/1695852
轉載于:https://blog.51cto.com/lucifer119/1734624
總結
以上是生活随笔為你收集整理的Linux下DRBD配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql主从复制实践之单数据库多实例
- 下一篇: Java日志性能那些事(转)