개발계는 하나의 EC2 인스턴스에 elasticsearch 프로세스를 3개를 실행하여 3개의 노드로 클러스터를 구성해서 사용했습니다. 정상적으로 사용중이던 클러스터의 상태가 yellow로 변경되면서 샤드의 재배치 및 할당이 정상적으로 수행되지 않는 상태였습니다.
클러스터의 상태는 프라이머리 샤드와 리플리카 샤드를 기반으로 한 클러스터의 상태를 의미합니다.
green
: 모든 샤드가 정상적으로 할당된 상태.yellow
: 모든 프라이머리 샤드가 정상적으로 할당되었지만 하나 이상의 리플리카 샤드가 할당되지 않은 상태. 현재 상태에서 클러스터의 노드에 장애가 발생하면 리플리카 샤드가 정상적으로 할당된 상태가 아니기 때문에 노드가 복구될때까지 일부 데이터를 사용할 수 없습니다.red
: 하나 이상의 프라이머리 샤드가 정상적으로 할당되지 않은 상태. 일부 또는 전체 데이터를 사용할 수 없습니다. 클러스터가 구동되는 과정에서 프라이머리가 샤드가 할당됨에 따라 잠시 발생할 수 있습니다.elasticsearch는 노드에 새로운 샤드를 할당하거나 배치할지 여부를 결정하기 전에 해당 노드에서 사용 가능한 디스크 공간을 고려합니다.
개발계 클러스터의 인덱스와 문서의 수가 지속적으로 늘어나게 되면서 디스크 사용량이 80%를 초과하게 되었고, low disk wartermark 85% 초과 경고와 함께 클러스터의 상태가 yellow로 변경되면서 장애가 발생하게 됩니다.
클러스터의 디스크 기반 샤드 할당 설정은 elasticsearch.yml 설정 파일에서 정적으로 변경하거나 _settings API를 통해 동적으로 변경할 수 있습니다.
cluster.routing.allocation.disk.threshold_enabled
: 디스크 공간 고려 여부를 설정합니다. 기본 값은 truecluster.routing.allocation.disk.watermark.low
: 디스크 사용량의 하위 임계치를 설정합니다. 설정한 값보다 디스크 용량을 더 많이 사용하고 있는 경우 해당 노드에 샤드를 할당하지 않습니다. 이 설정은 이전에 할당된 적이 없는 새로 생성된 인덱스의 프라이머리 샤드에는 영향을 미치지 않습니다. 기본 값은 85%cluster.routing.allocation.disk.watermark.high
: 디스크 사용량의 상위 임계치를 설정합니다. 설정한 값보다 디스크 용량을 더 많이 사용하고 있는 경우 해당 노드에 샤드를 재배치하지 않습니다. 이 설정은 이전에 할당되었는지 여부에 관계없이 모든 샤드가 영향을 미칩니다. 기본 값은 90%cluster.routing.allocation.disk.watermark.flood_stage
: 디스크 사용량의 플러드 단계 임계치를 설정합니다. 설정한 값보다 디스크 용량을 더 많이 사용하고 있는 경우 노드의 모든 인덱스에- index.blocks.read_only_allow_delete(삭제가 가능한 읽기 전용)
를 적용합니다. 이 설정은 노드의 디스크 공간 부족을 방지하기 위한 최후의 수단입니다. 디스크 사용률이 상위 임계치 아래로 떨어지면 수동으로 해제해야 합니다. 기본 값은 95%cluster.info.update.interval
: 클러스터의 각 노드에 대한 디스크 사용량을 확인하는 주기를 설정합니다. 기본 값은 30초cluster.routing.allocation.disk.include_relocations
: 디스크 사용량을 계산할 때, 현재 노드로 재배치되고 있는 샤드의 고려 여부를 설정합니다. 기본 값은 true임계치에 대한 값은 내부적으로 일관성이 있는지 검증하기 위해 백분율과 바이트를 혼용할 수 없고 모두 통일해서 적용해야 합니다. 백분율 값은 사용된 디스크의 공간을 나타내고 바이트 값은 사용 가능한 디스크 공간을 나타냅니다. 두 방법은 서로 상반되는 의미이므로 사용에 주의할 필요가 있습니다.
노드의 기본으로 설정된 하위 임계치를 현재 디스크 사용량 보다 높은 수치로 수정하여 클러스터를 정상화할 수 있습니다. 하지만 근본적인 디스크 용량 부족 문제는 해결되지 않기 때문에 디스크 용량 증설 전까지의 임시 해결 방안 정도로 사용하기에 적합합니다.