본문 바로가기

빅데이터/cassandra

아파치 카산드라 설정 파일 및 상용 환경 셋팅

카산드라는 설치 방법에 따라 다른 디렉토리에 설정 파일이 있습니다.

 

- 도커 : /etc/cassandra 디렉토리

- tarball : conf 디렉토리

- package : /etc/cassandra 디렉토리

 

카산드라의 기본 설정파일은 cassandra.yaml입니다. 1개의 노드로 구성할 수 있는 클러스터에 적합하게 설정되어 있습니다. 하지만 2개 이상 노드로 운영할 경우에는 다양한 추가 셋팅을 해야만 합니다. 클러스터로 구성하기 위해서는 일부 설정값을 입력해야만 합니다.

 

- cassandra.yaml : 카산드라의 기본 셋팅 파일

- cassandra-env.sh : 카산드라에서 사용하는 환경 변수 셋팅

- cassandra-rackdc.properties or cassandra-topology.properties : 클러스터의 rack, datacenter 설정 

- logback.xml : 로깅 레벨 설정

- jvm-* : JVM 관련 설정

- commitlog_archiving.properties : commitlog를 위한 아카이빙 파라미터 설정

 

추가적으로 예제 설정파일을 conf에서 확인할 수 있습니다.

 

- metrics-reporter-config-sample.yaml : metric-report가 수집하는 설정 예제

- cqlshrc.sample : cql에 대한 예제

 

주요 런타임 설정들

카산드라를 실행하기 위해 cassandra.yaml 파일을 셋팅이 필요합니다. 최소한 다음 설정값은 지정하여 설정해야합니다.

 

- cluster_name : 클러스터의 이름

- seeds : 콤마로 나누어진 IP 어드레스. 이 IP어드레스는 seed node들로 이루어짐. 시드란, 클러스터에서 노드의 추가/삭제가 되었을 때 다른 모든 노드에 알려주는 역할을 하는 노드.

- storage_port : 7000포트로 방화벽이 막히지 않았는지 확인 필요함.

- listen_address : 클러스터의 서로 다른 노드들과 통신하기 위한 listen address IP. localhost가 기본으로 설정되어 있음. listen_interface를 설정하는 방식도 있다.

- native_transport_port : 9042포트로 방확벽이 막히지 않았는지 확인 필요함. cqlsh와 같은 클라이언트가 통신하기 위한 포트

 

디렉토리관련 설정들

아래 설정은 디렉토리 위치를 지정합니다.

 

- data_file_directories: SSTable이 저장될 디렉토리
- commitlog_directory: commitlog가 저장될 디렉토리
- saved_caches_directory: 세이브드 캐시가 저장될 디렉토리
- hints_directory: hint가 위치할 디렉토리

 

성능상 이유로 멀티 디스크를 사용할 경우, commitlog와 데이터 파일은 서로 다른 디스크에 놓는 편이 좋습니다.

 

환경 변수들

JVM레벨의 셋팅으로 힙사이즈 변경을 하려면 cassandra-env.sh를 설정할 수 있습니다. JVM 커맨드 라인에 JVM_OPTS 환경 변수를 수정할 수 있습니다. 이 JVM 변수에 따라 힙 메모리를 변경하여 운영할 수 있습니다.

 

로깅

기본적으로 로그백을 사용하며 INFO는 system.log에 저장되고 DEBUG는 debug.log에 저장됩니다.

 

상용 환경 설정

cassandra.yaml와 jvm.options 파일을 상용환경에 맞게 설정해야 합니다.

 

토큰

vnode들로 사용하기 위해 1개 이상의 토큰 범위 노드를 사용합니다. vnode들은 클러스터에서 새로운 노드들을 부트스트랩으로 묶기 위해 활용됩니다. 이를 통해 클러스터의 성능을 선형으로 증가시킬 수 있습니다. 그러나, 토큰이 많을 수록 더 많은 데이터가 공유되며 가용성이 하락합니다. 이 2가지를 생각하면서 밸런스를 맞추어야 합니다. 더 자세히 알고 싶다면 vnode와 카산드라 가용성에 대한 글을 읽는 것을 추천합니다.

cassandra-availability-virtual.pdf
0.85MB

 

토큰 개수를 변경하기 위해서 cassandra.yaml 파일을 셋팅해야 합니다.

 

- num_toknes:  16

 

토큰 개수에 따라 어떤 영향을 받는지 알에 설명합니다.

 

- 토큰 1개 : 최대 가용성을 가짐. 클러스터 사이즈 최대로 활용 가능. peer개수는 가장 작음. 유연한 확장이 어려움. 확장할 때는 반드시 2배로 늘려야 밸런스가 맞아짐.

- 토큰 4개 : 확장성과 가용성을 적당히 섞은것. 클러스터를 30개 이상 노드로 활용할 경우 사용. 20%이상의 노드를 확장할 때만 밸런스를 맞출 수 있음. 클러스터의 노드 개수 축소시 밸런스가 깨짐.

- 토큰 8개 : 8개 vnode를 사용하여 시스템 부하를 분산할 수 있음.

- 토큰 16개 : 최대로 확장성을 가짐. 클러스터를 지속적으로 확장할 수 있음. 그러나 대용량 클러스터에서 가용성이 떨어짐. 50개 이상 노드에서는 사용하는 것을 추천하지 않음.

 

추가적으로 토큰 개수를 지정할 때 cassandra.yaml의 allocate_tokens_for_local_replication_factor 설정에 적절한 복제 개수를 지정하는 것도 중요합니다.

 

Read ahead(미리 읽기, 페이지 캐시 기능)

리드 어헤드 기능은 운영체제 레벨에서 데이터를 최대한 빠르게 로딩하기 위해 페이지 캐시를 활용하여 로드하는 개념입니다. 디스크로 데이터를 찾을 때는 높은 지연이 발생합니다. 그렇기 때문에 페이지 캐시를 사용하여 성능을 올릴 수 있습니다. 리드 어헤드를 최대로 사용하기 위해 운영체제는 남은 메모리에 데이터를 보관함으로써 데이터를 찾는데 시간을 줄입니다. 이 방법은 접근하고자 하는 데이터셋보다 남은 메모리 용량이 많을 때 사용 가능합니다. dataset > RAM 일 경우에는 문제가 될 수 있습니다. 

 

리드 어헤드는 다음과 같은 케이스에서는 유용하지 않습니다.

 

- 작은 파티션, 예를 들어 테이블에 파티션 키가 단 1개만 있는 경우

- SSD를 디스크로 사용할 경우

 

리드 어헤드로 인해 디스크 사용량이 늘어날 수 있으며 5배 이상의 지연으로 성능 이슈가 발생할 수 있습니다. 읽기가 많이 발생하는 키/값 테이블과 1kb이하의 row에 접근시 이슈가 발생할 가능성이 있습니다.

 

상용환경에서 리드 어헤드 셋팅은 다음과 같이 설정합니다.

 

- HDD : 64KB

- SSD : 4KB

 

리드 어헤드는 리눅스 시스템의 blockdev 툴을 통해 수정 가능합니다. 예를 들어 disk의 /dev/sda1에 대해 4kb로 설정하려면 다음과 같이 수행합니다.

$ blockdev --setra 8 /dev/sda1

- 8 x 512bytes = 4KB 임.

 

시스템마다 다르기 때문에 셋팅은 달라질 수 있습니다.

 

Compression(컴프레션)

컴프레션은 데이터를 읽고 쓰기 위해 적당한 사이즈로 압축하는 것을 뜻합니다. chunk_lenght_in_kb을 통해 테이블의 컴프레션을 위한 버퍼 사이즈를 지정할 수 있습니다. 추가로 WITH COMPRESSION을 통해 압축 방법을 설정할 수 있습니다. 

 

컴프레션은 너무 작은 레코드를 읽을 때는 좋지 않습니다. 기본 리드 어헤드 옵션과 함께 성능을 측정해야 합니다. 이를 통해 적정 컴프레션 타입을 설정하는 것이 좋습니다.

 

LZ4Compressor가 기본값으로 설정되어 있으며 가장 추천하는 컴프레션 알고리즘입니다. 만약 추가로 알고 싶다면 다음 글을 보세요.

https://thelastpickle.com/blog/2018/08/08/compression_performance.html

 

Apache Cassandra Performance Tuning - Compression with Mixed Workloads

This is our third post in our series on performance tuning with Apache Cassandra. In our first post, we discussed how we can use Flame Graphs to visual...

thelastpickle.com

 

Compaction(컴팩션)

컴팩션 전략에 따라 성능이 달라집니다. 여러분이 운영하는 환경에 따라 다른 전략으로 설정하는 것이 좋습니다. 동일 클러스터이더라도 다른 컴팩션 전략이 사용될 수 있습니다.

 

키스페이스는 반드시 NetworkTopologyStrategy로 생성하기

상용환경에서 SimpleStrategy는 절대 사용하지 않습니다. 상용 환경 키스페이스는 반드시 NetworkTopologyStrategy(NTS)를 사용해야 합니다.

CREATE KEYSPACE mykeyspace WITH replication =     {
   'class': 'NetworkTopologyStrategy',
   'datacenter1': 3
};

...

암호와 rack, snitch 설정은 넘어갔습니다.

 

출처

- https://cassandra.apache.org/doc/latest/cassandra/getting_started/configuring.html

 

Configuring Cassandra | Apache Cassandra Documentation

JVM-level settings such as heap size can be set in cassandra-env.sh. You can add any additional JVM command line argument to the JVM_OPTS environment variable; when Cassandra starts, these arguments will be passed to the JVM.

cassandra.apache.org

- https://cassandra.apache.org/doc/latest/cassandra/getting_started/production.html

 

Production recommendations | Apache Cassandra Documentation

Read ahead is an operating system feature that attempts to keep as much data as possible loaded in the page cache. Spinning disks can have long seek times causing high latency, so additional throughout on reads using page cache can improve performance. By

cassandra.apache.org

 

반응형