리눅스기반 스토리지를 DRBD+ ISCSI를 사용하여 이중화하여 윈도우에서 사용하기

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 하더라도 정상적으로 잘 서비스가 되는 것을 볼 수 있다
.
아래 동영상을 마우스로 더블 클릭하면 큰 화면으로 볼 수 있다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.