[발 번역] MongoDB With RAID 10 on Ubuntu 11.04

다음 글은 MongoDB with Raid 10 on Ubuntu 11.04(http://blog.troygrosfield.com/2011/11/08/mongodb-with-raid-10-on-ubuntu-11-04/) 라는 글을 발번역한 것입니다. 오역에 주의하세요.

MongoDB With RAID 10 on Ubuntu 11.04

최근에 MongoDB 서버를 RAID 10에 설정했다. 왜 RAID 10을 적용했고, 어떻게 했는지에 대해서 공유하려고 한다. 모든 작업은 아마존 AWS 위에서 Ubuntu 11.04 를 기반으로 작업했다.

1. RAID 10이란 무엇인가?

2. 왜 RAID 10을 선택했는가?

3. Ubuntu 11.04에서 RAID 10 과 MongoDB 설정하기

4. RAID 모니터링

5. 장애 대응

1] RAID Array에서 디스크가 장애나면 어떻게 해야 하는가?

2] 장애난 디스크를 어떻게 교체하는가?

3] RAID가 깨지면 어떻게 해야하는가?(역자주: 디스크가 하나 깨지는 것과 RAID가 깨지는 것은 다른 현상이다.  이는 뒤부분을 보면 알 수 있다.)

4] 이전의 MongoDB 장비를 어떻게 새로운 RAID MongoDB로 변경하는가?

6. 리소스

1. What is RAID 10

RAID 는 Redundant Array of Inexpensive/independent Disks의 약어이다.

위키디피아에서는 다음과 같이 정의되어 있다.

RAID 1+0: (a.k.a. RAID 10) mirrored sets in a striped set (minimum four drives; even number of drives) provides fault tolerance and improved performance but increases complexity.

The key difference from RAID 0+1 is that RAID 1+0 creates a striped set from a series of mirrored drives. The array can sustain multiple drive losses so long as no mirror loses all its drives.

MongoDB에서의 RAID 10 사용은 Data Replication 뿐만 아니라, EBS 드라이버의 장애시에도 매우 잘 동작한다.

“MongoDB의 Replica Sets만으로 충분하지 않나요?” 라고 물어본다면, 아래의 왜 RAID10을 선택했는지를 보면 된다.

2. Why We Chose RAID 10

mongodb master 장비에서 EBS 드라이브가 장애가 나면,  개발 시스템에서 항상 Single Point of Failure 였다.  해당 장비를 Replica Set에서 제외하기 전까지 항상 시스템이 다운되었다. MongoDB Replica Set은 EBS 드라이브가 고장이 났을 때 가 아니라, 실제 하드웨어 장비(역자주: 여기서는 VM장비 다운)가 문제가 있을 때만 FailOver가 동작했다. EBS 드라이브가 장애가 나면(올해에만 3번 정도 발생했다.) Replicat Set에 있는 나머지 두 장비로 FailOver 되지 않았다.  we would get some nasty PROD error emails.

RAID 10으로 셋팅을 하게 되면, SPOF를 막아주고, RAID 장애시에 올바르게 Replica Set의 다른 장비로 FailOver 되게 해주었다.

RAID 10 은 mongodb 에서 추천하는 RAID 레벨이다.(http://www.mongodb.org/display/DOCS/Production+Notes#ProductionNotes-RAID)

3. Setup RAID 10 with MongoDB on Ubuntu 11.04

MongoDB를 위한 RAID 생성 방법은 아래와 같습니다.(역자주: 꼭 MongoDB만을 위한 건 아니겠죠?)

1] (AWS 에서만) AWS Console 에서 MongoDB 서버로 동작할 EC2 instance를 생성합니다.

2] (AWS에서만) 생성한 EC2 instance에서 사용할 4개의 동일한 크기의 EBS 볼륨을 같은 zone에서 생성합니다.

3] (AWS에서만) 4개의 생성된 EBS 볼륨을 생성한 EC2 장비에 추가합니다. 어디에 추가해야 되는지 물어볼 수 있는데, /dev/sdp4, /dev/sdp5, /dev/sdp6, /dev/sdp7 으로 추가하면 됩니다. 숫자는 크게 중요하지 않습니다. 그냥 다르게 만들면 됩니다.

* ubuntu 11.04 AMI 를 생성하면, /dev/sdp# 대신에 /dev/xsdp# 에 생성될 수도 있다. https://forums.aws.amazon.com/thread.jspa?messageID=205549 를 참고하자.

4] ssh로 EC2 장비에 접속한다.

5] 새로 추가된 드라이브를 확인한다.

$ ls /dev
// The ouput here should show you all of your drives on this
// box. Make note that you don't have md0 (this is where 
// we will create the RAID) and see where you're newly
// attached EBS' are located. You should see something like:
...
xvdp4
xvdp5
xvdp6
xvdp7

6] RAID 관리를 위해서 mdadm 을 이용할 것이다. mdadm은 소프트웨어 RAID를 관리하는 리눅스 유틸리티이다.

$ sudo apt-get install mdadm

7] mdadm이 설치되면, EBS drive 로 RAID를 생성한다.

$ sudo mdadm --create --verbose /dev/md0 --level=10 --chunk=256 --raid-devices=4 /dev/xvdp4 /dev/xvdp5 /dev/xvdp6 /dev/xvdp7

-create 는 RAID를 생성하는 명령

-verbose 는 결과를 출력한다.

/dev/md0 는 어디에 RAID Array를 생성할지 지정한다. md0이 사용중이면 md1을 선택한다.

-level 은 RAID 레벨을 결정한다.

-chunk 는 Chunk 크기를 의미한다.(http://tldp.org/HOWTO/Software-RAID-HOWTO-5.html#ss5.10)

-raid-devices 는 RAID에 포함될 디바이스를 수를 의미한다.

-/dev/xvdp4 /dev/xvdp5 /dev/xvdp6 /dev/xvdp7 는 RAID를 구성할 EBS 드라이브를 의미한다.

8] RAID에 파일 시스템을 생성한다.

$ sudo mke2fs -t ext4 -F /dev/md0

MognoDB에서는 ext4나 xfs를 권장한다.(http://www.mongodb.org/display/DOCS/Production+Notes#ProductionNotes-LinuxFileSystems)

9] MongoDB  EBS RAID로 마운트할 디렉토리를 생성한다.

$ sudo mkdir -p /ebs

10]  fstab 에 해당 설정을 추가한다.

$ sudo vi /etc/fstab
// Add the following line at the bottom of the file
/dev/md0        /ebs     auto    defaults,nobootwait,noatime     0       0

11] RAID를 ebs 폴더로 마운트한다.

$ sudo mount /dev/md0 /ebs

12] RAID가 성공적으로 생성되었고 동작하는지 상태를 확인한다.

$ sudo mdadm --detail /dev/md0
// Sample healthy RAID output:

...[omitted]...

 Active Devices : 4
Working Devices : 4
 Failed Devices : 0

...[omitted]...

 Rebuild Status : 6% complete

...[omitted]...   

Number   Major   Minor   RaidDevice State
   0     202      244        0      active sync   /dev/xvdp4
   1     202      245        1      active sync   /dev/xvdp5
   2     202      246        2      active sync   /dev/xvdp6
   3     202      247        3      active sync   /dev/xvdp7

빌드 상태에 대한 확인은 설정된 볼륨 사이즈에 따라 긴 시간이 소요될 수 있다. 120GB 짜리 EBS 4개를 구성하는데 2.5시간이 걸렸다.(역자주: 꽤 오래걸리네요.)

13] RAID setup이 완료되면,  EC2 장비에 MongoDB 서버를 설치하고 Replica Set 에 추가하자.

이것으로 RAID 설정이 끝났다. 이게 전부다.

* AWS를 사용했지만, RAID가 AWS에서만 구성되는 것은 아니다. 장비에 디스크를 추가하고, 위의 방법대로 RAID를 구성할 수 있다.

4. Monitor the RAID

mdadm 은 RAID가 정상적인지를 모니터링 할 수 있는 –monitor 라는 기능을 가지고 있다. 매 10분 마다 RAID가 장애가 났는지를 체크해서 장애가 났다면 메일을 보내주는 cron 작업을 생성하자.

1] RAID 상태를 체크하고 , 장애가 나면 메일을 보내주는 스크립트를 생성한다.

#!/bin/sh

STATUS="$(cat /proc/mdstat | grep '(F)')"

if [ "$STATUS" != "" ]
then
    DETAILED_STATUS="$(sudo mdadm --detail /dev/md0)"
    MESSAGE="Failed device on $STATUS\n\n$DETAILED_STATUS"
    sendEmail -f some_from_email@gmail.com \
              -t someadminemail@gmail.com \
              -u 'Failed device on RAID' \
              -m "$MESSAGE" \
fi

2] 매 10분마다 동작하도록 Crontab에 등록한다.

# Job to monitor the mongo RAID array to make sure no devices went bad.
# If a devices is indeed bad, an email will be sent to the admins.
# This task runs ever 10 minutes.
*/10 * * * * sudo sh /location/to/monitor/script/RaidMonitor

3] cron 을 시작한다.

$ crontab /location/to/crontab/file/jobs.crontab

5. Troubleshooting

1] What to do When a Device in An Array Goes Bad.

디스크가 하나 고장나서 교체할 필요가 있을 때, 어떻게 해야하는지 아래의 순서로 진행하면 된다. RAID array 상태를 체크하라. 여기에 두 가지 방법이 있다.

$ cat /proc/mdstat

해당 명령이 실행되는 동안에, RAID array의 상태를 표시하게 된다.

md0 : active raid10 xvdp7[3] xvdp6[2] xvdp5[1] xvdp4[0]

장애가 있다면, 다음과 같이 표시된다.

md0 : active raid10 xvdp7[3] xvdp6[2] xvdp5[1] xvdp4[0](F)

xvdp4 에 (F) 표시가 있는 것을 볼 수 있을 것이다. 이제 좀더 자세히 확인해보자.

$ sudo mdadm --detail /dev/md0

다음 샘플을 보면, 모든 장비가 정상적일 때는 다음과 같은 결과를 볼 수 있다.

...[omitted]...

 Active Devices : 4
Working Devices : 4
 Failed Devices : 0

...[omitted]...

Number   Major   Minor   RaidDevice State
   0     202      244        0      active sync   /dev/xvdp4
   1     202      245        1      active sync   /dev/xvdp5
   2     202      246        2      active sync   /dev/xvdp6
   3     202      247        3      active sync   /dev/xvdp7

만약 하나의 디스크가 장애가 났다면, 다음과 같은 결과를 볼 수 있다.

...[omitted]...

 Active Devices : 4
Working Devices : 3
 Failed Devices : 1

...[omitted]...

Number   Major   Minor   RaidDevice State
   0       0        0        0      removed
   1     202      245        1      active sync   /dev/xvdp5
   2     202      246        2      active sync   /dev/xvdp6
   3     202      247        3      active sync   /dev/xvdp7

   0     202      244        -      faulty spare   /dev/xvdp4

/dev/xvdp4 의 상태를 보면, 장애가 났고, RAID array에서 제거해야 될 필요가 있다는 것을 알 수 있다.

2] How to Replace the Faulty Device?

1) ssh로 MongoDB 마스터 장비로 접속한 다음 RAID array 에서 장애난 디스크를 제거한다.

$ sudo mdadm /dev/md0 -r /dev/xvdp4

2) AWS Console 에서 MongoDB 마스터 장비에 추가하기 위한 새로운 EBS 볼륨을 생성한다.  새로운 볼륨의 위치는 (/dev/xvdp8) 이라고 하자.

3) 볼륨이 추가되면,  장비에 추가한 후에, RAID Array 에 추가한다.

$ sudo mdadm /dev/md0 -a /dev/xvdp#

* ‘#’을 해당 볼륨의 번호로 변경하자. 추가된 볼륨의 번호는 AWS Console에서 확인할 수 있다.

4) 다음 명령을 실행시키자. RAID에 디스크가 추가되었고 sync가 시작되었는지 볼 수 있다.

$ sudo mdadm --detail /dev/md0

실행 결과는 다음과 같다.

...[omitted]...

 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

...[omitted]...

Rebuild Status : 6% complete

...[omitted]...

Number   Major   Minor   RaidDevice State
   0     202      244        0      spare rebuilding /dev/xvdp8
   1     202      245        1      active sync   /dev/xvdp5
   2     202      246        2      active sync   /dev/xvdp6
   3     202      247        3      active sync   /dev/xvdp7

5) Sync 가 완료되면 끝이다.

3] What to do if the RAID fails

매우 불행히도 RAID에 포함된 3개 이상의 EBS가 장애가 나면 발생하게 된다.

1) 다음 명령을 통해서 RAID의 상태를 체크한다.

$ sudo mdadm --details /dev/md0

2) state를 보여주는데 실패하면 다음을 계속 진행한다.

3) ssh로 해당 장비에 접속한다.

4) md 디바이스를 unmount 한다.

$ sudo umount /dev/md0

5) RAID Array를 정지 시킨다.

$ sudo mdadm -S /dev/md0

RAID를 정지시키면, Secondary Replica Set Member가 Primary가 된다.  그러므로, 시스템이 다운중이면, 해당 Array를 정지시키면, 서비스가 복구가 될 것이다.( 역자주: Secondary가 Primary가 되면서 서비스가 재개된다는 의미)

6) 정상적으로 동작하는 디바이스로 다시 RAID를 재생성한다.

$ sudo mdadm --create --verbose /dev/md0 --level=10 --chunk=256 --raid-devices=4 /dev/xvdp# /dev/xvdp# /dev/xvdp# /dev/xvdp#

7) RAID Array를 mount한다.

$ sudo mount /dev/md0 /ebs

8) 더 진행하기 전에 resync이 완료되기를 기다린다. 동작 상태를 체크하자.

$ sudo mdadm --detail /dev/md0

 

4] Replacing an old MongoDB Instance with a new MongoDB RAID Instance

새로운 MongoDB RAID 장비를 기존의 Replica Set에 추가하고 Master로 전환하는지에 대해서 보여준다.

1) 해당 포스터의 앞부분에 있는 방버법에 따라서 RAID MongoDB Instance를 생성하라

2)RAID Sync 가 끝나기를 기다려라. 이것은 꽤 시간이 걸린다.( 몇시간 정도 ) MongoDB Replica Set에 RAID장비를 추가할 수 있지만, RAID sync가 끝날때 까지 기다리는 것이 좋다. 다음 명령으로 sync의 상태를 체크할 수 있다.

$ sudo mdadm --detail /dev/md0

3) RAID sync가 끝나면, mongodb master shell로 가서, 새로운 mongo 장비를 replica Set에 추가한다.

$ rs.add("ec2-##-##-###-###.compute-1.amazonaws.com")

4) mongo RAID 장비가 다른 Replica Set 과 Sync 되기를 기다려라. 새로 추가한 장비의 shell로 가서, 데이터가 제대로 들어갔는지 테스트하라. 다른 Mongo Box 등과 유저수 등이 일치해야 합니다.

5) 모든 데이터가 sync 되었다고 확신하면, 다음과 같은 명령으로 해당 Mongo RAID 장비를 master로 설정합니다.

> config = rs.conf()
{
	"_id" : "foo",
	"version" : 1,
	"members" : [
		{
			"_id" : 0,
			"host" : "A",
		},
		{
			"_id" : 1,
			"host" : "B",
		},
		{
			"_id" : 2,
			"host" : "C",
		},
		{
			"_id" : 3,
			"host" : "D",   config.version++
> // the member number is the 0 based index in the list. Not the _id.  So
> // '3' is the 3rd index or 4th member in the array.
> // the default priority is 1
> config.members[3].priority = 2
> rs.reconfig(config)

http://www.mongodb.org/display/DOCS/Forcing+a+Member+to+be+Primary 를 보라.

해당 장비가 “Primary” 가 될 때 까지, 계속 체크하라.

6) mongo master shell을 이용해서 더 이상 사용하지 않는 mongo 장비를 제거하라. 더 이상 사용되지 않을 것이다. mongo master shell에 서 다음 명령어를 사용해서 제거한다.

> config = rs.config()
> config.version++
> // Find the members you want to keep.
> config.members = [config.members[1], config.members[2], config.members[3]]
> rs.reconfig(config)
> rs.status()

유지하기를 원하는 세 대의 mongodb 장비만을 볼 수 있다.

 

이제 새로운 RAID MongoDB 장비를 Replica Set에 추가하고 이전 장비를 제거했다.

 

6. Helpful Resources

http://tldp.org/HOWTO/Software-RAID-HOWTO.html

http://man-wiki.net/index.php/8:mdadm