Formatting code for StorageDRBD


show source only

{{parent page="Storage"}}

Read this: https://services.ibb.gatech.edu/wiki/index.php/Howto:Software:DRBD
Even better: http://marksitblog.blogspot.com/2007/07/mysql-5-high-availability-with-drbd-8.html
Heartbeat: http://www.linuxjournal.com/article/5862 http://www.linux-ha.org/GettingStarted

===DRBD===
==Download and install==
Download drbd from http://www.drbd.org

Build the kernel module
%%
cd drbd-0.8.6/drbd
make clean all
cd ..
make tools
make install
modprobe drbd
lsmod | grep drbd
%%

==Preparing the storage sub-system==
For DRBD, one can choose to use internal meta-data, or store meta-data on a separate partition. I'll use an external meta-data partition. The size of that partition is roughly DATA_PARTITION/32768+1. That's roughly 0.008% of the data partition. The actual formula can be found at http://www.drbd.org/users-guide/ch-internals.html#s-meta-data-size

==Configuration and initialization==
On node1
1. edit /etc/drbd.conf
2. modprobe drbd
3. drbdadm -d adjust mydata # check your config with -d (dry-run) option
4. drbdadm create-md mydata #create meta data partition
5. drbdadm adjust mydata # activate your config
>>To activate any configuration changes, do a "drbdadm adjust mydata">>
On node2
Repeat step 1-5 above

Bring up the primary on node 1
*be warned, the -o option will remove ANY data on secondary node.
%%
drbdsetup /dev/drbd0 primary -o
%%

Then on both node, start the drbd service. Make sure the ports defined in drbd.conf are accessible. On freshly installed redhat/centos, iptables may stand in your way. Do what you need to.
%%
service drbd start
%%

Check /proc/drbd for progress, it should look like:
%%
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by root@prod01xxx.org, 2007-09-06 12:42:29
0: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r---
ns:0 nr:920864 dw:920736 dr:0 al:0 bm:56 lo:5 pe:251 ua:4 ap:0
[>...................] sync'ed: 3.0% (29771/30670)M
finish: 2:21:08 speed: 3,456 (11,508) K/sec
resync: used:1/31 hits:57744 misses:57 starving:0 dirty:0 changed:57
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
%%

Now just format the drbd volume as if it's another block device
%%
mkfs.ext3 -j -Lmydata /dev/drbd0
%%

==Testing fail-over==
Mount the partition on primary, write some data, then see if it comes up on node2...
1. On node1 mount and write data
2. On node1> drbdadm secondary mydata
3. On node2> drbdadm primary mydata
4. On node2, mount and read !

==Testing fail-back==
1. On node1> drbdadm invalidate mydata
2. On node2> restart drbd
3. synchronization will start automatically

==Testbed==
Platform: ES4 U5 32-bit
Version: DRBD 8.0.6
Partitions: c0d0p5 200M, c0d0p6 30G

Sample drbd.conf
%%(text;drbd-8.2.conf)
global {
usage-count yes;
}

common {
protocol C;
syncer {
rate 20M;
verify-alg md5;
}

handlers {
# shutdown heartbeat, if installed, on degrade to prevent failback to prevent data inconsistency
pri-on-incon-degr "logger -t HEARTBEAT: Primary inconsistent; service heartbeat stop";
}
startup {
wfc-timeout 30;
degr-wfc-timeout 60;
}
}

resource mydata {

disk {
on-io-error detach;
}

net {
max-buffers 8000;
max-epoch-size 8000;
}

device /dev/drbd0;
disk /dev/vg0/dr_data;
flexible-meta-disk /dev/vg0/dr_meta;

on db01.prod.xxx.com {
address 10.0.0.231:7789;
}

on db02.prod.xxx.com {
address 10.0.0.232:7789;
}
}
%%

%%(text;drbd-8.1.conf)
resource mydata {
protocol C;

# shutdown heartbeat, if installed, on degrade to prevent failback to prevent data inconsistency
incon-degr-cmd "service heartbeat stop";

startup {
wfc-timeout 0;
degr-wfc-timeout 60;
}

disk {
on-io-error detach;
}

net {
# timeout 60;
# connect-int 10;
# ping-int 10;
# max-buffers 2048;
# max-epoch-size 2048;
}

syncer {
rate 20M;
al-extents 257;
}

on prod02.xxx.org {
device /dev/drbd0;
disk /dev/cciss/c0d0p6;
address 10.0.0.2:7789;
meta-disk /dev/cciss/c0d0p5[0];
}

on prod01.xxx.org {
device /dev/drbd0;
disk /dev/cciss/c0d0p6;
address 10.0.0.1:7789;
meta-disk /dev/cciss/c0d0p5[0];
}
}

%%

==Force a rebuild / verify consistency==
Version 8.2.4 added online validation. Prior to that, one can only invalidate the failed node and force a full resync.

Prior to 8.2.4
%%
bad node# drbdadm disconnect all; drbdadm invalidate all; drbdadm connect all
good node# drbdadm connect all
%%

On 8.2.4
%%
On secondary:

# detects inconsistency - requires verify-alg option in syncer section
drbdadm verify resource
cat /proc/drbd

# recover inconsistency
drbdadm disconnect resource
drbdadm connect resource

# To maximize thruput for resync temporarily:
drbdsetup /dev/drbd0 syncer -r 50M
# To revert the changes
drbdadm adjust mydata
%%
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki