1872611700.doc리눅스기반 스토리지를 DRBD+ ISCSI를 사용하여 이중화하여 윈도우에서 사용하기
리눅스의 디스크를 윈도우에서 마운트 하여 사용하는 방법으로 SAMBA 가 많이 알려져 있다.
하지만 다른 방법으로 한번 사용을 해보고자 한다.
리눅스 파티션중 하나를 윈도우에서 드라이브로 잡아서 인식 시켜서 사용하는 방법을 설명해 보고자 한다. 그냥 작업을 하면 심심하기 때문에 여기에 이중화 라는 단어를 넣어서 이중화된 스토리지를 윈도우에서 로컬 하드 디스크처럼 사용해 보자. 핵심은 스토리지 이중화 이다.
DRBD 에 대해서 간략히 설명을 하면 네트워크로 물리적으로 떨어진 두대의 서버의 하드 디스크 혹은 파티션을 raid 1 으로 구성하여 사용을 할 수 있게 해 주는 솔루션이다. 즉 스토리지 이중화에 사용을 하게 된다.
우선 서버는 총 3대가 필요하다.
리눅스 : 2대 (Debian Etch)
윈도우 : 1대 (Windows Server 2008)
사용 프로그램 리스트
kernel 2.6.26.3
drbd 8.2.6
iscsitarget-0.4.16
heartbeat-2
iscsi initiator 2.07
설치
먼저 윈도우 vista 혹은 2008 이 아니라면 iscsi initiator 를 다운로드 받아서 설치한다.
주의 할점은 윈도우 서버의 architecture 에 맞는 버전으로 설치를 해야 한다.
http://www.microsoft.com/downloads/details.aspx?FamilyID=12cb3c1a-15d6-4585-b385-befd1319f825&DisplayLang=en
Windows 2008 에서는 이미 설치가 되어 있으므로 위 과정을 생략한다.
리눅스에서 설치를 위해 프로그램을 먼저 다운로드를 받는다.
dongho7:/usr/src# wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.3.tar.bz2 —18:10:33— http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.3.tar.bz2 => `linux-2.6.26.3.tar.bz2′ Resolving kernel.org… 204.152.191.5, 204.152.191.37 Connecting to kernel.org|204.152.191.5|:80… connected. HTTP request sent, awaiting response… 200 OK Length: 49,452,289 (47M) [application/x-bzip2]
100%[====================================>] 49,452,289 4.63M/s ETA 00:00
18:10:51 (2.66 MB/s) – `linux-2.6.26.3.tar.bz2′ saved [49452289/49452289]
dongho7:/usr/src# wget http://nchc.dl.sourceforge.net/sourceforge/iscsitarget/iscsitarget-0.4.16.tar.gz —18:07:25— http://nchc.dl.sourceforge.net/sourceforge/iscsitarget/iscsitarget-0.4.16.tar.gz => `iscsitarget-0.4.16.tar.gz’ Resolving nchc.dl.sourceforge.net… 211.79.60.17, 2001:e10:ffff:1f02::17 Connecting to nchc.dl.sourceforge.net|211.79.60.17|:80… connected. HTTP request sent, awaiting response… 200 OK Length: 103,196 (101K) [application/x-gzip]
100%[====================================>] 103,196 104.57K/s
18:07:27 (104.34 KB/s) – `iscsitarget-0.4.16.tar.gz’ saved [103196/103196]
dongho7:/usr/src# wget http://oss.linbit.com/drbd/8.2/drbd-8.2.6.tar.gz —18:13:03— http://oss.linbit.com/drbd/8.2/drbd-8.2.6.tar.gz => `drbd-8.2.6.tar.gz’ Resolving oss.linbit.com… 212.69.162.23 Connecting to oss.linbit.com|212.69.162.23|:80… connected. HTTP request sent, awaiting response… 200 OK Length: 335,382 (328K) [application/x-tar]
100%[====================================>] 335,382 127.10K/s
18:13:08 (126.87 KB/s) – `drbd-8.2.6.tar.gz’ saved [335382/335382]
|
이제 압축을 풀고 설치를 진행해 보자.
먼저 커널 부터 작업을 한다.
커널 config 시에 module 을 사용하도록 옵션을 체크한다.
컴파일 후에 부트 로더에 적재후 리부팅을 한다.
dongho7:/usr/src# tar jxvf linux-2.6.26.3.tar.bz2
dongho7:/usr/src# cd linux-2.6.26.3 dongho7:/usr/src/linux-2.6.26.3# make menuconfig dongho7:/usr/src/linux-2.6.26.3# make dongho7:/usr/src/linux-2.6.26.3# make install dongho7:/usr/src/linux-2.6.26.3# make modules_install dongho7:/usr/src/linux-2.6.26.3# vi /etc/lilo.conf dongho7:/usr/src/linux-2.6.26.3# lilo Added linux * dongho7:/usr/src/linux-2.6.26.3# reboot
Broadcast message from root@dongho7 (pts/0) (Mon Sep 1 18:23:01 2008):
The system is going down for reboot NOW!
|
이제 DRBD를 설치하자.
DRBD는 모듈 방식으로 컴파일 하여 설치를 진행을 한다.
참고로 DRBD 8.2.6 과 kernel 2.6.26.3 버전을 그대로 컴파일 시에 다음과 같은 에러가 나오게 된다.
dongho7:/usr/src# tar zxvf drbd-8.2.6.tar.gz
dongho7:/usr/src# cd drbd-8.2.6 dongho7:/usr/src/drbd-8.2.6# make clean all … make -C /lib/modules/2.6.26.3/build SUBDIRS=/usr/src/drbd-8.2.6/drbd modules make[2]: Entering directory `/usr/src/linux-2.6.26.3′ CC [M] /usr/src/drbd-8.2.6/drbd/drbd_buildtag.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_bitmap.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_proc.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_worker.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_receiver.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_req.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_actlog.o CC [M] /usr/src/drbd-8.2.6/drbd/lru_cache.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_main.o /usr/src/drbd-8.2.6/drbd/drbd_main.c: In function ‘drbd_cleanup’: /usr/src/drbd-8.2.6/drbd/drbd_main.c:2567: error: ‘proc_root’ undeclared (first use in this function) /usr/src/drbd-8.2.6/drbd/drbd_main.c:2567: error: (Each undeclared identifier is reported only once /usr/src/drbd-8.2.6/drbd/drbd_main.c:2567: error: for each function it appears i n.) /usr/src/drbd-8.2.6/drbd/drbd_main.c: In function ‘drbd_init’: /usr/src/drbd-8.2.6/drbd/drbd_main.c:2789: error: ‘proc_root’ undeclared (first use in this function) make[3]: *** [/usr/src/drbd-8.2.6/drbd/drbd_main.o] Error 1 make[2]: *** [_module_/usr/src/drbd-8.2.6/drbd] Error 2 make[2]: Leaving directory `/usr/src/linux-2.6.26.3′ make[1]: *** [kbuild] Error 2 make[1]: Leaving directory `/usr/src/drbd-8.2.6/drbd’ make: *** [module] Error 2
|
아래는 패치 파일 내용이다.
&proc_root 를 NULL로 바꾼 것이다.
dongho7:/usr/src# cat patch-drbd_main — drbd/drbd_main.c 2008-09-01 12:01:56.000000000 +0900 +++ drbd/drbd_main.c 2008-09-01 12:02:14.000000000 +0900 @@ -2564,7 +2564,7 @@
if (minor_table) { if (drbd_proc) – remove_proc_entry(“drbd”, &proc_root); + remove_proc_entry(“drbd”, NULL); i = minor_count; while (i–) { struct drbd_conf *mdev = minor_to_mdev(i); @@ -2786,7 +2786,7 @@ /* * register with procfs */ – drbd_proc = create_proc_entry(“drbd”, S_IFREG | S_IRUGO , &proc_root); + drbd_proc = create_proc_entry(“drbd”, S_IFREG | S_IRUGO , NULL);
if (!drbd_proc) { printk(KERN_ERR “drbd: unable to register proc file\n”);
|
패치를 다음과 같이 한다.
먼저 위 patch-drbd_main 파일을 /usr/src 등에 적당히 만든다.
그리고 아래와 같이 패치를 진행 한다.
아니면 그냥 drbd_main.c 파일 vi 로 열어서 위의 두곳만 수정해도 된다.
이해를 돕기 위해 patch 파일을 만든것 뿐이다.
dongho7:/usr/src# cd drbd-8.2.6 dongho7:/usr/src/drbd-8.2.6# patch -p0 -l < ../patch-drbd_main patching file drbd/drbd_main.c
|
다시 DRBD 에서 컴파일 하면 에러 없이 넘어가게 된다.
그리고 마지막으로 make install 로 설치를 해주자.
dongho7:/usr/src/drbd-8.2.6# make clean all … make -C /lib/modules/2.6.26.3/build SUBDIRS=/usr/src/drbd-8.2.6/drbd modules make[2]: Entering directory `/usr/src/linux-2.6.26.3′ CC [M] /usr/src/drbd-8.2.6/drbd/drbd_buildtag.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_bitmap.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_proc.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_worker.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_receiver.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_req.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_actlog.o CC [M] /usr/src/drbd-8.2.6/drbd/lru_cache.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_main.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_strings.o CC [M] /usr/src/drbd-8.2.6/drbd/drbd_nl.o LD [M] /usr/src/drbd-8.2.6/drbd/drbd.o Building modules, stage 2. MODPOST 1 modules CC /usr/src/drbd-8.2.6/drbd/drbd.mod.o LD [M] /usr/src/drbd-8.2.6/drbd/drbd.ko make[2]: Leaving directory `/usr/src/linux-2.6.26.3′ mv .drbd_kernelrelease.new .drbd_kernelrelease Memorizing module configuration … done. make[1]: Leaving directory `/usr/src/drbd-8.2.6/drbd’
Module build was successful.
dongho7:/usr/src/drbd-8.2.6# make install
|
iscsitarget 을 설치를 하자.
설치를 하다 보면 다음과 같은 에러를 만나게 된다.
2.6.26.3 버전 커널이랑 맞지않는다.
dongho7:/usr/src# tar zxvf iscsitarget-0.4.16.tar.gz dongho7:/usr/src# cd iscsitarget-0.4.16 dongho7:/usr/src# make … make[1]: Entering directory `/usr/src/linux-2.6.26.3′ CC [M] /usr/src/iscsitarget-0.4.16/kernel/block-io.o In file included from /usr/src/iscsitarget-0.4.16/kernel/block-io.c:12: include/linux/parser.h:32: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘match_strlcpy’ make[2]: *** [/usr/src/iscsitarget-0.4.16/kernel/block-io.o] Error 1 make[1]: *** [_module_/usr/src/iscsitarget-0.4.16/kernel] Error 2 make[1]: Leaving directory `/usr/src/linux-2.6.26.3′ make: *** [kernel] Error 2
|
개발 버전은 이럴때 쓰라고 있는 것이다.
iscsitarget 의 trunk 쪽에 패치된 버전이 있다.
svn (subversion) 을 설치를 하고 trunk의 파일을 다운로드 받아서 설치한다.
dongho7:/usr/src# svn checkout svn://svn.berlios.de/iscsitarget/trunk iscsitarget-trunk
dongho7:/usr/src# cd iscsitarget-trunk dongho7:/usr/src/iscsitarget-trunk# make dongho7:/usr/src/iscsitarget-trunk# make install `usr/ietd’ -> `/usr/sbin/ietd’ `usr/ietadm’ -> `/usr/sbin/ietadm’ `etc/initd/initd.debian’ -> `/etc/init.d/iscsi-target’ `etc/ietd.conf’ -> `/etc/ietd.conf’ `etc/initiators.allow’ -> `/etc/initiators.allow’ `etc/initiators.deny’ -> `/etc/initiators.deny’ `doc/manpages/ietadm.8′ -> `/usr/share/man/man8/ietadm.8′ `doc/manpages/ietd.8′ -> `/usr/share/man/man8/ietd.8′ `doc/manpages/ietd.conf.5′ -> `/usr/share/man/man5/ietd.conf.5′ install: creating directory `/usr/share/doc/iscsitarget’ `ChangeLog’ -> `/usr/share/doc/iscsitarget/ChangeLog’ `COPYING’ -> `/usr/share/doc/iscsitarget/COPYING’ `README’ -> `/usr/share/doc/iscsitarget/README’ `README.vmware’ -> `/usr/share/doc/iscsitarget/README.vmware’ install: creating directory `/lib/modules/2.6.26.3/kernel/iscsi’ `kernel/iscsi_trgt.ko’ -> `/lib/modules/2.6.26.3/kernel/iscsi/iscsi_trgt.ko’ Running depmod
|
마지막으로 heartbeat 를 설치한다.
이거는 편하게 debian 스타일로 설치를 해보자.
dongho7:~# apt-get install heartbeat-2
|
위 모든 설치를 리눅스 두대의 서버에 동일하게 한다.
설정
이상으로 설치는 마치고 이제 잘 configure 를 하는 일만 남아 있다.
먼저 DRBD 부터 설정을 한다.
기존의 config 파일은 백업을 해둔다.
그리고 drbd.conf 를 아래와 같이 만든다.
리눅스 두 서버 모두 동일하게 drbd.conf를 설정한다.
dongho7:~# cd /etc dongho7:/etc# cp drbd.conf drbd.conf.bak dongho7:/etc# vi drbd.conf dongho7:/etc# cat drbd.conf resource “cluster” { protocol C; handlers { pri-on-incon-degr “echo ‘pri-on-incon-degr'”; pri-lost-after-sb “echo ‘pri-lost-after-sb'”; local-io-error “echo ‘local-io-error'”; } startup { wfc-timeout 300; degr-wfc-timeout 120; } disk { on-io-error detach; } net { timeout 60; connect-int 10; ping-int 10; max-buffers 20000; max-epoch-size 20000; unplug-watermark 20000; } syncer { rate 512M; verify-alg md5; }
on dongho7 { device /dev/drbd0; disk /dev/sda6; address 192.168.0.13:7790; meta-disk internal; } on dongho8 { device /dev/drbd0; disk /dev/sda6; address 192.168.0.14:7790; meta-disk internal; } }
|
meta data 를 만든다.
이 과정 역시 두 리눅스 서버에서 동일하게 작업을 한다.
작업을 하다보면 가장 많이 보이는 에러 메세지가 아래의 메세지 일 것이다.
이미 파일시스템이 사용중이라서 아래의 세가지 방법중 하나를 선택 하라는 것이다.
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
어차피 /dev/sda6 에는 필요한 데이타가 없기 때문에 destory 로 진행을 해보자.
dongho7:~# drbdadm create-md cluster
–== This is a new installation of DRBD ==– Please take part in the global DRBD usage count at http://usage.drbd.org.
The counter works anonymously. It creates a random number to identify your machine and sends that random number, along with DRBD’s version number, to usage.drbd.org.
The benefits for you are: * In response to your submission, the server (usage.drbd.org) will tell you how many users before you have installed this version (8.2.6). * With a high counter LINBIT has a strong motivation to continue funding DRBD’s development.
http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=6080684011646847229&git=3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4
In case you want to participate but know that this machine is firewalled, simply issue the query string with your favorite web browser or wget. You can control all of this by setting ‘usage-count’ in your drbd.conf.
* You may enter a free form comment about your machine, that gets used on usage.drbd.org instead of the big random number. * If you wish to opt out entirely, simply enter ‘no’. * To count this node without comment, just press [RETURN]
–== Thank you for participating in the global usage survey ==– The server’s response is:
you are the 3095th user to install this version
From now on, drbdadm will contact usage.drbd.org only when you update DRBD or when you use ‘drbdadm create-md’. Of course it will continue to ask you for confirmation as long as ‘usage-count’ is at its default value of ‘ask’.
Just press [RETURN] to continue: md_offset 30005784576 al_offset 30005751808 bm_offset 30004834304
Found ext3 filesystem which uses 69633708 kB current configuration leaves usable 29301596 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 /dev/drbd0 v08 /dev/sda6 internal create-md’ terminated with exit code 40 drbdadm aborting
|
파일시스템이 있어서 destory 를 하려면 zero out the device를 해야 한다.
간단하게 dd 로 밀어 버리면 된다.
그리고 다시 meta data 를 만들어 보자.
아래는 예전에 만들었던 흔적이 있어서 overwirte 할것인지 물어 보지만 처음 만든다면 바로 만들어 질 것이다.
dongho7:~# dd if=/dev/zero of=/dev/sda6 bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.207193 seconds, 50.6 MB/s
dongho7:~# drbdadm create-md cluster v07 Magic number not found v07 Magic number not found You want me to create a v08 style flexible-size internal meta data block. There apears to be a v08 flexible-size internal meta data block already in place on /dev/sda6 at byte offset 30005784576 Do you really want to overwrite the existing v08 meta-data? [need to type ‘yes’ to confirm] yes
Writing meta data… initialising activity log NOT initialized bitmap New drbd meta data block sucessfully created.
|
이제 DRBD 데몬을 두 리눅스 서버 모두에서 start 한다.
dongho7:~# /etc/init.d/drbd start Starting DRBD resources: [ d(cluster) s(cluster) n(cluster) ]. …….dongho7:~# dongho7:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho7, 2008-09-01 19:20:28 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 oos:29301596
|
이제 어느 한쪽의 data 로 동기화를 진행을 해야 한다.
지금은 두 서버 모두 데이타가 없어서 어느쪽에서 진행을 하던 상관이 없지만 만약에 데이타가 들어 있는 상태에서 진행을 하는 경우라면 원본 서버쪽에서 작업을 해야 하므로 주의 해야 한다.
동기화 되는 과정을 /proc/drbd 에서 살펴 볼 수 있다.
현재 리눅스 서버는 1000T 랜카드로 크로스 케이블로 연결 되어 있어서 아래의 속도가 나오고 있다.
dongho7:~# drbdadm — –overwrite-data-of-peer primary cluster dongho7:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho7, 2008-09-01 19:20:28 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r— ns:1719812 nr:0 dw:0 dr:1798880 al:0 bm:104 lo:25 pe:294 ua:2496 ap:0 oos:27591164 [>……………….] sync’ed: 5.9% (26944/28614)M finish: 0:07:29 speed: 61,328 (50,304) K/sec
|
동기화가 완료 되면 다음과 같이 상태쪽에 UpToDate 로 두 서버 모두 나오게 된다.
참고로 다른 서버에서 보면 Primary/Secondary 가 반대로 보이게 된다. 당연히 정상이다.
dongho7:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho7, 2008-09-01 19:20:28 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r— ns:29301596 nr:0 dw:0 dr:29301596 al:0 bm:1789 lo:0 pe:0 ua:0 ap:0 oos:0
dongho8:~# cat /proc/drbd version: 8.2.6 (api:88/proto:86-88) GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@dongho8, 2008-09-01 13:01:24 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r— ns:0 nr:29301596 dw:29301596 dr:0 al:0 bm:1789 lo:0 pe:0 ua:0 ap:0 oos:0
|
이제 iscsitarget 쪽 설정을 하자.
먼저 기존 파일을 백업을 하고 ietd.conf 를 수정을 한다.
두 리눅스 서버에 동일하게 설정을 한다.
dongho7:~# cd /etc dongho7:/etc# cp ietd.conf ietd.conf.bak dongho7:/etc# vi ietd.conf dongho7:/etc# grep -v “#” /etc/ietd.conf Target iqn.2008-09.drbd.cluster:donghocluster IncomingUser dongho diffp@ssw0rd Lun 0 Path=/dev/drbd0,Type=fileio Alias donghocluster
|
이제 마지막으로 heartbeat 설정을 한다.
두 서버 모두 설정을 해야 하는데 이때 설정할때 아이피값이 서로 바꾸어 설정을 해야 한다.
서로 살았는지 체크를 위한 부분이므로 동일한 값을 넣으면 안된다.
dongho7:/etc/ha.d# vi ha.cf dongho7:/etc/ha.d# cat ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0
keepalive 1 deadtime 10 warntime 4 initdead 60 udpport 694 ucast eth0 10.30.6.14 ping 10.30.6.14 respawn hacluster /usr/lib/heartbeat/ipfail auto_failback off
node dongho7 node dongho8
dongho8:/etc/ha.d# cat ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0
keepalive 1 deadtime 10 warntime 4 initdead 60 udpport 694 ucast eth0 10.30.6.13 ping 10.30.6.13 respawn hacluster /usr/lib/heartbeat/ipfail auto_failback off
node dongho8 node dongho7
|
그리고 인증키를 만든다.
두 서버 모두에서 동일하게 작업을 한다.
dongho7:/etc/ha.d# vi authkeys dongho7:/etc/ha.d# chmod 600 authkeys dongho7:/etc/ha.d# cat authkeys auth 2 2 sha1 difficultp@ssw0rd
|
그리고 중요한 haresources 를 양쪽 서버에서 만든다.
dongho7:/etc/ha.d# vi haresources dongho7:/etc/ha.d# cat haresources dongho7 drbddisk::cluster \ iscsi-target \ Delay::2::0 \ IPaddr::10.30.6.10/24/eth0
dongho8:/etc/ha.d# vi haresources dongho8:/etc/ha.d# cat haresources dongho8 drbddisk::cluster \ iscsi-target \ Delay::2::0 \ IPaddr::10.30.6.10/24/eth0
|
이제 드디어 서비스 데몬 시작이다.
양쪽 서버에서 데몬을 시작 시킨다.
dongho7:~# /etc/init.d/heartbeat start Starting High-Availability services: Done.
dongho8:~# /etc/init.d/heartbeat start Starting High-Availability services: Done.
|
잠시후 master 서버쪽에서 떠 있는 데몬들 및 VIP 를 가지고 있는 것을 볼 수 있다.
dongho7:~# ip addr show 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop link/ether 1e:35:89:02:41:57 brd ff:ff:ff:ff:ff:ff 4: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:13:8f:fc:bd:43 brd ff:ff:ff:ff:ff:ff inet 10.30.6.13/24 brd 10.30.6.255 scope global eth0 inet 10.30.6.10/24 brd 10.30.6.255 scope global secondary eth0:0 5: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0e:2e:f7:03:e8 brd ff:ff:ff:ff:ff:ff inet 192.168.0.13/24 brd 192.168.0.255 scope global eth1
dongho7:~# ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 init [2] 2 ? S< 0:00 [kthreadd] 3 ? S< 0:00 [migration/0] 4 ? S< 0:00 [ksoftirqd/0] 5 ? S< 0:00 [watchdog/0] 6 ? S< 0:00 [events/0] 7 ? S< 0:00 [khelper] 127 ? S< 0:00 [kblockd/0] 128 ? S< 0:00 [kacpid] 129 ? S< 0:00 [kacpi_notify] 197 ? S< 0:00 [cqueue] 201 ? S< 0:00 [ata/0] 202 ? S< 0:00 [ata_aux] 203 ? S< 0:00 [ksuspend_usbd] 209 ? S< 0:00 [khubd] 212 ? S< 0:00 [kseriod] 214 ? S< 0:00 [kgameportd] 248 ? S 0:00 [pdflush] 249 ? S 0:00 [pdflush] 250 ? S< 0:00 [kswapd0] 251 ? S< 0:00 [aio/0] 252 ? S< 0:00 [nfsiod] 254 ? S< 0:00 [jfsIO] 255 ? S< 0:00 [jfsCommit] 256 ? S< 0:00 [jfsSync] 918 ? S< 0:00 [bond0] 980 ? S< 0:00 [iscsi_eh] 1007 ? S< 0:00 [scsi_eh_0] 1009 ? S< 0:00 [scsi_eh_1] 1099 ? S< 0:00 [kpsmoused] 1103 ? S< 0:00 [kstriped] 1105 ? S< 0:00 [kmpathd/0] 1106 ? S< 0:00 [ksnapd] 1112 ? S< 0:00 [rpciod/0] 1118 ? S< 0:00 [kjournald] 1236 ? S<s 0:00 udevd –daemon 2304 ? S< 0:00 [kjournald] 2305 ? S< 0:00 [kjournald] 2384 ? Ss 0:00 /sbin/portmap 2525 ? Ss 0:00 /sbin/syslogd 2531 ? Ss 0:00 /sbin/klogd -x 2550 ? Ss 0:00 /usr/sbin/inetd 2562 ? Ss 0:00 /usr/sbin/sshd 2576 ? Ss 0:00 /usr/sbin/cron 2599 tty1 Ss+ 0:00 /sbin/getty 38400 tty1 2601 tty2 Ss+ 0:00 /sbin/getty 38400 tty2 7954 ? Ss 0:01 sshd: root@pts/0 7960 pts/0 Ss 0:00 -bash 7998 ? S 3:47 [drbd0_worker] 8004 ? S 0:55 [drbd0_receiver] 8122 pts/0 S 0:00 ha_logd: read process 8123 pts/0 S 0:00 ha_logd: write process 8194 ? SLs 0:00 heartbeat: master control process 8197 ? SL 0:00 heartbeat: FIFO reader 8198 ? SL 0:00 heartbeat: write: ucast eth0 8199 ? SL 0:00 heartbeat: read: ucast eth0 8200 ? SL 0:00 heartbeat: write: ping 10.30.6.14 8201 ? SL 0:00 heartbeat: read: ping 10.30.6.14 8215 ? S 0:00 /usr/lib/heartbeat/ipfail 8361 ? Ss 0:00 /usr/sbin/ietd 8362 ? S< 0:00 [istd1] 8363 ? S< 0:00 [istiod1] 8364 ? S< 0:00 [istiod1] 8365 ? S< 0:00 [istiod1] 8366 ? S< 0:00 [istiod1] 8367 ? S< 0:00 [istiod1] 8368 ? S< 0:00 [istiod1] 8369 ? S< 0:00 [istiod1] 8370 ? S< 0:00 [istiod1] 8832 pts/0 R+ 0:00 ps ax
|
이제 윈도우에서 iscsi-initiator 를 이용하여 마운트를 해보자.
제어판에서 iscsi initiator 를 띄운다.
Discovery 를 클릭하여 다음 화면을 띄워 Add Portal을 클릭한다.
그리고 heartbeat 을 통해 구성한 VIP 를 입력한다.
포트 번호는 Default 값인 3260을 그대로 사용한다.
입력을 하고 나서 등록된 화면이다.
이제 Target 탭으로 이동을 한다.
등록된 이름이 보인다.
인증을 걸어 놓았으므로 Logon 을 클릭하여 들어 간다.
그러면 다음과 같은 화면에서 Advanced 를 클릭한다.
그리고 CHAP Logon information 에 ietd.conf 에서 설정한 아이디와 비밀번호를 입력한다.
그리고 밖으로 나오면 Automatically restore 부분을 클릭하여 서버 재시작시에도 자동으로 연결하도록 설정을 한다.
마지막으로 연결이 정상적으로 된것을 확인 할 수 있다.
디스크 관리자를 띄워서 살펴 보자.
새로운 디스크가 있다고 알려 주면서 initialize 를 하라고 한다.
디스크를 할당을 진행을 한다.
그리고 파티션을 포멧하고 볼륨명을 할당한다.
정상적으로 만들어졌다.
실험
정말로 이중화 되어서 잘 작동 되는지 살펴 보자.
간단하게 한대를 죽여 보면 된다.
일단 dongho7 에서는 vip 가 올라와 있지 않는것으로 보아 dongho8 에서 서비스가 운영중일 것이다.
dongho7:~# ip addr show 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop link/ether de:45:58:74:ea:f0 brd ff:ff:ff:ff:ff:ff 4: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:13:8f:fc:bd:43 brd ff:ff:ff:ff:ff:ff inet 10.30.6.13/24 brd 10.30.6.255 scope global eth0 5: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0e:2e:f7:03:e8 brd ff:ff:ff:ff:ff:ff inet 192.168.0.13/24 brd 192.168.0.255 scope global eth1
|
dongho8 에서 살펴 보니 역시 10.30.6.10 이 올라와 있다.
데몬도 잘 떠 있다.
서버를 완전히 죽여 보자.
dongho8:~# ip addr show 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop link/ether 32:ce:ed:86:01:53 brd ff:ff:ff:ff:ff:ff 4: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:19:66:16:58:11 brd ff:ff:ff:ff:ff:ff inet 10.30.6.14/24 brd 10.30.6.255 scope global eth0 inet 10.30.6.10/24 brd 10.30.6.255 scope global secondary eth0:0 5: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0e:2e:f7:03:d5 brd ff:ff:ff:ff:ff:ff inet 192.168.0.14/24 brd 192.168.0.255 scope global eth1
dongho8:~# ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 init [2] 2 ? S< 0:00 [kthreadd] 3 ? S< 0:00 [migration/0] 4 ? S< 0:00 [ksoftirqd/0] 5 ? S< 0:00 [watchdog/0] 6 ? S< 0:00 [events/0] 7 ? S< 0:00 [khelper] 127 ? S< 0:00 [kblockd/0] 128 ? S< 0:00 [kacpid] 129 ? S< 0:00 [kacpi_notify] 195 ? S< 0:00 [cqueue] 199 ? S< 0:00 [ata/0] 200 ? S< 0:00 [ata_aux] 201 ? S< 0:00 [ksuspend_usbd] 207 ? S< 0:00 [khubd] 210 ? S< 0:00 [kseriod] 212 ? S< 0:00 [kgameportd] 246 ? S 0:00 [pdflush] 247 ? S 0:00 [pdflush] 248 ? S< 0:00 [kswapd0] 249 ? S< 0:00 [aio/0] 250 ? S< 0:00 [nfsiod] 252 ? S< 0:00 [jfsIO] 253 ? S< 0:00 [jfsCommit] 254 ? S< 0:00 [jfsSync] 916 ? S< 0:00 [bond0] 979 ? S< 0:00 [iscsi_eh] 1006 ? S< 0:00 [scsi_eh_0] 1008 ? S< 0:00 [scsi_eh_1] 1101 ? S< 0:00 [kpsmoused] 1104 ? S< 0:00 [kstriped] 1106 ? S< 0:00 [kmpathd/0] 1107 ? S< 0:00 [ksnapd] 1113 ? S< 0:00 [rpciod/0] 1119 ? S< 0:00 [kjournald] 1237 ? S<s 0:00 udevd –daemon 2332 ? S< 0:00 [kjournald] 2333 ? S< 0:00 [kjournald] 2427 ? Ss 0:00 /sbin/portmap 2588 ? Ss 0:00 /sbin/syslogd 2594 ? Ss 0:00 /sbin/klogd -x 2635 ? S 0:00 [drbd0_worker] 2641 ? S 0:18 [drbd0_receiver] 2719 ? Ss 0:00 /usr/sbin/inetd 2739 ? Ss 0:00 /usr/sbin/sshd 2768 ? Ss 0:00 /usr/sbin/cron 2791 tty1 Ss+ 0:00 /sbin/getty 38400 tty1 2793 tty2 Ss+ 0:00 /sbin/getty 38400 tty2 3632 ? Ss 0:00 sshd: root@pts/0 3638 pts/0 Ss+ 0:00 -bash 4518 ? S 0:01 [drbd0_asender] 5105 pts/0 S 0:00 ha_logd: read process 5106 pts/0 S 0:00 ha_logd: write process 9079 ? SLs 0:00 heartbeat: master control process 9081 ? SL 0:00 heartbeat: FIFO reader 9082 ? SL 0:00 heartbeat: write: ucast eth0 9083 ? SL 0:00 heartbeat: read: ucast eth0 9084 ? SL 0:00 heartbeat: write: ping 10.30.6.13 9085 ? SL 0:00 heartbeat: read: ping 10.30.6.13 9098 ? S 0:00 /usr/lib/heartbeat/ipfail 10060 ? Ss 0:00 /usr/sbin/ietd 10061 ? S< 0:00 [istd1] 10062 ? S< 0:00 [istiod1] 10063 ? S< 0:00 [istiod1] 10064 ? S< 0:00 [istiod1] 10065 ? S< 0:00 [istiod1] 10066 ? S< 0:00 [istiod1] 10067 ? S< 0:00 [istiod1] 10068 ? S< 0:00 [istiod1] 10069 ? S< 0:00 [istiod1] 10812 ? Ss 0:00 sshd: root@pts/1 10818 pts/1 Ss 0:00 -bash 10824 pts/1 R+ 0:00 ps ax
dongho8:~# netstat -nl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:113 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN udp 0 0 0.0.0.0:694 0.0.0.0:* udp 0 0 0.0.0.0:111 0.0.0.0:* udp 0 0 0.0.0.0:45045 0.0.0.0:* raw 0 0 0.0.0.0:1 0.0.0.0:* 7 Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 13499 /var/run/heartbeat/register unix 2 [ ACC ] STREAM LISTENING 10073 /var/lib/log_daemon unix 2 [ ACC ] STREAM LISTENING 14270 @IET_ABSTRACT_NAMESPACE
dongho8:~# halt
Broadcast message from root@dongho8 (pts/1) (Tue Sep 2 17:05:22 2008):
The system is going down for system halt NOW!
|
dongho8 이 죽고 나서 바로 dongho7에서 확인 결과 아이피가 넘어와서 서비스가 잘 되는 것을 볼 수 있다.
dongho7:~# ip addr show 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop link/ether de:45:58:74:ea:f0 brd ff:ff:ff:ff:ff:ff 4: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:13:8f:fc:bd:43 brd ff:ff:ff:ff:ff:ff inet 10.30.6.13/24 brd 10.30.6.255 scope global eth0 inet 10.30.6.10/24 brd 10.30.6.255 scope global secondary eth0:0 5: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0e:2e:f7:03:e8 brd ff:ff:ff:ff:ff:ff inet 192.168.0.13/24 brd 192.168.0.255 scope global eth1
dongho7:~# ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 init [2] 2 ? S< 0:00 [kthreadd] 3 ? S< 0:00 [migration/0] 4 ? S< 0:00 [ksoftirqd/0] 5 ? S< 0:00 [watchdog/0] 6 ? S< 0:00 [events/0] 7 ? S< 0:00 [khelper] 127 ? S< 0:00 [kblockd/0] 128 ? S< 0:00 [kacpid] 129 ? S< 0:00 [kacpi_notify] 197 ? S< 0:00 [cqueue] 201 ? S< 0:00 [ata/0] 202 ? S< 0:00 [ata_aux] 203 ? S< 0:00 [ksuspend_usbd] 209 ? S< 0:00 [khubd] 212 ? S< 0:00 [kseriod] 214 ? S< 0:00 [kgameportd] 248 ? S 0:00 [pdflush] 249 ? S 0:00 [pdflush] 250 ? S< 0:00 [kswapd0] 251 ? S< 0:00 [aio/0] 252 ? S< 0:00 [nfsiod] 254 ? S< 0:00 [jfsIO] 255 ? S< 0:00 [jfsCommit] 256 ? S< 0:00 [jfsSync] 918 ? S< 0:00 [bond0] 980 ? S< 0:00 [iscsi_eh] 1007 ? S< 0:00 [scsi_eh_0] 1009 ? S< 0:00 [scsi_eh_1] 1099 ? S< 0:00 [kpsmoused] 1103 ? S< 0:00 [kstriped] 1105 ? S< 0:00 [kmpathd/0] 1106 ? S< 0:00 [ksnapd] 1112 ? S< 0:00 [rpciod/0] 1118 ? S< 0:00 [kjournald] 1236 ? S<s 0:00 udevd –daemon 2293 ? S< 0:00 [kjournald] 2294 ? S< 0:00 [kjournald] 2471 ? Ss 0:00 /sbin/portmap 2612 ? Ss 0:00 /sbin/syslogd 2618 ? Ss 0:00 /sbin/klogd -x 2641 ? S 0:38 [drbd0_worker] 2647 ? S 0:08 [drbd0_receiver] 2665 ? Ss 0:00 /usr/sbin/inetd 2677 ? Ss 0:00 /usr/sbin/sshd 2698 ? S 0:00 ha_logd: read process 2706 ? S 0:00 ha_logd: write process 2751 ? Ss 0:00 /usr/sbin/cron 2778 tty1 Ss+ 0:00 /sbin/getty 38400 tty1 2780 tty2 Ss+ 0:00 /sbin/getty 38400 tty2 3622 ? Ss 0:00 sshd: root@pts/0 3628 pts/0 Ss+ 0:00 -bash 7567 ? SLs 0:00 heartbeat: master control process 7569 ? SL 0:00 heartbeat: FIFO reader 7570 ? SL 0:00 heartbeat: write: ucast eth0 7571 ? SL 0:00 heartbeat: read: ucast eth0 7572 ? SL 0:00 heartbeat: write: ping 10.30.6.14 7573 ? SL 0:00 heartbeat: read: ping 10.30.6.14 7586 ? S 0:00 /usr/lib/heartbeat/ipfail 8410 ? Rs 0:00 sshd: root@pts/1 8416 pts/1 Rs 0:00 -bash 8549 ? Ss 0:00 /usr/sbin/ietd 8550 ? S< 0:00 [istd1] 8551 ? S< 0:00 [istiod1] 8552 ? S< 0:00 [istiod1] 8553 ? S< 0:00 [istiod1] 8554 ? S< 0:00 [istiod1] 8555 ? S< 0:00 [istiod1] 8556 ? S< 0:00 [istiod1] 8557 ? S< 0:00 [istiod1] 8558 ? S< 0:00 [istiod1] 9293 pts/1 R+ 0:00 ps ax
|
다음은 동영상으로 실제 failover 되는 화면을 캡쳐한 것이다.
한대의 서버를 shutdown 하더라도 정상적으로 잘 서비스가 되는 것을 볼 수 있다.
아래 동영상을 마우스로 더블 클릭하면 큰 화면으로 볼 수 있다.