배경
나에게는 두분의 주인님이 계신다. 각 연구실에서 내가 하는 일이 살짝 다르다.
- Y 교수님: Ceph 관련 일을 해야한다
- N 교수님: 분산 추적 관련 일을 해야한다
이번 랩미팅 때, 재미있는걸 해볼 수 있을 것 같다. 바로, "Ceph의 내부 상황을 Jager로 모니터링하기"다. 이러면 Ceph에 대해 조금 더 알 수 있고, Jager에 대해서도 알 수 있게 된다. 아주 좋다.
"Ceph Jager" 키워드를 검색하니, Ceph가 기본으로 Jager를 지원한다고 나와있다.
- https://docs.ceph.com/en/quincy/dev/developer_guide/jaegertracing/
- https://docs.ceph.com/en/quincy/jaegertracing/
무려 자료가 3개나 나왔다!! 이정도면 삽질하기 충분할 것이다. eBPF는 그런거 없으니 커널 코드를 보며 행복한 시간을 보내는 것에 반해, 이건 천국이다. 3개의 관련 자료가 나온걸 보고 좋아하는 내 자신이 슬퍼진다...
빌드
내가 세상에서 가장 좋아하는 일 중 하나이다. "오픈소스 C++ 코드 빌드하기". 작년에는 LevelDB, RocksDB를 빌드했고, 즐거운 시간을 보냈다. 다른 언어는 모르겠으나, C++의 경우 패키징이 환상적으로 이루어지기에, cmake 명령어 한번에 컴파일이 된다면, 그건 잘못된거다.
아무튼, Ceph를 컴파일 해야한다. 그저 행복할 뿐이다.
git clone https://github.com/ceph/ceph.git
이후, ceph 디렉토리 내부의 ./install-deps.sh를 통해 dependency를 설치해주자.
./install-deps.sh
그리고 기다린다. 이후, 다음의 명령어로 Jager가 포함된 버전을 컴파일 준비를 한다.
./do_cmake.sh -DWITH_JAEGER=ON
이러면 cmake 관련 파일들이 build/ 에 생긴다, 여기 들어가서
cd build
ninja vstart
를 통해 본격 컴파일을 시작해준다. TMI이지만, Ceph의 경우 소스코드가 대략 113만줄 정도 되는 것 같다. Cloc 기준 C++, C++ 헤더가 그정도였다. 따라서 컴파일이 엄청 오래 걸린다. 컴파일이 오래 걸리는 것의 장점은, 컴파일 시간 딴짓을 할 수 있다 것이다. 연구실에서 편하게 사용하는 노예 컴퓨터도 나쁜 스펙은 아니다, 5900X + 64GB램이니까.
하지만, 서버실에는 무려 4210R * 2 + 256GB짜리 서버가 있다... 40코어에 램도 충분하니, 컴파일 작업에는 최적이라고 볼 수 있다. 따라서 내가 딴짓을 할 시간이 줄어든다...
40코어 모두가 정말 열심히 일을 하고 있다. 이렇게 열심히 일을 하는 컴퓨터를 보면, 기분이 괜히 좋다.
램도 대략 91기가 정도 땡겨쓰고 있다. 덕분에 컴파일 시간이 매우 짧다! 이정도면, 대학원 탈출일지 한편을 보고 오면 될 것 같다. 이후, 빌드가 끝났다. 이제, build/bin 디렉토리 아래에 이런 저런 실행 파일이 생성되었을 것이다.
Ceph 실행
Ceph는 원래 OSD와 Monitor를 하는 노드들이 필요하다. 하지만 이러려면 어려 컴퓨터를 사용해야하니까 귀찮다. 따라서 Ceph에서 간단하게 테스트 및 Ceph를 공부하는 용도로 사용할 수 있는 vstart cluster라는 것을 지원한다.
https://docs.ceph.com/en/quincy/dev/dev_cluster_deployement/
사용법은 간단하다. build 디렉토리에서
cp ../src/vstart.sh
를 통해 vstart.sh를 현 디렉토리에 올리면 된다. 이거로 실행하면 안된다!
...
1301 # wait for volume module to load
1302 while ! ceph_adm fs volume ls ; do sleep 1 ; done
1303 local fs=0
1304 for name in a b c d e f g h i j k l m n o p
...
vstart.sh에 보면, ceph_adm fs volume ls를 사용한다. 하지만 방금 우리가 빌드한 버전의 경우, fs ls를 사용해야 동작한다. 그렇기에 해당 파일을 살짝 수정해서, fs ls를 사용하도록 만들어주자.
...
1301 # wait for volume module to load
1302 while ! ceph_adm fs ls ; do sleep 1 ; done
1303 local fs=0
1304 for name in a b c d e f g h i j k l m n o p
...
이러면 정상적으로 동작이 될 것이다. 현 디렉토리에 보면 ceph.conf가 존재할 것이다. 설정을 안해주면, vstart cluster를 /usr/lib 밑에다가 놓아준다. 이러면 상당히 귀찮기 때문에, ceph.conf를 살짝 수정해주자.
[global]
...
mon_data = /home/isu/ceph-vstart/test-a/lib
mon_data를 설정해주면, 우리가 원하는 디렉토리에 vstart cluster를 구성해준다. 이후, vstart를 통해 간단한 클러스터를 만들어주자:
OSD=3 MON=3 RGW=1 ./vstart.sh --debug --new -x --localhost --bluestore --without-dashboard
이 명령어를 사용하면 다음의 Ceph 클러스터가 구성된다.
- OSD가 3개
- Monitor가 3개
- Rados GateWay가 1개
다른 옵션들은 아까 걸어놓은 링크를 확인하면 된다.
반드시 --without-dashboard를 사용해야한다. 위의 서술한 방법으로 빌드를 하면, ceph-mon에서 대시보드가 실행이 안되게 빌드가 된다. 이 대시보드가 활성화 되기를 기다리기 때문에, 무한루프에 빠져버린다. 따라서, 해당 옵션을 통해 대시보드를 사용하지 않음을 명시해야한다.
조금 더 기다리다보면, vstart cluster가 정상적으로 생성이 된다.
그림처럼, vstart cluster가 정상적으로 실행되었다.
검증
이제 간단한 명령어로, 생성된 vstart cluster의 상태를 확인하자. 명령어 실행 디렉토리는 여전히 build 디렉토리이다.
./src/ceph -s
를 사용하면, Ceph 클러스터의 상태를 확인할 수 있다
보면, monitor 3개, osd 3개, pool 이 생성됨을 확인할 수 있다. 이제, 이 클러스터가 실제로 동작하는지, RADOS를 통해서 벤치마크를 하자. 벤치마크를 위해서는 pool을 만들어줘야한다. 나는 Ceph 전문가가 아니라서, placement group 정보를 잘 모른다. 그냥 인터넷에 굴러다니는 pool 생성을 진행했다.
./bin/ceph osd pool create benchmark_pool 64 64 replicated
이러면 benchmark_pool이라는 pool이 생성되었다. 이제 여기에다가 RADOS를 통해서 write 벤치마크를 진행해보자.
./bin/rados -p benchmark_pool bench 20 write --no-cleanup --run-name test_run_1
이러면, 20초간 write를 실행하며, 벤치마크 이후 저장 공간을 청소하지 않는다. 아무튼 진행하면 된다.
결과는 뭐 상이하겠지만, 이렇게 나온다. 이를 통해 Ceph에서 vstart cluster를 구성했음을 확인했다.
Jaeger 설정
이제 Jaeger를 통해 Ceph를 분산추적 해볼 것이다. 이를 위해서는 두가지를 준비해줘야한다. Jaeger를 위해서는 vstart cluster를 다시 시작해야한다.
./vstart.sh --debug --new -x --localhost --bluestore --without-dashboard --jaeger
아까의 명령어와 차이점은 --jaeger이다. 이는 다른 옵션이랑은 다 똑같은데, jaeger/all-in-one을 자체적으로 실행해준다. Docker 또는 podman을 지원한다. 그림과 같이 실행된 컨테이너의 id가 나올 것이다.
클러스터 구성이 끝나면,
./bin/ceph config set global jaeger_tracing_enable true
를 통해, Jaeger를 사용함을 다시 한번 확인시킨다.
Jaeger 확인
이제 정말 Jaeger가 실행되는지를 확인하자. 웹 브라우저에서 http://<서버IP>:16686 을 방문해주자
Jaeger 페이지가 잘 나온다!
아직은 jaeger-query 제외한 어떤 서비스도 나오지 않을 것이다. 왜냐면, OSD 관련해서 아무 이벤트도 발생하지 않았기 때문이다. 이제 아까전 처럼, RADOS를 통해서 Ceph를 사용해보자.
./bin/ceph osd pool create benchmark_pool 64 64 replicated
./bin/rados -p benchmark_pool bench 20 write --no-cleanup --run-name test_run_1
vstart cluster가 재생성 되었으니, pool을 다시 만들어줘야한다. 참고하기 바란다.
이제, 새로고침을 하고 Service를 확인하면, OSD가 나타나있을 것이다.
이런식으로 추적이 나온다. 그중 하나에 들어가면 trace의 hierarchical bar chart가 나온다.
상당히 부실하다. span이 2짜리인 추적밖에 나오지 않는다.
- op-request-created
- enqueue-op
이렇게만 나오는 것으로 확인이 된다. 정확히 어떤 추적이 발생하는지 나오지 않는다. 상당히 아쉽지만, 이게 지원하는 전부인 것 같다.
결론
아무튼 이를 통해서 Ceph를 Jaeger로 트레이싱 했다. 생각보다 재미가 없는 결과가 나와서 아쉽지만, vstart cluster라는 것을 확인할 수 있었다.
'Knowledge > Ceph' 카테고리의 다른 글
[Ceph] OSD 클러스터 구축 #1 (0) | 2023.07.02 |
---|