Elasticsearch is_write & blocks

JunMyung Lee·2023년 6월 20일
0

Elasticsearch

목록 보기
19/37

운영을 하면서 실시간으로 색인이 되는 로그 클러스터에서 테스트를 진행하고 있었다. 그런데 테스트케이스의 도큐먼트를 상단에 노출해서 보려고 현재시간을 미래의 시간으로 지정하여 테스트를 진행했다.

물론 테스트는 정상, 하지만 이제 테스트가 완료되고 실제 데이터를 봐야하는데 미래시간이니까 볼수가 없었다. (2024년, 2025년식으로...)
그리하여 이제 테스트를 진행하였던 로그데이터를 삭제해야하는데 역시나 문제가 발생한다.

이슈

뭔 예외가 발생하면서 삭제가 이루어지지 않는다!!

cluster_block_exception

{
  "type" : "cluster_block_exception",
  "reason" : "index [log-test-000001] blocked by: [FORBIDDEN/8/index write (api)];"
}

이 예외가 일어나는 이유는 무엇일까?

로그 클러스터의 경우, 지정한 정책(Policy)에 의해서 인덱스가 롤링되어진다.

  "{{policy_name}}" : {
    "policy" : {
      ...
    }
  }

그러면 롤링이 될때 당연히 이전의 인덱스보다는 새로운 인덱스에 데이터가 저장되도록 해야할 것이다. 여기서 설정되는 is_writeblocks옵션에 의해 컨트롤 되는데 요부분이 문제다.

is_write

먼저 GPT가 답변한 내용을 보자

Elasticsearch의 is_write 옵션은 색인 작업에 대한 설정입니다. 이 옵션은 다음 두 가지 값 중 하나를 가질 수 있습니다:

[true]
이 옵션을 true로 설정하면 색인 작업을 수행할 수 있습니다. 이는 새로운 문서를 색인하거나 기존 문서를 업데이트하는 작업을 포함합니다.

[false]
이 옵션을 false로 설정하면 색인 작업이 제한됩니다. Elasticsearch 클러스터에서 색인 작업을 수행할 수 없으며, 오직 검색(read) 작업만 허용됩니다.  
이 옵션을 사용하면 클러스터의 안정성을 높이고 색인 작업에 대한 부하를 줄일 수 있습니다.  
예를 들어, 유지 보수 작업 중에 색인 작업을 중지하거나, 클러스터에 부하가 많은 경우 색인 작업을 일시적으로 제한하는 데 사용할 수 있습니다.

is_write 옵션은 클러스터의 상태에 따라 동적으로 변경할 수 있습니다. 
즉, 클러스터에서 색인 작업을 중지하거나 다시 시작할 수 있습니다. 이를 통해 Elasticsearch 클러스터의 관리와 성능 조절에 유연성을 제공합니다.

false로 지정하면 색인 작업이 제한된다고 한다. 그러면 보기에는 "아! 이 옵션때문에 예외가 발생했구나!" 할 수 있을 것이다. 하지만 해당 옵션은 실제로 해보면 alias로 엮여있는 인덱스들 중에서 true옵션으로 되어있는 인덱스에 색인을 시켜주지, 예외를 일으키지는 않는다.
즉, alias가 아닌, 직접적으로 인덱스명을 명시하면 색인이 가능하다.

PUT log-test-000001
{
  "aliases": {
    "log-test": {
      "is_write_index": false
    }
  }
}

POST log-test-000001/_doc
{
  "@timestamp": "2099-11-15T13:12:00",
  "connHms": "20230101000000",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "Hello liam!"
  }
}

GET log-test/_search

// Result
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "log-test-000001",
        "_type" : "_doc",
        "_id" : "OhAT1ogBYdH6_HR-Z_8L",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2099-11-15T13:12:00",
          "connHms" : "20230101000000",
          "message" : "GET /search HTTP/1.1 200 1070000",
          "user" : {
            "id" : "Hello liam!"
          }
        }
      }
    ]
  }
}

다음과 같이 색인이 가능한것을 확인할 수 있다. 그렇다면 정상적인 케이스는?

PUT log-test-000001
{
  "aliases": {
    "log-test": {
      "is_write_index": false
    }
  }
}
PUT log-test-000002
{
  "aliases": {
    "log-test": {
      "is_write_index": true
    }
  }
}

POST log-test/_doc
{
  "@timestamp": "2099-11-15T13:12:00",
  "connHms": "20230101000000",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "Hello liam!"
  }
}

GET log-test/_search

// Result
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "log-test-000002",
        "_type" : "_doc",
        "_id" : "OxAU1ogBYdH6_HR-3v_6",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2099-11-15T13:12:00",
          "connHms" : "20230101000000",
          "message" : "GET /search HTTP/1.1 200 1070000",
          "user" : {
            "id" : "Hello liam!"
          }
        }
      }
    ]
  }
}

alias값으로 색인시, is_write가 true인 인덱스에 자동색인이 된다.

blocks

마찬가지로 먼저 GPT의 답변을 보자

Elasticsearch의 blocks 설정은 인덱스 수준에서 색인 및 검색 작업에 대한 제한을 설정하는 데 사용됩니다. blocks 설정은 다음과 같은 두 가지 주요 옵션으로 구성됩니다:

[read_only]
이 옵션은 인덱스를 읽기 전용으로 설정합니다.  
true로 설정하면 인덱스에 대한 색인 및 업데이트 작업이 제한되고, 오직 읽기 작업만 허용됩니다. 이를 통해 인덱스를 보호하거나 읽기 전용으로 사용하는 경우에 유용합니다.

[write]
이 옵션은 인덱스의 쓰기 작업을 제한합니다. true로 설정하면 색인 작업이 가능하고, false로 설정하면 색인 작업이 제한됩니다. 이를 통해 인덱스의 색인 작업을 제어하고, 클러스터 부하 조절 및 유지 보수 작업을 수행할 수 있습니다.

여기서 실제 색인 작업이 제한이 된다.
즉, Exception을 일으키는 주체가 된다.

read_onlywrite옵션을 false로 변경하여서 색인하자.

인덱스 생성

PUT log-test-000001
{
  "aliases": {
    "log-test": {
      "is_write_index": false
    }
  },
  "settings": {
    "index": {
      "blocks": {
        "read_only_allow_delete": "false",
        "write": "true"
      }
    }
  }
}

PUT log-test-000002
{
  "aliases": {
    "log-test": {
      "is_write_index": true
    }
  },
  "settings": {
    "index": {
      "blocks": {
        "read_only_allow_delete": "false"
      }
    }
  }
}

문서 색인 - 정상

POST log-test/_doc
{
  "@timestamp": "2099-11-15T13:12:00",
  "connHms": "20230101000000",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "Liam"
  }
}

문서 색인 - 예외

POST log-test-000001/_doc
{
  "@timestamp": "2099-11-15T13:12:00",
  "connHms": "20230101000000",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "Liam Liam"
  }
}

// Exception
{
  "error" : {
    "root_cause" : [
      {
        "type" : "cluster_block_exception",
        "reason" : "index [log-test-000001] blocked by: [FORBIDDEN/8/index write (api)];"
      }
    ],
    "type" : "cluster_block_exception",
    "reason" : "index [log-test-000001] blocked by: [FORBIDDEN/8/index write (api)];"
  },
  "status" : 403
}

번외 - blocks read_only와 write의 차이

여담으로 둘다 색인이 제한되는데 그럼 둘의 차이는 뭘까 하고 GPT에 문의했다.

read_only와 write 옵션은 모두 색인 작업에 제한을 가하는 옵션입니다. 그러나 두 옵션의 동작 방식과 제한 범위에 차이가 있습니다.

[read_only]
이 옵션은 인덱스를 읽기 전용으로 설정합니다. 
read_only 옵션을 true로 설정하면 해당 인덱스에 대한 모든 색인 작업과 업데이트 작업이 제한됩니다. 
따라서 새로운 문서를 색인하거나 기존 문서를 업데이트할 수 없습니다. 그러나 읽기 작업은 여전히 허용됩니다. 
즉, 인덱스의 데이터를 검색하고 조회하는 것은 가능합니다. 
이 옵션은 인덱스를 보호하거나 읽기 전용으로 사용하는 경우에 유용합니다.

[write]
이 옵션은 인덱스의 쓰기 작업을 제한합니다. 
write 옵션을 true로 설정하면 색인 작업이 가능하고, false로 설정하면 색인 작업이 제한됩니다. 
따라서 새로운 문서를 색인하거나 기존 문서를 업데이트할 수 있는지 여부를 결정합니다. 
이 옵션은 클러스터의 부하를 관리하거나 유지 보수 작업을 수행할 때 유용합니다. 
예를 들어, 클러스터에 과부하가 걸려 있는 경우 write 옵션을 false로 설정하여 색인 작업을 일시적으로 중지할 수 있습니다.

요약하면, 
read_only 옵션은 인덱스를 읽기 전용으로 설정하여 모든 색인 작업과 업데이트 작업을 제한하는 반면, 
write 옵션은 인덱스의 색인 작업을 제한하여 새로운 문서의 색인 및 업데이트 작업을 허용하거나 제한합니다.

0개의 댓글