관련 포스팅 목록

Ceph, RADOS - pool list, create, delete - http://ngee.tistory.com/758

Librados Python - Pool List, Create, Delete -  http://ngee.tistory.com/759

Librados Python - Object Input, Output  - http://ngee.tistory.com/760



이번에는 특정 Pool에 Object를 Input, Output 하는 것에 대해서 테스트해봅니다.


일단 참고문헌은 다음과 같습니다. 

Librados (Python) - http://ceph.com/docs/master/rados/api/python/


1. ioctx

    Librados (Python)에서는 Input / Output Context 라는 것을 생성하고, 이를 통해서 Object를 Input 하거나 Output 합니다.

    Input / Output Context라는 것을 줄여서 ioctx 라고 부르고요.


    몇 가지 함수만 확인 한 다음에 바로 테스트해보면 쉬울 것 같네요.


    ioctx 생성하기는 open_ioctx('pool name') 라는 함수를 통해서 가능하군요. 

    예로 new_ioctx = cluster.open_ioctx('testpool') 과 같이 사용합니다.

    즉 testpool에 object를 input 또는 output 할 수 있는 녀석을 하나 생성하는 것이네요.


2. Object input using ioctx 

    ioctx를 활용해서 어떤 object를 입력하기 위해서 사용되는 함수는 write(..), write_full(...), aio_write(...) 등이 있습니다. 

     

    테스트에서 write와 write_full 함수를 사용해보겠습니다. 


3. Object List

    Object를 input 한 다음에 잘 들어있는지 특정 pool의 object 리스트를 출력하기 위해서는 

    ioctx.list_objects() 라는 함수를 사용합니다. 

    ioctx.list_objects() 의 리턴 값인 Iterator를 while 문으로 돌려서 리스트를 출력합니다.


4. Object output using ioctx

    마지막으로 Pool에 저장되어 있는 Object를 꺼내와서 저장하기 위해서 read(...) 함수를 사용합니다. 



테스트


    1~4 내용을 테스트하기 위해서 다음과 같은 소스를 사용해보았습니다.

   

   

   실행결과는 아래와 같구요.    


위 4줄은 print rados_object.stat() / print rados_object.__dict__  때문에 출력된 것이고

test string 이라는 문자열은 write_full을 통해서 입력한 objectTestKey1이라는 key를 가지는 오브젝트가 가지고 있는 것을 출력한 것입니다.


소스 맨 아래 4줄은 별로 좋지 못한 방법이긴 합니다. 더 나은 방법을 찾을 때까지는 이렇게 써야겠네요. 

ioctx.read(...) 함수는 기본적으로 8192 만큼의 크기만 읽어옵니다. 

그래서 단순하게 ioctx.read("keyname")으로 수행하는 경우 8192 크기만 저장됩니다.

while 문을 통해서 검사하고 읽어오고 쓰고 해야하네요. 

좀 더 편리한 api를 제공해주면 고마울 것 같아요 ㅎㅎㅎ 



다시 확인해보니깐 write 쪽에도 문제가 있네요. 파일 용량이 큰 것은 들어가지 않네요. 

다른 함수를 사용해서 처리해보고 업데이트 하겠습니다 ㅠㅠ


+2015_0705_덧)

파일 용량이 큰 것은 byte로 끊어서 입력하면 정상적으로 수행됩니다. 

더 나은 방법이 있을 것 같아요. aio_write_full, aio_append를 굳이 나눠야 하나 싶기도 하구요.

아무튼 예로 다음과 같습니다.  약 400M 정도의 이미지 파일을 저장하도록 합니다.


+ Recent posts