DRBD (Distributed Replicated Block Device) เป็นโปรแกรมเพื่อใช้ในการ replicate ข้อมูลดิสก์ที่อยู่คนละเครื่องกัน ผ่านทางเน็ตเวิร์ก โดยจะทำในระดับ block ของดิสก์
เมื่อมีการเปลี่ยนแปลงข้อมูลที่อยูในดิสก์เครื่องหนึ่ง (primary) การเปลี่ยนแปลงนั้นจะถูก replicate ไปยังอีกเครื่อง (secondary) โดยอัตโนมัติ
DRBD ประกอบด้วยสองส่วนคือ
1. Kernel module – DRBD ทำหน้าที่ใน kernel โดยจะสร้าง virtual block device คั่นกลางระหว่าง physical disk กับ filesystem ที่สร้างอยู่ ไม่ว่าจะเป็น ext3, ext4, xfs
2. User space administration tools – เป็นโปรแกรมที่ช่วยในการจัดการ DRBD ได้ง่ายขึ้น หลักๆ จะเป็น drbdadm
ในบทความนี้จะแสดงการติดตั้งโปรแกรม DRBD และคอนฟิกเป็นแบบ Single-primary mode คือ ณ เวลาใดเวลาหนึ่ง มีเครื่องเดียวเท่านั้นที่สามารถ อ่าน เขียน ข้อมูลได้
คำเตือน ติดตั้งและคอนฟิก DRBD บนเครื่องทดสอบให้เข้าใจก่อน เพราะบางคำสั่งอาจกระทบข้อมูลดิสก์หรือ partition ที่มีอยู่ในเครื่องได้ ทำให้ข้อมูลเสียหายได้
ระบบสำหรับการทดสอบ
ในที่นี้จะติดตั้ง CentOS 5.4 พร้อมคอนฟิกให้สองเครื่องติดต่อ ping กันได้ และปิดคุณสมบัติ firewall ทั้งหมด
เครื่องที่ 1
* Hostname: centos54-a.spalinux.com
* IP Address: 10.3.3.51
เครื่องที่ 2
* Hostname: centos54-b.spalinux.com
* IP Address: 10.3.3.52
แก้ไขไฟล์ /etc/hosts เพื่อให้ทั้งสองเครื่องอ้างอิงจากชื่อเครื่องได้
ตัวอย่างคอนฟิกของเครื่องที่ 1
[root@centos54-a ~]# hostname
centos54-a.spalinux.com
[root@centos54-a ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
10.3.3.51 centos54-a centos54-a.spalinux.com
10.3.3.52 centos54-b centos54-b.spalinux.com
ตัวอย่างคอนฟิกของเครื่องที่ 2
[root@centos54-b ~]# hostname
centos54-b.spalinux.com
[root@centos54-b ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
10.3.3.51 centos54-a centos54-a.spalinux.com
10.3.3.52 centos54-b centos54-b.spalinux.com
ทั้งสองเครื่อง ต้องสร้าง partition สำหรับใช้เป็นดิสก์ DRBD โดยไม่ต้องสร้าง filesystem ใดๆ ทั้งสิ้นบน partition นี้ สมมติว่าเป็น /dev/sda5 บนทั้งสองเครื่อง
หมายเหตุ
* แนะนำให้สร้าง partition ทั้งสองเครื่องให้เหมือนกัน ขนาดเท่ากัน จะได้ง่ายต่อการคอนฟิก
* สำหรับการทดสอบเริ่มต้น แนะนำให้สร้างขนาด partition เล็กๆ ก่อน จะได้ใช้เวลาในการ sync ข้อมูลไม่นานมากนัก ในบทความนี้สร้างประมาณ 1 GBytes
ติดตั้งโปรแกรม DRBD
ไฟล์ติดตั้ง DRBD ในรูปแบบ rpm ของ CentOS 5.4 นั้น ไม่อยู่ในแผ่นดีวีดีติดตั้ง แต่จะอยู่ในส่วนของ extras สำหรับในเมืองไทยสามารถดาวน์โหลดได้จาก
http://www.mirror.in.th/osarchive/centos/5.4/extras/ดาวน์โหล์ด และติดตั้งไฟล์ rpm สองไฟล์ บนเครื่องทั้งสอง
* drbd83-8.3.2-6.el5_3.x86_64.rpm – “User space administration tools”
* kmod-drbd83-8.3.2-6.el5_3.x86_64.rpm – “Kernel Module”
ใช้คำสั่ง rpm เพื่อติดตั้ง
[root@centos54-a ~]# rpm -ivh drbd83-8.3.2-6.el5_3.x86_64.rpm
Preparing... ########################################### [100%]
1:drbd83 ########################################### [100%]
[root@centos54-a ~]# rpm -ivh kmod-drbd83-8.3.2-6.el5_3.x86_64.rpm
Preparing... ########################################### [100%]
1:kmod-drbd83 ########################################### [100%]
คอนฟิก DRBD บนเครื่องที่ 1 (primary)
ไฟล์คอนฟิกหลักของ DRBD คือไฟล์ /etc/drbd.conf ต้องมีการแก้ไขไฟล์นี้ก่อนถึงจะเริ่มใช้งานได้ โดยมีไฟล์ตัวอย่างคอนฟิกอยู่ใน /usr/share/doc/drbd83/drbd.conf
ไฟล์คอนฟิก /etc/drbd.conf จากการติดตั้ง
[root@centos54-a ~]# cat /etc/drbd.conf
#
# please have a a look at the example configuration file in
# /usr/share/doc/drbd83/drbd.conf
#
สร้างไฟล์คอนฟิก /etc/drbd.conf บนเครื่องที่ 1 “centos54-a.spalinux.com” ดังนี้
[root@centos54-a ~]# cat /etc/drbd.conf
global {
usage-count no;
}
common {
syncer { rate 10M; }
}
resource r0 {
protocol C;
net {
cram-hmac-alg "sha1";
shared-secret "test1234";
}
on centos54-a.spalinux.com {
device /dev/drbd0;
disk /dev/sda5;
address 10.3.3.51:8888;
meta-disk internal;
}
on centos54-b.spalinux.com {
device /dev/drbd0;
disk /dev/sda5;
address 10.3.3.52:8888;
meta-disk internal;
}
}
คำอธิบายเบื้องต้น
* shared-secret เป็นการกำหนดรหัสของเครื่องที่สามารถ replicate ข้อมูลกันได้
* r0 เป็นชื่อ resource ของ DRBD สามารถตั้งเป็นชื่อใดๆ ก็ได้ เพื่อสื่อความหมาย
* on ตามด้วยชื่อ hostname ที่ต้องการ replicate ข้อมูลกัน ส่วนในวงเล็บ { เป็นการกำหนดคอนฟิกของแต่ละเครื่อง
* disk คือชื่อ partition ที่สร้างไว้สำหรับการทำ DRBD ในที่นี้คือ /dev/sda5
ใช้คำสั่ง drbadm create-md เพื่อสร้าง meta data บน partition ที่จะทำเป็น DRBD
[root@centos54-a ~]# drbdadm create-md all
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
หาก partition ที่คอนฟิกเป็น DRBD มี filesystem อยู่ก่อนแล้ว จะไม่สามารถสร้าง DRBD ได้
[root@centos54-a ~]# drbdadm create-md all
md_offset 1011671040
al_offset 1011638272
bm_offset 1011605504
Found ext3 filesystem which uses 987964 kB
current configuration leaves usable 987896 kB
Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
Operation refused.
Command 'drbdmeta 0 v08 /dev/sda5 internal create-md' terminated with exit code 40
drbdadm create-md r0: exited with code 40
วิธีการแก้ไขคือต้องลบข้อมูลของ filesystem บน partition /dev/sda5 นี้ออก วิธีการง่ายสุดคือใช้คำสั่ง dd
คำเตือน คำสั่ง dd จะลบข้อมูลทั้งหมดบน partition ที่ระบุ
[root@centos54-a ~]# dd if=/dev/zero of=/dev/sda5
dd: writing to `/dev/sda5': No space left on device
1975933+0 records in
1975932+0 records out
1011677184 bytes (1.0 GB) copied, 87.2749 seconds, 11.6 MB/s
แล้วถึงสามารถสร้าง meta data ของ DRBD ได้
[root@centos54-a ~]# drbdadm create-md all
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
ใช้คำสั่ง service เพื่อรันเซอร์วิส DRBD
[root@centos54-a ~]# service drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ]..........
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 0 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 0 seconds. [wfc-timeout]
(These values are for resource 'r0'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 20]:yes
ในครั้งแรกที่รันเซอร์วิส บนเครื่อง primary โปรแกรมจะรอให้เครื่อง peer (secondary) เข้ามาเชื่อมต่อ หากไม่ต้องการให้รอ ให้พิมพ์คำว่า “yes” แล้ว [Enter]
ใช้คำสั่ง service status เพื่อตรวจสอบสถานะของ DRBD
[root@centos54-a ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
0:r0 WFConnection Secondary/Unknown Inconsistent/DUnknown C
หรืออ่านจากไฟล์ /proc/drbd โดยตรง
[root@centos54-a ~]# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown 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:b oos:987896
สร้างไดเรคทอรี /export สำหรับทดสอบ mount เพื่อใช้ดิสก์ drbd ที่สร้างขึ้น
[root@centos54-a ~]# mount /dev/drbd0 /export
mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: Wrong medium type
ดิสก์นี้ยังไม่สามารถใช้ได้ ต้องใช้คำสั่ง drbdadm primary คอนฟิกให้ดิสก์ drbd บนเครื่องนี้ทำหน้าที่เป็น primary เพื่อให้สามารถ อ่าน เขียน ข้อมูลจากดิสก์ได้
[root@centos54-a ~]# drbdadm primary all
0: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk
Command 'drbdsetup 0 primary' terminated with exit code 17
หากเป็นการเรียกใช้ครั้งแรก ต้องระบุออปชั่นดังนี้
[root@centos54-a ~]# drbdadm -- --overwrite-data-of-peer primary all
[root@centos54-a ~]#
ตรวจสอบสถานะ drbd อีกครั้ง สังเกตว่า ฟิลด์ ro จะเปลี่ยนจาก Seconday เป็น Primary และฟิลด์ ds จะเปลี่ยนจาก Inconsistent เป็น UpToDate
[root@centos54-a ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
0:r0 WFConnection Primary/Unknown UpToDate/DUnknown C
ทดสอบการ mount ดิสก์อีกครั้ง
[root@centos54-a ~]# mount /dev/drbd0 /export
mount: you must specify the filesystem type
ก็ยังไม่สามารถ mount ได้ เพราะยังไม่มี filesystem บน /dev/drbd0
รันคำสั่ง mkfs.ext3 เพื่อสร้าง filesystem แบบ ext3
[root@centos54-a ~]# mkfs.ext3 /dev/drbd0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
123648 inodes, 246974 blocks
12348 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=255852544
8 block groups
32768 blocks per group, 32768 fragments per group
15456 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
ทดสอบการ mount อีกครั้ง จะสามารถใช้งานได้แล้ว
[root@centos54-a ~]# mount /dev/drbd0 /export
ตรวจสอบสถานะ DRBD
[root@centos54-a ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
0:r0 WFConnection Primary/Unknown UpToDate/DUnknown C /export ext3
คอนฟิก DRBD บนเครื่องที่ 2 (secondary)
สร้างไฟล์คอนฟิก /etc/drbd.conf บนเครื่องที่ 2 เหมือนกับไฟล์ในเครื่องที่ 1
[root@centos54-b ~]# cat /etc/drbd.conf
global {
usage-count no;
}
common {
syncer { rate 10M; }
}
resource r0 {
protocol C;
net {
cram-hmac-alg "sha1";
shared-secret "test1234";
}
on centos54-a.spalinux.com {
device /dev/drbd0;
disk /dev/sda5;
address 10.3.3.51:8888;
meta-disk internal;
}
on centos54-b.spalinux.com {
device /dev/drbd0;
disk /dev/sda5;
address 10.3.3.52:8888;
meta-disk internal;
}
}
ใช้คำสั่ง drbadm create-md เพื่อสร้าง meta data บน partition ที่จะทำเป็น DRBD
[root@centos54-b ~]# drbdadm create-md all
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
เช่นเดียวกัน หากมี filesystem อยู่บน partition ก่อนแล้ว ต้องใช้คำสั่ง dd เพื่อลบข้อมูลออก
ใช้คำสั่ง service เพื่อรันเซอร์วิส DRBD
[root@centos54-b ~]# service drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].
เมื่อเริ่มต้นรันเซอร์วิส DRBD บนเครื่องที่ 2 จะเป็นการเริ่ม replicate ข้อมูลจากเครื่องที่ 1
ตรวจสอบสถานะ DRBD บนเครื่องที่ 2
[root@centos54-b ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
... sync'ed: 42.2% (576248/987896)K
0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C
ตรวจสอบสถานะ DRBD บนเครื่องที่ 1
[root@centos54-a ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
... sync'ed: 43.0% (567032/987896)K
0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C /export ext3
เมื่อ replicate ข้อมูลเรียบร้อย (synced) ข้อมูลแล้ว สถานะจะเป็นดังนี้
ตรวจสอบสถานะ DRBD บนเครื่องที่ 2 เมื่อ synced ข้อมูลเรียบร้อย
[root@centos54-b ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
0:r0 Connected Secondary/Primary UpToDate/UpToDate C
ตรวจสอบสถานะ DRBD บนเครื่องที่ 1 เมื่อ synced ข้อมูลเรียบร้อย
[root@centos54-a ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res cs ro ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C /export ext3
หลังจาก synced ข้อมูลระหว่างเครื่องเรียบร้อย เมื่อมีการเปลี่ยนแปลงข้อมูลในดิสก์บนเครื่องที่ 1 (primary) การเปลี่ยนแปลงนั้นจะถูก replicate ไปยังเครื่องที่ 2 (secondary) โดยอัตโนมัติ
ตัวอย่างการใช้คำสั่ง tcpdump ตรวจสอบ packet ที่ส่งระหว่างเครื่องเพื่อการ replicate ข้อมูลของ DRBD
[root@centos54-b ~]# tcpdump -i eth0 -l -nn | grep 8888
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:51:39.815802 IP 10.3.3.52.8888 > 10.3.3.51.42180: P 2834377596:2834377604(
ack 2893184807 win 46 <nop,nop,timestamp 1772852 1818781>
15:51:39.816356 IP 10.3.3.51.42180 > 10.3.3.52.8888: P 1:9(
ack 8 win 3216 <nop,nop,timestamp 1828655 1772852>
15:51:39.816394 IP 10.3.3.52.8888 > 10.3.3.51.42180: . ack 9 win 46 <nop,nop,timestamp 1772852 1828655>
15:51:44.888876 IP 10.3.3.1.4117 > 10.3.3.51.22: P 1560:1612(52) ack 1629 win 64271
15:51:49.815252 IP 10.3.3.51.42180 > 10.3.3.52.8888: P 9:17(
ack 8 win 3216 <nop,nop,timestamp 1838655 1772852>
15:51:49.815330 IP 10.3.3.52.8888 > 10.3.3.51.42180: . ack 17 win 46 <nop,nop,timestamp 1782853 1838655>
15:51:49.815666 IP 10.3.3.52.8888 > 10.3.3.51.42180: P 8:16(
ack 17 win 46 <nop,nop,timestamp 1782853 1838655>
15:51:49.847300 IP 10.3.3.51.42180 > 10.3.3.52.8888: . ack 16 win 3216 <nop,nop,timestamp 1838696 1782853>
15:51:50.937877 IP 10.3.3.51.8888 > 10.3.3.52.40284: . 3903780263:3903781711(1448) ack 2834246899 win 501 <nop,nop,timestamp 1839875 1683335>
...