|
先决条件
- 安装最小化的 CentOS 5
- 确保这两个节点能正确地解析名称(通过 dns 或 /etc/hosts)
- yum update(例行的……)
- yum install heartbeat drbd kmod-drbd(由 extras 软件库提供)
希望使用 drbd 8.2.6 而不是 8.0.13 的人们可以利用 drbd82 及 kmod-drbd82。请留意你不能混合使用不同版本。设置的语法亦有分别。
现时情况:
- node1.yourdomain.org 172.29.156.20/24,将要被复制的来源磁盘 /dev/sdb
- node2.yourdomain.org 172.29.156.21/24,目的磁盘 /dev/sdb
设置 DRBD
我们会设置 DRBD 将 /dev/sdb 由一个节点复制到另一个节点(角色可以随时对换)。drbd 的资源名称是“repdata”(你当然可以使用你喜欢的名称)。下面是 /etc/drbd.conf 文件的内容:
#
# please have a a look at the example configuration file in
# /usr/share/doc/drbd/drbd.conf
#
global { usage-count no; }
resource repdata {
protocol C;
startup { wfc-timeout 0; degr-wfc-timeout 120; }
disk { on-io-error detach; } # or panic, ...
net { cram-hmac-alg "sha1"; shared-secret "Cent0Sru!3z"; } # don't forget to choose a secret for auth !
syncer { rate 10M; }
on node1.yourdomain.org {
device /dev/drbd0;
disk /dev/sdb;
address 172.29.156.20:7788;
meta-disk internal;
}
on node2.yourdomain.org {
device /dev/drbd0;
disk /dev/sdb;
address 172.29.156.21:7788;
meta-disk internal;
}
}
- 将这个配置文件(/etc/drbd.conf)复制到第二个节点
scp /etc/drbd.conf root@node2:/etc/
- 在引导 drbd 前先初始化磁盘上的中继数据区(两个节点上都要!)
[iyunv@node1 etc]# drbdadm create-md repdata
v08 Magic number not found
v07 Magic number not found
About to create a new drbd meta data block on /dev/sdb.
. ==> This might destroy existing data! <==
Do you want to proceed? [need to type 'yes' to confirm] yes
Creating meta data... initialising activity log NOT initialized bitmap (256 KB) New drbd meta data block sucessfully created.
- 在两个节点上引导 drbd(service drbd start)
[iyunv@node1 etc]# service drbd start
Starting DRBD resources: [ d0 n0 ]. ......
[iyunv@node1 etc]# cat /proc/drbd
version: 8.0.4 (api:86/proto:86) SVN Revision: 2947 build by buildsvn@c5-i386-build, 2007-07-31 19:17:18
. 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
. ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
. resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
[iyunv@node1 etc]# ssh root@node2 cat /proc/drbd version: 8.0.4 (api:86/proto:86) SVN Revision: 2947 build by buildsvn@c5-i386-build, 2007-07-31 19:17:18
. 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
. ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
. resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
如你所见,这两个节点都是次要的,这是正常的。我们须要决定现时那一个是主要节点(node1):这样做便会开始两个节点之间的首次“完整同步”:
[iyunv@node1 etc]# drbdadm -- --overwrite-data-of-peer primary repdata
[iyunv@node1 etc]# watch -n 1 cat /proc/drbd version: 8.0.4 (api:86/proto:86) SVN Revision: 2947 build by buildsvn@c5-i386-build, 2007-07-31 19:17:18
. 0: cs:SyncTarget st:Primary/Secondary ds:Inconsistent/Inconsistent C r---
. ns:0 nr:68608 dw:68608 dr:0 al:0 bm:4 lo:0 pe:0 ua:0 ap:0
. [>...................] sync'ed: 0.9% (8124/8191)M finish: 0:12:05 speed: 11,432 (11,432) K/sec resync: used:0/31 hits:4283 misses:5 starving:0 dirty:0 changed:5 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
- 现在我们可以将 /dev/drbd0 格式化,并在 node1 上挂载它:mkfs.ext3 /dev/drbd0 ; mkdir /repdata ; mount /dev/drbd0 /repdata
- 在 node1 上创建一些虚构的数据:
- [iyunv@node1 etc]# for i in {1..5};do dd if=/dev/zero of=/repdata/file$i bs=1M count=100;done
- 现在手动式地切换到第二个节点:
[iyunv@node1 /]# umount /repdata ; drbdadm secondary repdata
[iyunv@node2 /]# mkdir /repdata ; drbdadm primary repdata ; mount /dev/drbd0 /repdata
[iyunv@node2 /]# ls /repdata/ file1 file2 file3 file4 file5 lost+found
非常好,数据已经被复制了……现在让我们删除/新增一些文件:
[iyunv@node2 /]# rm /repdata/file2 ; dd if=/dev/zero of=/repdata/file6 bs=100M count=2
- 现在再返回第一个节点:
[iyunv@node2 /]# umount /repdata/ ; drbdadm secondary repdata
[iyunv@node1 /]# drbdadm primary repdata ; mount /dev/drbd0 /repdata
[iyunv@node1 /]# ls /repdata/ file1 file3 file4 file5 file6 lost+found
很好…… drbd 可以正常运作了……让我们确定它经常会被引导:chkconfig drbd on
设置 Heartbeat V2
让我们设置一个简单的 /etc/ha.d/ha.cf 文件:
keepalive 2
deadtime 30
warntime 10
initdead 120
bcast eth0
node node1.yourdomain.org
node node2.yourdomain.org
crm yes
请亦创建 /etc/ha.d/authkeys(设置 600 的权限!!!):
auth 1
1 sha1 MySecret
在 node1 上引导 heartbeat 服务:
[iyunv@node1 ha.d]# service heartbeat start
Starting High-Availability services: [OK]
检查群集的状况:
[iyunv@node1 ha.d]# crm_mon
现在复制 ha.cf 及 authkeys 到 node2,然后引导 heartbeat:
[iyunv@node1 ha.d]# scp /etc/ha.d/ha.cf /etc/ha.d/authkeys root@node2:/etc/ha.d/
[iyunv@node2 ha.d]# service heartbeat start
用 crm_mon 来检查群集:
=====
Last updated: Wed Sep 12 16:20:39 2007
Current DC: node1.centos.org (6cb712e4-4e4f-49bf-8200-4f15d6bd7385)
2 Nodes configured.
0 Resources configured.
=====
Node: node1.yourdomain.org (6cb712e4-4e4f-49bf-8200-4f15d6bd7385): online
Node: node2.yourdomain.org (f6112aae-8e2b-403f-ae93-e5fd4ac4d27e): online
有关图像界面的备注: 你可以在一台 X 工作台上安装 heartbeat-gui(yum install heartbeat-gui)来连接到群集,但你会需要在两个节点上都更 hacluster 户口的口令!(你亦可以用另一个户口,但它必须被放在 haclient 群组内)
现在我们会创建一个资源群组,当中藏有一个 IP 地址(172.29.156.200)、drbd 设备(名叫 repdata)、及挂载文件系统的动作(mount /dev/drbd0 /repdata)。注:使用一个群组比个别资源较为容易:它会依次序(ordered=true)在同一个节点上(collocated=true)引导所有资源。
下面是 /var/lib/heartbeat/crb/cib.xml 的内容:
<cib generated="false" admin_epoch="0" epoch="25" num_updates="1" have_quorum="true" ignore_dtd="false" num_peers="0" cib-last-written="Sun Sep 16 19:47:18 2007" cib_feature_revision="1.3" ccm_transition="1">
<configuration>
<crm_config/>
<nodes>
<node id="6cb712e4-4e4f-49bf-8200-4f15d6bd7385" uname="node1.yourdomain.org" type="normal"/>
<node id="f6112aae-8e2b-403f-ae93-e5fd4ac4d27e" uname="node2.yourdomain.org" type="normal"/>
</nodes>
<resources>
<group id="My-DRBD-group" ordered="true" collocated="true">
<primitive id="IP-Addr" class="ocf" type="IPaddr2" provider="heartbeat">
<instance_attributes id="IP-Addr_instance_attrs">
<attributes>
<nvpair id="IP-Addr_target_role" name="target_role" value="started"/>
<nvpair id="2e967596-73fe-444e-82ea-18f61f3848d7" name="ip" value="172.29.156.200"/>
</attributes>
</instance_attributes>
</primitive>
<instance_attributes id="My-DRBD-group_instance_attrs">
<attributes>
<nvpair id="My-DRBD-group_target_role" name="target_role" value="started"/>
</attributes>
</instance_attributes>
<primitive id="DRBD_data" class="heartbeat" type="drbddisk" provider="heartbeat">
<instance_attributes id="DRBD_data_instance_attrs">
<attributes>
<nvpair id="DRBD_data_target_role" name="target_role" value="started"/>
<nvpair id="93d753a8-e69a-4ea5-a73d-ab0d0367f001" name="1" value="repdata"/>
</attributes>
</instance_attributes>
</primitive>
<primitive id="FS_repdata" class="ocf" type="Filesystem" provider="heartbeat">
<instance_attributes id="FS_repdata_instance_attrs">
<attributes>
<nvpair id="FS_repdata_target_role" name="target_role" value="started"/>
<nvpair id="96d659dd-0881-46df-86af-d2ec3854a73f" name="fstype" value="ext3"/>
<nvpair id="8a150609-e5cb-4a75-99af-059ddbfbc635" name="device" value="/dev/drbd0"/>
<nvpair id="de9706e8-7dfb-4505-b623-5f316b1920a3" name="directory" value="/repdata"/>
</attributes>
</instance_attributes>
</primitive>
</group>
</resources>
<constraints>
<rsc_location id="runs_on_pref_node" rsc="My-DRBD-group">
<rule id="prefered_runs_on_pref_node" score="100">
<expression attribute="#uname" id="786ef2b1-4289-4570-8923-4c926025e8fd" operation="eq" value="node1.yourdomain.org"/>
</rule>
</rsc_location>
</constraints>
</configuration>
</cib>
如你所见,我们创建了一个 rsc_location 的限制,好叫群集的所有资源都会缺省的节点上引导。
现在你可以通过命令行(crm_resource)或图像界面(更改位置限制值 —— 例如将 node1.yourdomain.org 转为 node2.yourdomain.org,然后点击 apply)来移动资源。你将会能够看见所有资源因一个节点切换到另一个节点(位置、drbd 及挂载文件系统)
防火墙的考虑
你须要确定节点可以通过以下端口沟通:
DRBD: 7788
HEARTBEAT: 694 |
|