주요 알고리즘
우선 ceph의 경우 metadata 서버나 storage 서버에서 직접 계산하는 방식이 아닌 client에서 policy기반으로 계산을 하여 object의 위치를 탐색한다. 해당하는 알고리즘이 CRUSH 알고리즘이다.
CRUSH (Controlled Replication Under Scalable Hashing)
- 클러스터내에 object의 지능적인 분산 작업을 수행한다.
- RADOS에서 사용하는 알고리즘으로 object의 위치를 계산을 통해 결정한다.
- 계산된 데이터 저장소에 의해 어떻게 데이터를 저장하고 가져올지 결정하는 알고리즘
- ceph client는 중앙에 서버나 브로커를 통하기보다 직접 OSD와 통신한다.
- CRUSH는 빠르게 계산이 되고 lookup 과정이 없다. 또한 input이 output에 영향을 미치고 결과가 변하지 않는다.
- ruleset
- pool에 할당되고 ceph client가 데이터를 저장하거나 가져갈때 CRUSH ruleset를 확인한다.
- object에 대한 PG가 포함된 primary OSD를 식별한다.
- 해당 ruleset은 ceph client가 OSD에 직접 연결하여 데이터의 쓰기/읽기를 하게 한다.
- workflow
1. PG 할당
- pg = Hash(object name) % num pg
2. CRUSH(pg, cluster map, rule) 함수 계산
- 해당 CRUSH를 거치면 OSD.(NUM)이 나옴
즉, 저장될 OSD number가 나와 해당 OSD에 저장됨
- https://javiermunhoz.com/blog/2016/04/30/scalable-placement-of-replicated-data-in-ceph.html

- Cluster map
- 계층적인 OSD map
- Failure Domain
- Pseudo-Random (유사난수)
(http://www.sebastien-han.fr/blog/2012/12/07/ceph-2-speed-storage-with-crush/)
- https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf
- https://www.slideshare.net/Yuryu/what-you-need-to-know-about-ceph
주요개념
cluster > pool > PG > object
1. cluster
- ceph 배포에 기본이다.
- default 는 ceph로 create 된다.
- 다수의 cluster를 생성할수도 있다.
(만약 cluster를 다수 생성하는 경우라면 cluster 에 적절한 port를 설정하여 conflict이 발생되지 않도록 한다.)
- http://docs.ceph.com/docs/master/rados/deployment/ceph-deploy-new/
2. pool
- Pool은 Ceph의 논리적 파티션을 의미한다.
- 데이터 타입에 따른 Pool을 생성할 수 있다. (예를 들어 block devices, object gateways 등)
- pool 마다 pg 갯수 / replica 갯수를 지정할 수 있다.
즉, pool마다 복제될 object 갯수를 지정할 수 있다.
- pool type : replication, Erasure Code 이렇게 두개의 방식이 사용된다.
3. placement group(PG)
- exabyte scale의 storage cluster에서는 몇백만개, 그이상의 object가 존재할지 모른다.
이러한 환경에서의 관리가 어렵기에 pg를 두어 pool의 조각을 만든다.
- 만약 cluster size보다 상대적으로 적은 PG를 가질 경우 PG마다 너무 많은 data를 가지게 되어 좋은 성능을 낼수 없다.
- pool에 대한 pg의 갯수는 다음의 공식을 사용해 계산한다.
(osds X 100) / replicas = (ceph osd stat X 100) / ceph osd pool get [pool_name] size
4. object
- 실제 OSD에 저장되는 data이다.
- ID + binary data + metadata (key/value)
실제 데이터를 저장하고 가져오는 일련의 과정
Client는 최초 Monitor와 Cluster Map을 요청하여 전달받고 Cluster Map에 요청하려 했던 DATA의 위치를 확인하고 해당 OSD와 직접 연결을 수행하여 데이터에 대한 Operation을 수행한다.
1. ceph client는 ceph monitor에 접속하여 최신의 cluster map을 가져온다.
(cluster map은 node의 up/down 상태정보를 가지고 있다.)
2. ceph client는 cluster map을 cache하고 업데이트가 가능한 경우 새로운 map을 가져온다.
3. ceph client에서는 data를 object/pool id가 포함된 object로 변환한다.
4. ceph client에서는 CRUSH algorithm을 사용해 PG와 Primary OSD를 결정한다.
5. ceph client는 primary OSD를 연결하여 data를 직접 저장하고 가져온다.
(client에서 OSD에 직접 data를 쓴다.)
6. Primary OSD는 Crush Lookup을 실행하여 secondary PGs와 OSD를 결정한다.
7. replicate pool에서는 primary OSD는 secondary OSD들에 data를 전송하고 object를 복사한다.
8. erasure coding pool에서는 primary OSD는 object를 chunk로 분할하고 chunk들을 encode 하여 secondary OSD들에 writing 한다.
-
https://youtu.be/799XZyHOuHA
개인적으로 정리한 내용을 아래와 같은 diagram으로 표현해보았다.

Object 의 정보
아래 command를 통해 object 대한 정보를 확인할 수 있다.

① OSD map version
② pool name
③ pool ID
④ object name
⑤ placement group ID (object 가 속한)
⑥ OSD 5,6 번에 속해 있고 현재 UP
⑦ OSD 5,6 번에 속해 있고 현재 동작중
- http://ceph.com/geen-categorie/how-data-is-stored-in-ceph-cluster/