이번 편에서는 지금까지 구축해놓은 2-3대의 Ceph 클러스터를 어떻게 활용할 수 있는지에 대해서 알아보도록 한다.  구축을 하기는 했는데, 과연 어떻게 자료를 저장을 할 수 있는지, 다른 서버에 어떻게 붙이고, 접속은 어떻게 하는지에 대해서 몇가지 소개를 하도록 한다.  역시 마찬가지지만 글쓴이가 해본 것들에 대해서만 소개를 해드리며, Hadoop과 오픈스택 노바 볼륨으로 붙이는 건 환경상 제외한다.  오픈스택에 통합시키는건 꼭 보여드리고 싶었는데, 매뉴얼을 작성하기 위해 devstack을 구축하고 예제를 위한 인스턴스를 생성하고…  상상만 해도 이건 온라인 매뉴얼이 아니라 책이 되어가는 느낌이다.  참고로 말씀드리면, 오픈스택에 노바 볼륨으로 통합시키는건 아주 쉽다.  인터넷에 비록 영어이긴 하지만 잘 정리해놓은 블로그들이 많다.  꼭 필요하신 분들은 그것을 참고하시고 성공적으로 잘 되면 글쓴이처럼 한 편의 매뉴얼 작성을 부탁드린다.  본 매뉴얼에 붙여나가다보면 정말 한 권의 책이 되지않을까 싶다.

앞으로 소개를 해드릴 내용은,

1.  Mount 명령어를 이용한 Ceph FS 연결
2.  RADOS Gateway를 이용한 Amazon S3 및 OpenStack Swift API 사용법

정도가 되겠다.  1번은 간단하지만 2번은 아주 간단하지만은 않다.  개인적으로 아직 풀리지 않는 의문도 좀 있다.

 

1.  Mount 명령어를 이용한 Ceph 파일시스템 연결

Mount 명령어를 이용한 Ceph 파일시스템을 연결하는 방법이 가장 단순하고 간편하다.  Ceph의 common 패키지가 필요하므로, 앞서 2번째 편에서 설명했던 패키지 소스를 추가하여 ceph 패키지를 설치한다.  mount 명령어 사용법은 다음과 같다.

mount -t ceph Ceph_모니터노드_주소:6789:/ 마운트할_경로 -vv -o name=admin,secret=키링_패스워드

Ceph 모니터 노드의 주소란, /etc/ceph/ceph.conf에 [mon.a] 섹션에 지정된 노드의 주소를 의미한다.  본 매뉴얼에서는 Ceph 노드에서 모니터와 메타데이터 서버를 모두 담당하기로 했으니, ceph 노드의 IP 주소를 적으면 되겠다.  만약 모니터 노드가 2개 이상이시면 쉼표를 붙여서 추가시키면 된다.

얘) 10.211.55.24:6789,10.211.55.25:6789,10.211.55.26:6789:/

마운트할 경로는 알아서 정하시면 되겠다.  여기서는  /mnt로 한다.

키링 패스워드란, /etc/ceph/ceph.keyring에 적힌 패스워드를 의미한다.  따라서, 글쓴이의 명령어를 적으면 다음과 같이 된다.

$ mount -t ceph 10.211.55.24:6789:/ /mnt -vv -o name=admin,secret=AQCDHopRoE74CRAAtOcubIrEM9/6r+4n09cT1g==


성공적으로 연결됐을시 다음과 같은 메시지가 나오게 된다.
parsing options: rw,name=admin,secret=AQCDHopRoE74CRAAtOcubIrEM9\/6r+4n09cT1g==

mount 명령어와 df 명령어로 확인해보자.

$ mount
10.211.55.24:6789:/ on /mnt type ceph (name=admin,key=client.admin)

$ df -m
10.211.55.24:6789:/    185453 16488    168965   9% /mnt

30 기가바이트짜리 하드디스크가 2개 달린 OSD노드가 총 3개이므로 30x6 = 180기가바이트.  맞게 표시된다.  테스트 머신을 하나 더 구성할 수 있거나 주변에 사용 가능한 리눅스 컴퓨터가 있다면 ceph-common 패키지를 설치하고 마운트를 또 해보자.  복수의 컴퓨터에서 마운트가 가능하다.  오브젝트 스토리지이므로 분명 파일의 입출력 속도는 빠를 것이다.  글쓴이도 아직 제대로된 테스트를 해보지 못해서 확실히는 모르겠다.

 

다음 편에서...

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

이번 편에서는 OSD를 추가로 설치해야할 상황에서 수동으로 추가하는 방법을 알려드린다.  기존의 OSD에 하드디스크 하나를 더 추가하는 것과 절차는 동일하다.  단지, 같은 host명을 사용하느냐 아니냐일 뿐만 다르다.  지금껏 잘 따라오신 분은 이미 눈치 채셨겠지만, 저장된 자료가 지워지는 부분에 대해서 상관만 없다면 osd 디렉토리를 전부 삭제하고 설치단계에서 진행했었던 mkcephfs 명령어를 통해 한 번에 수십 수백대의 OSD를 다시 설정할 수도 있다.

우분투를 설치하고 Ceph 패키지를 설치하는 하는 것까지는 똑같다.  물론, ceph.conf 파일을 넣어주고 /etc/hosts에 osd-2를 등록해주는 것, 새로운 osd의 root 패스워드를 설정하고, ceph로부터 root의 ssh-copy-id 명령어를 이용한 키 복사 역시 동일하게 설정하면 되겠다.  사실상, 이전편에서 mkcephfs 명령어 이전까지는 동일한 진행을 하면 된다.

새로 붙일 OSD의 이름은 osd-2로 정하고, 1편에서 정한대로 10기가의 OS 설치용 하드디스크 하나, 그리고 osd용 30기가짜리 하드디스크 2개를 생성해서 우분투 12.04 64비트를 설치하고 apt-get dist-upgrade와 Ceph 패키지 설치를 완료했다.  파티션을 생성해서 ext4로 포맷을 하고 /var/lib/ceph/osd/ceph-4와 /var/lib/ceph/osd/ceph-5라는 디렉토리를 생성해서 user_xattr 옵션과 함께 마운트를 시킨 상태이다.  꼭 기억해야할 사항이, /etc/hosts에 osd-2를 추가시킨뒤 root 사용자로 변경해서 ssh-copy-id osd-2를 잊지말자.

이제 추가를 해보자.  Ceph 노드로 옮겨서 편의상 root로 사용자를 변경하고 아래의 명령어를 실행해보자.

# ceph osd create

그러면 아주 간단하게 딱 4 라는 글자만 찍힐 것이다.  방금 새로 설치한 OSD-2 노드는 하드디스크가 2개이므로, 위의 명령어를 한 번 더 실행한다.  역시 예상대로 5라는 숫자가 찍힐 거다.  이제 /etc/ceph/ceph.conf 파일을 열어서 새로운 osd를 추가해주자.

[osd.4]
host = osd-2

[osd.5]
host = osd-2

만약, 새로운 OSD 노드를 설치하지 않고 기존의 OSD 노드, 예를 들어 OSD-1 노드에 하드디스크 2개를 더 추가한 것이라면 host 주소만 바꿔주면 된다.  설정 자체는 아주 간단하고 쉽다고 볼 수 있겠다.  편집이 끝났으면, /etc/ceph/ceph.conf 파일을 예상대로 osd-0, osd-1, 그리고 새로 만든 osd-2 노드의 /etc/ceph/ 디렉토리에 전송하자.  osd-2의 경우는 /etc/ceph/ 디렉토리에 아무것도 없을테니, /etc/ceph/ceph.keyring 파일도 같이 전송해야한다.

전송이 끝났으면, osd-2 노드에 root로 접속해서 아래의 명령어를 실행한다.

ceph-osd -i 4 --mkfs --mkkey
ceph-osd -i 5 --mkfs --mkkey 

실행하면 글자와 숫자들이 주르륵 올라가면서 error라는 글자나, failed, No such file or directory 등의 메시지가 눈에 띄일텐데 신경쓰지 않아도 된다.  2편에서 mkcephfs를 실행했을 때처럼 새로운 하드디스크에 아무 것도 없기 때문에 나오는 메시지라고 보면 되겠다.

마지막으로 아래의 명령어를 실행한다.

ceph auth add osd.4 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-4/keyring
ceph auth add osd.5 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-5/keyring 

화면에 added key for osd.4, added key for osd.5 라는 메시지가 뜰 것이다.  접속을 끊고 Ceph노드로 돌아가자.  이제 OSD 노드에서 할 일은 없다.

osd-4와 5가 제대로 붙었는지 확인을 해보자.

# ceph osd tree 
# id    weight  type name       up/down reweight

-1      4       root default
-3      4               rack unknownrack
-2      2                       host osd-0
0       1                               osd.0   up      1
1       1                               osd.1   up      1
-4      2                       host osd-1
2       1                               osd.2   up      1
3       1                               osd.3   up      1
4       0       osd.4   down    0
5       0       osd.5   down    0

새로 등록한 4와 5가 보이고, 현재는 비활성화 되어있는 것을 알 수 있다.  이 2개의 osd를 같은 pool에다 올리자.

# ceph osd crush set 4 osd.4 1.0 pool=default rack=unknownrack host=osd-2 
updated item id 4 name 'osd.4' weight 1 at location {host=osd-2,pool=default,rack=unknownrack} to crush map

# ceph osd crush set 5 osd.5 1.0 pool=default rack=unknownrack host=osd-2
updated item id 5 name 'osd.5' weight 1 at location {host=osd-2,pool=default,rack=unknownrack} to crush map

이제 다시 트리를 확인해보자. 

# ceph osd tree
# id    weight  type name       up/down reweight

-1      4       root default
-3      4               rack unknownrack
-2      2                       host osd-0
0       1                               osd.0   up      1
1       1                               osd.1   up      1
-4      2                       host osd-1
2       1                               osd.2   up      1
3       1                               osd.3   up      1
-5      0                       host osd-2
4       0                               osd.4   down    0
5       0                               osd.5   down    0

ceph osd crush set 4 osd.4 pool=default rack=unknownrack host=osd-2
ceph osd crush set 5 osd.5 pool=default rack=unknownrack host=osd-2

다 좋은데 osd가 다운되어있는 것이 보인다.  이것을 활성화시키려면 osd를 그냥 재시작해주기만 하면 된다.  간단하다.

# service ceph -a start osd.4
=== osd.4 ===
Starting Ceph osd.4 on osd-2...
starting osd.4 at :/0 osd_data /var/lib/ceph/osd/ceph-4 /var/lib/ceph/osd/ceph-4/journal

# service ceph -a start osd.5
=== osd.5 ===
Starting Ceph osd.5 on osd-2...
starting osd.5 at :/0 osd_data /var/lib/ceph/osd/ceph-5 /var/lib/ceph/osd/ceph-5/journal

끝이다.  이제 다시 트리를 확인해보자.

 

# ceph osd tree 
# id    weight  type name       up/down reweight

 

-1      4       root default
-3      4               rack unknownrack
-2      2                       host osd-0
0       1                               osd.0   up      1
1       1                               osd.1   up      1
-4      2                       host osd-1
2       1                               osd.2   up      1
3       1                               osd.3   up      1
-5      2                       host osd-1
4       1                               osd.4   up      1
5       1                               osd.5   up      1

스토리지의 상태를 확인해보자.

~# ceph -s
   health HEALTH_OK
   monmap e1: 1 mons at {a=10.211.55.24:6789/0}, election epoch 1, quorum 0 a
   osdmap e23: 6 osds: 6 up, 6 in
    pgmap v150: 960 pgs: 960 active+clean; 8699 bytes data, 7064 MB used, 165 GB / 181 GB avail
   mdsmap e11: 1/1/1 up {0=a=up:replay} 

HEALTH_OK라고 나오고, 6 osds: 6 up이라고 나오면 osd 6개 모두 올라와있고 상태는 OK라는 뜻이니, 모두 이상이 없다.  이로서 OSD 추가설치는 끝났다.  다음 편에서는 이렇게 구축해놓은 스토리지 클러스터를 어떻게 사용할 수 있는지에 대해서 알아본다.

다음 편에서...

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,

이제는 실제 Ceph와 OSD의 구성파일들이 저장되는 위치와 관련 파일들을 세팅해주는 단계이다.  역시, 간단하고 쉽고 크게 어려운 것은 없다.  이번 편부터는 터미널을 3개 띄우던지 tmux나 screen등 편하신대로 취향에 맞춰, ceph, osd-0 그리고 osd-1의 터미널을 모두 열어서 작업하는 것을 추천한다.

일단 본 매뉴얼에서는 이전 편에서 언급했듯, ceph는 MDS와 모니터만, osd-0과 osd-1에서는 osd를 사용한다고 했다.  따라서, 먼저 ceph에 모니터와 메타데이터 디렉토리를 생성해준다.

sudo mkdir -p /var/lib/ceph/mon/ceph-a
sudo mkdir -p /var/lib/ceph/mds/ceph-a 

앞서 몇번 얘기했지만 네이밍 센스가 참 어처구니 없다.  설정파일에서는 mon.a라고 해놓구서 디렉토리는 ceph-a로 작성하는건 또 뭔지.  이번에는 osd-0으로 이동해서 osd용 디렉토리를 생성해줘야하는데,  osd-0과 1에 있는 2개의 osd용 하드디스크는 아직 포맷을 하지 않은 상태이다.  1편에서 일단 포맷을 하지말고 넘어가라고 설명했던 이유는 여기서 어떠한 파일시스템으로 포맷을 할건지 결정하기 위한 설명을 드리기 위함이다.

먼저 Ceph의 공식문서에 의하면, Ceph는 B-Tree FS (btrfs)나 XFS를 사용할 것을 추천한다.  그런데, btrfs는 아직 정식으로 사용하기에는 아직 불안한 감이 많기때문에 본 매뉴얼에서는 btrfs은 선택하지 않는다고 가정한다.  따라서, xfs로 포맷을 해볼 수도 있겠다.  물론 우리의 친구 ext4로 포맷해도 상관없다.  글쓴이는 둘 다 해봤다.  여기서, 둘 중 뭘로 포맷을 하느냐에 따라 해줘야할 작업이 한 가지씩 나뉜다.  일단은 먼저 osd 디렉토리부터 만들자.  아래의 디렉토리가 곧 마운팅 포인트가 된다.

osd-0에서
sudo mkdir -p /var/lib/ceph/osd/ceph-0
sudo mkdir -p /var/lib/ceph/osd/ceph-1

osd-1에서
sudo mkdir -p /var/lib/ceph/osd/ceph-2
sudo mkdir -p /var/lib/ceph/osd/ceph-3

 

현재 파티션 테이블이 존재하지 않을테니 파티션을 생성해주고 포맷을 한다.  osd-0과 osd-1의 2개 하드디스크 모두 실시한다.
예)  sudo fdisk /dev/sdb -> n -> p -> 엔터 -> 엔터 -> 엔터 ->wq
sudo mkfs.ext4 /dev/sdb1 

 

1. XFS로 포맷할 경우

/etc/ceph/ceph.conf 파일을 열어서 filestore xattr use omap = true 라인을 삭제한다.  그렇다.  해당 라인은 ext4를 위한 옵션이다.  그리고 위에 생성해준 마운팅 포인트로 마운트를 한다.  다음번 부팅시 Ceph클러스터가 제대로 작동되려면 /etc/fstab에도 당연히 추가를 시켜줘야하겠다.

osd-0에서
sudo mount /dev/sdb1 /var/lib/ceph/osd/ceph-0
sudo mount /dev/sdc1 /var/lib/ceph/osd/ceph-1 

osd-1에서
sudo mount /dev/sdb1 /var/lib/ceph/osd/ceph-2
sudo mount /dev/sdc1 /var/lib/ceph/osd/ceph-3

 

2. EXT4로 포맷할 경우
마운트 옵션에 반드시 user_xattr이 들어가야한다.  /etc/fstab를 열어서 마운팅에 user_xattr을 넣어준다.  현재 시점에서는 마운트만 하면 되므로 옵션을 줘서 마운트를 한다.

osd-0에서
sudo mount -o user_xattr /dev/sdb1 /var/lib/ceph/osd/ceph-0
sudo mount -o user_xattr /dev/sdc1 /var/lib/ceph/osd/ceph-1 

osd-1에서
sudo mount -o user_xattr /dev/sdb1 /var/lib/ceph/osd/ceph-2
sudo mount -o user_xattr /dev/sdc1 /var/lib/ceph/osd/ceph-3

fstab 예: 
UUID=e2af1baa-4ca2-434b-8bce-807a9e2e61f3 /var/lib/ceph/osd/ceph-0  ext4  user_xattr  1 2
UUID=5b055bb2-2875-4dcb-bda9-c963e966c7b9 /var/lib/ceph/osd/ceph-1  ext4  user_xattr  1 2 

다만 여기서 문제가, Ceph의 공식문서에는 Dump와 Pass값에 대한 언급이 없다는 점이다.  글쓴이는 1 2로 했다.  아무래도 1 2가 맞는 것 같다.

mount 명령어를 쳤을 때 user_xattr이 나와야 제대로 된 거다.

/dev/sdb1 on /var/lib/ceph/osd/ceph-0 type ext4 (rw,user_xattr)

 

다 됐으면 마지막 준비작업으로 /etc/ceph/ceph.conf 파일을 OSD 노드들에게도 똑같이 보내줘야한다.  모든 Ceph 클러스터 노드들은 반드시 같은 내용의 ceph.conf 파일을 갖고있어야한다.

sudo scp /etc/ceph/ceph.conf osd-0:/etc/ceph/
sudo scp /etc/ceph/ceph.conf osd-1:/etc/ceph/

 

이제서야 드디어 클러스터를 구성하라는 명령어를 내리는 단계에 왔다.  명령어는 달랑 한 줄이다.  ceph 노드에서 실시한다.  앞으로는 특별한 일이 없으면 osd-0과 osd-1은 건드리지 않는다.
sudo mkcephfs -a -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.keyring

명령어를 실행하고나면 뭔가 글씨가 주르륵 올라가는데 메시지가 길기 때문에 스크롤상 생략한다.  일단 여기서 나오는  No such file or directory 메시지는 무시해도 된다.  파일이 없는건 당연하기 때문이다.  하지만 빨간 글씨로 뭔가가 나왔다거나 failed라는 메시지가 보인다면 제대로 되지않았다는 얘기다.  마운트 포인트를 확인하고 각각의 하드디스크가 각자의 마운팅 포인트에 마운트가 제대로 됐는지 확인을 하고, 모두 이상이 없으면 /var/lib/ceph/osd/ceph-?/, /var/lib/ceph/mon/ceph-a/, /var/lib/ceph/mds/ceph-a/ 디렉토리에 밑에 있는 파일과 디렉토리들은 모두 수동으로 삭제를 해줘야 위의 명령어를 다시 실행할 수 있다.  또한, OSD 노드들의 /var/lib/ceph/osd/ 디렉토리에 가서 ls 명령어를 쳐보면 알 수 없는 파일들이 조금 있는데, osd 디스크 하나당 대략 1기가바이트 정도의 용량을 차지하는 것을 볼 수 있다.

위의 명령어를 실행하고나면, OSD 2대에 각각 2대의 하드디스크 즉, 총 4개의 OSD 스토리지를 세팅하게되는데, 시간은 불과 몇초 안걸린다.  명령어를 실행하고나면 /etc/ceph 디렉토리에 ceph.keyring이라는 파일이 보일 것이며, 이것의 권한을 644로 변경해준다.

이제 Ceph의 서비스 데몬을 실행해주자.
sudo service ceph -a start

대략 아래와 같은 화면이 나온다.

=== mon.a ===
Starting Ceph mon.a on ceph...
starting mon.a rank 0 at 10.211.55.24:6789/0 mon_data /var/lib/ceph/mon/ceph-a fsid 1d703392-a1b4-4588-880e-a699207f8c8d
=== mds.a ===
Starting Ceph mds.a on ceph...
starting mds.a at :/0
=== osd.0 ===
Starting Ceph osd.0 on osd-0...
starting osd.0 at :/0 osd_data /var/lib/ceph/osd/ceph-0 /var/lib/ceph/osd/ceph-0/journal
=== osd.1 ===
Starting Ceph osd.1 on osd-0...
starting osd.1 at :/0 osd_data /var/lib/ceph/osd/ceph-1 /var/lib/ceph/osd/ceph-1/journal
=== osd.2 ===
Starting Ceph osd.2 on osd-1...
starting osd.2 at :/0 osd_data /var/lib/ceph/osd/ceph-2 /var/lib/ceph/osd/ceph-2/journal
=== osd.3 ===
Starting Ceph osd.3 on osd-1...
starting osd.3 at :/0 osd_data /var/lib/ceph/osd/ceph-3 /var/lib/ceph/osd/ceph-3/journal

상태를 체크해보자. sudo ceph health 라는 명령어를 치면 HEALTH_OK 라고 떠야한다.  만약 Warning이 뜨면 몇분정도 기다렸다가 다시 명령어를 내려보거나, 그래도 안되면 서비스 데몬을 재시작 해본다.

이제 마지막으로, 생성된 keyring을 OSD 노드에 보내주면 설치는 모두 끝이다.  위에서 keyring의 권한을 644로 변경해줬는지 꼭 확인하자.

sudo scp /etc/ceph/ceph.keyring osd-0:/etc/ceph/
sudo scp /etc/ceph/ceph.keyring osd-1:/etc/ceph/ 

 

다음 편은 OSD를 추가해야할 경우에 대해서 설명드리도록 한다.

다음 편에서...

블로그 이미지

jswlinux

Seowon Jung의 잡동사니 보관소

,