Theory
인프라
Loki 공식 문서 번역
시작하기
카디널리티

카디널리티

데이터 속성의 카디널리티는 해당 속성이 가질 수 있는 고유한 값의 수입니다. 예를 들어, 데이터베이스의 불리언 열은 true 또는 false 값만 가질 수 있으므로 카디널리티는 2입니다.

높은 카디널리티는 데이터베이스에서 많은 가능한 값을 가질 수 있는 열 또는 행을 나타냅니다. 온라인 쇼핑 시스템의 경우 userId, shoppingCartId, orderId와 같은 필드는 수십만 개의 고유한 값을 가질 수 있는 높은 카디널리티 열인 경우가 많습니다.

높은 카디널리티 속성의 다른 예는 다음과 같습니다.

  • 타임스탬프
  • IP 주소
  • 쿠버네티스 파드 이름
  • 사용자 ID
  • 고객 ID
  • 추적 ID

Loki에서 카디널리티에 대해 이야기할 때 우리는 레이블과 값의 조합과 그들이 생성하는 로그 스트림의 수를 의미합니다. Loki에서는 레이블을 적게 사용할수록 좋습니다. 이것이 Loki가 기본적으로 15개의 인덱스 레이블 제한을 두는 이유입니다.

높은 카디널리티는 가능한 값의 범위가 넓은 레이블을 사용하거나, status_codeaction을 결합하는 것과 같이 작고 유한한 값 집합을 갖더라도 많은 레이블을 결합하여 발생할 수 있습니다. 일반적인 상태 코드 집합(200, 404, 500)과 작업(GET, POST, PUT, PATCH, DELETE)은 15개의 고유한 스트림을 생성합니다. 그러나 /cart, /products, /customers와 같은 endpoint 레이블을 하나만 추가하면 이 수가 45개의 고유한 스트림으로 세 배가 됩니다.

시리즈 레이블과 카디널리티의 예를 보려면 LogCLI 튜토리얼을 참조하십시오. 보시다시피, 특정 로그 스트림에 대한 레이블을 결합하기 시작하기 전에도 개별 레이블의 카디널리티는 상당히 높을 수 있으며, 이는 카디널리티를 더욱 증가시킵니다.

현재 레이블의 카디널리티를 보려면 logcli를 사용할 수 있습니다.

logcli series '{}' --since=1h --analyze-labels

Loki에서 높은 카디널리티의 영향

높은 카디널리티로 인해 Loki는 많은 스트림을 생성하며, 특히 레이블에 고유한 값이 많고 해당 값이 수명이 짧을 때(예: 몇 초 또는 몇 분 동안 활성 상태) 더욱 그렇습니다. 이로 인해 Loki는 거대한 인덱스를 구축하고 수천 개의 작은 청크를 객체 저장소로 플러시합니다.

Loki는 높은 카디널리티 레이블 값을 지원하도록 설계되거나 구축되지 않았습니다. 사실, 그것은 정반대를 위해 만들어졌습니다. 매우 오래 지속되는 스트림과 레이블의 매우 낮은 카디널리티를 위해 구축되었습니다. Loki에서는 레이블을 적게 사용할수록 좋습니다.

높은 카디널리티는 상당한 성능 저하를 유발할 수 있습니다.

높은 카디널리티 피하기

Loki에서 높은 카디널리티를 피하려면 다음을 수행해야 합니다.

  • 타임스탬프, 추적 ID, 주문 ID와 같이 제한 없는 값을 가진 레이블을 할당하지 마십시오.
  • 애플리케이션, 네임스페이스, 환경과 같이 로그 메시지의 출처나 컨텍스트를 설명하는 정적 레이블을 선호하십시오.
  • 카디널리티가 낮거나 오래 지속되는 값이 아닌 한 로그 메시지 자체의 값인 "동적" 레이블을 할당하지 마십시오.
  • 고객 ID 또는 트랜잭션 ID와 같이 자주 검색되는 높은 카디널리티 메타데이터 필드를 Loki의 인덱스에 영향을 주지 않고 저장하려면 구조화된 메타데이터를 사용하십시오.

참고: 구조화된 메타데이터는 Loki 및 Cloud Logs의 기능으로, 고객이 로그 라인 자체에 해당 정보를 포함할 필요 없이 로그 라인에 비해 카디널리티가 너무 높은 메타데이터를 저장할 수 있도록 합니다. 이는 로그 라인에 쉽게 포함할 수 없지만 레이블로 효과적으로 사용하기에는 카디널리티가 너무 높은 메타데이터에 적합합니다. Bloom 필터를 사용한 쿼리 가속화도 구조화된 메타데이터를 활용합니다.

원본: https://grafana.com/docs/loki/latest/get-started/labels/cardinality/ (opens in a new tab)