Tag Archives: Cassandra

[NoSQL] Cassandra에서 데이터가 노드에 저장되는 방식에 대해 (Consistent Hashing)

사용자 삽입 이미지

Consistent Hashing이란 다수의 노드로 이루어진 클러스터안에 데이터를 저장할때 데이터의 키를 기반으로 하여 어떤 노드에 저장할 것인가 계산하는 로직을 말합니다. Gossip Protocol과 더블어 아마존의 Dynamo의 영향을 받은 부분입니다.

사용자 삽입 이미지
간단하게 표현하여 보자면 위와 같습니다. alice라는 키에 값을 넣을때에는 3대의 노드가 있다면 단순히 이름을 해싱하여 3으로 나누면 됩니다. 위의 그림에서는 두번째 노드에 저장하는것으로 결정 되었네요.

사용자 삽입 이미지
시스템이 확장됨에 따라 노드가 하나 더 추가되었습니다. 단순하게 위의 그림만을 놓고 보자면 alice는 더이상 2에 저장되지 않습니다. 3에 저장되는 군요. 반대로 이미 2에 저장된 데이터는 3으로 옮겨와야 합니다. 데이터의 개편이 필요합니다.

사용자 삽입 이미지
실제로 데이터는 단순하게 나머지연산(%)을 하지는 않습니다. 각각의 노드가  응답가능한 데이터의 범위를 가지고 있고 거기에 맞는 범위안에 데이터가 저장됩니다. 위의 경우에는 키 alice를 해싱한 결과가 23이라면 0과 42사이에 저장하면 되는것이겠죠.

사용자 삽입 이미지
새로운 노드가 추가(또는 삭제)되었습니다. 대부분의 데이터는 여전히 그 자리에 있습니다.

사용자 삽입 이미지
4대의 노드간의 밸런스를 조정한 상태(rebalanced)입니다. 이경우 약간의 데이터가 자기 자리를 찾기위해 옮겨다녀야 합니다. 위의 alice는 23으로 변화가 없지만 35인 데이터가 있다면 노드 위치를 옮겨야 합니다.

[NoSQL] Cassandra를 사용하기 위한 하드디스크 성능 향상 팁

사용자 삽입 이미지

카산드라를 구동할 머신의 파일시스템의 경우에는 마운트(mount) 옵션을 어떻게 설정하느냐에 따라 성능을 향상시킬 수 있습니다. EXT, JFS, XFS등에서 이러한 옵션들을 제공하고 있습니다. 가장 많이 사용하는 파일시스템은 EXT시리즈 일것입니다. 대부분의 요즘 배포되는 리눅스 배포본이라면 EXT4를 지원합니다. EXT4 파일시스템을 사용할 경우 효과를 볼 수 있는 몇가지 마운트 옵션을 소개 합니다.

파일 시스템 설정 변경하기

1. 디바이스를 포맷합니다. 다음의 예는 /dev/sda1을 EXT4로 생성한다고 가정합니다.
[code]$ mke2fs -t ext4 /dev/sda1[/code]

2. EXT4 파일시스템이 가장 최고의 성능을 내기 위해서는 다음과 같이 설정합니다. 이경우 어떤 문제가 발생시에 데이터 무결성을 지키는것에 약간의 리스크가 존재할 수 있습니다. /etc/fstab 파일을수정하여 이 설정을 활성화 할 수 있습니다.
[code]noatime,barriers=0,data=writeback,nobh[/code]

3. 위의 설정이 부담스럽다면 차선책으로 다음의 설정을 사용하여 강한 성능을 내도록 할 수 있습니다. 위와 비교하면 무결성을 좀 더 신경쓸 수 있는 방법입니다.
[code]noatime,barriers=1,data=journal,commit=30[/code]

4. 다음의 명령으로 마운트 중인 파티션도 unmount를 사용하지 않고 설정을 적용할 수 있습니다. 하지만 몇몇의 설정은 완전히 unmount한 후에 다시 mount해야 합니다.
[code]$ mount -o remount /var[/code]