Cassandra Operator의 종류는 여러 가지가 있습니다. 물론 여러 가지가 있지만 instaclustr는 종료 예정이며 cscetbon의 casskop과 k8ssandra의 cass-operator가 돋보입니다.
1. Casskop
장점
- Graceful rolling update 지원
- Graceful C* cluster scaling (with cleanup and decommission prior to Kubernetes scale down)
- Manage operations on pods through CassKop plugin (cleanup, rebuild, upgradesstable, removenode..)
- Performing live Cassandra repairs through the use of Cassandra reaper
- Live Backup/Restore of Cassandra's data
단점
- 기능을 세분화해 지원하지만, volume secret mount나 vault agent 적용이 불가한 문제가 있다.(crd에서 지원하고있지 않음. 현재 확장 계획도 불투명)
2. Cass-operator
k8s 버전이 1.19 이상의 경우에는 k8ssandra-operator로 설치하는 것을 권장하고 있습니다.(cass-operator가 같이 설치됨)
장점
- CassKop과 마찬가지로 1 operator, n cluster를 지원함.
- K8sandra는 Apache Cassandra, cass-operator, backup, anti-entropy repair, 모니터링, metrics 및 Kubernetes Ingress 솔루션과 같은 클라우드 네이티브 작업을 자동화하기 위한 다양한 도구를 패키징해 제공.
- Cass operator는 노드 간 및 클라이언트 대 노드 암호화를위한 keystore 및 truststore를 생성하여 암호화를 자동화. 사용자는 카산드라 클러스터를 수평으로 확장하기 위해 인증 데이터를 수동으로 업데이트할 필요가 없음.
단점?
- k8s 버전이 낮다면 cass-operator만 설치 가능한데, 현재 k8ssandra팀에서 관리하는 만큼 기능 추가나 업그레이드가 k8ssandra-operator에 맞춰 관리되다 보니 버전이 낮다면 사용할 수 없는 기능들이 존재한다. (사실 단점이라 하기엔 k8s 버전업을 하면 되긴 함.)
K8ssandra
k8ssandra팀은 datastax의 cass-operator를 발전시키고 있는데요, k8ssandra-operator를 만들어 k8ssandraCluster Custom Resource를 관리하고 카산드라 클러스터를 cass-operator를 통해 생성하고 매니지 합니다. k8ssandra는 stargate, Reaper, Medusa 등의 좋은 오픈소스들이 패키징 되어 있는 형태로 제공됩니다. 특히 Reaper로 data repair를 예약 처리하고 오케스트레이션 할 수 있으며 Anti-Entropy 처리가 가능합니다.
k8ssandra-operator가 설치되며 같이 설치하는 cass-operator는 cassandraDatacenter Custom Resource를 관리하는데요, 현재 저는 기존 k8s 버전이 낮은 관계로 cass-operator만 단독으로 설치해야 했습니다.
그래도 충분히 많은 장점을 누릴 수 있습니다.
Cass-operator로 설치한 Cassandra Cluster
Cass-operator는 CassandraDatacenter CR(CustomResource)를 생성하게 되면 cassandra statefulset을 생성하고 각종 Cassandra cluster를 구성하는데 필요한 작업을 수행하게 됩니다. 물론 여기에는 seed node를 설정하는 작업도 포함되어 있죠. seed node는 cassandra node가 3개 이하일 경우 모두 seed node가 되며 3개 이상부터는 rack개수만큼 설정되지만 rack 개수가 3 이하라면 3이 seed node가 됩니다. 이렇게 직접 statefulset으로 cassandra 클러스터를 구성했을 때보다 더욱 시드 노드 설정 및 오케스트레이션이 쉬워졌습니다.
좀 더 자세히 살펴보겠습니다.
Node Replacement
statefulset으로 설치한 cassandra | cass-operator로 제어하는 cassandra |
jvm option을 주는 등의 개발자의 직접 구현이 필요함. Persistent Volume을 사용하기에 jvm option이 적용된 뒤에 삭제 등의 로직 구현 필요. 컨트롤하기에 복잡함. | management-api-for-apache-cassandra를 통해 아파치 카산드라를 제어한다. cassandraDatacenter 커스텀 리소스에 replaceNodes에 파드이름을 추가하면 아래와 같은 로직이 수행된다. 카산드라 공식문서에서도 권장하는 방법이다. if (replaceIp != null){
if (!replaceIp.matches(IPV4_PATTERN))
return Response.serverError().entity(Entity.text("Invalid replace IP passed: " + replaceIp)).build();
extraArgs.append("-Dcassandra.replace_address_first_boot=").append(replaceIp);
|
Cassandra Node가 다운되었을 때 조치사항
1. Node drain 등의 이유로 pod를 삭제했을 경우
statefulset으로 설치한 cassandra | cass-operator로 제어하는 cassandra |
> kubectl delete pod cassandra-2 (without sasi-index): token range가 변동되지 않았다면 클러스터에 정상적으로 Join됨. 이는 Apache Cassandra에 구현되어있는 로직. > kubectl delete pod cassandra-2 (with sasi-index): DN 상태가 지속되는 노드가 존재할 경우 removenode를 진행하게되면 token range 변동이 발생될 수 있고, SSTable Attached Secondary Index(sasi index)가 구현되어있다면 구조로 인한 한계로 인덱스 크기가 매우 큰 파일이 생성되고 새롭게 노드가 조인하는데 수 시간이 걸릴 수 있다. |
> 하나의 pod를 삭제하더라도 클러스터에 정상적으로 join됨.
> 두번째 case는 left case result와 동일함. |
2. seed node가 모두 죽었는데, 다른 파드도 재시작된 경우
statefulset으로 설치한 cassandra | cass-operator로 제어하는 cassandra |
- 상황의 재현을 위해 seed node를 죽이고 statefulset을 restart하였다.
|
|
위와 같이 statefulset 단독으로 사용했을 때보다 편리하게 해결 가능한 문제들이 많은 것을 볼 수 있습니다. Server configuration이 CassandraDatacenter CRD에 녹아들어 있는 것도 템플릿을 작성하고 관리하는 입장에서 편리하기도 했습니다. k8ssandra팀은 k8ssandra-operator를 꾸준히 관리하고 있고 업데이트하고 있습니다. k8s version이 높아지면 사용해볼 수 있고 지원되는 기능이 많아서 k8ssandra-operator를 도입하고 싶어 지네요.. 참 아쉽습니다만 cass-operator로도 아직은 충분히 만족스럽습니다.
'DB' 카테고리의 다른 글
Cassandra Operator 심화 (0) | 2023.02.26 |
---|---|
Cassandra Consistency Level (0) | 2022.11.15 |
Cassandra 기본 (0) | 2022.09.14 |