일관성
일관성 (Consistency)
이 페이지에서는 데이터센터의 노드 간에 Consul 카탈로그 결과가 일관되게 유지되도록 하는 Consul의 안티 엔트로피(anti-entropy) 메커니즘에 대한 개념 정보를 다루고 있어요.
출처: 문서
본문
이 페이지에서는 데이터센터의 노드 간에 Consul 카탈로그 결과가 일관되게 유지되도록 하는 Consul의 안티 엔트로피 메커니즘에 대한 개념 정보를 제공합니다.
소개 (Introduction)
엔트로피(entropy) 는 시간이 지남에 따라 시스템이 점점 무질서해지는 경향을 말합니다. Consul에는 이러한 경향에 대응하고 클러스터 구성 요소가 실패하더라도 클러스터 상태를 질서 있게 유지하기 위한 안티 엔트로피 메커니즘이 포함되어 있습니다.
Consul에서는 전역 서비스 카탈로그와 에이전트의 로컬 상태 사이에 구분이 있습니다. 에이전트는 서비스 및 등록된 상태 검사에 대한 정보를 클러스터의 리더 노드에 전달하며, 리더는 권위 있는 전역 서비스 카탈로그를 다른 서버 노드에 복제합니다. 그 결과, Consul 클러스터의 특정 노드는 특정 시점에 다른 노드와 다른 카탈로그 정보를 가질 수 있습니다.
Consul의 안티 엔트로피 메커니즘은 로컬 에이전트 상태를 카탈로그와 주기적으로 동기화하여 카탈로그 차이를 조정합니다.
예를 들어, 사용자가 에이전트에 새 서비스나 검사를 등록하면 에이전트는 이 새 검사가 존재함을 리더에게 알리고, 리더는 카탈로그를 업데이트합니다. 마찬가지로 에이전트에서 검사가 삭제되면 리더에게 알려 카탈로그를 업데이트합니다. 이 정보를 사용하여 카탈로그는 노드와 서비스의 가용성에 따라 쿼리에 지능적으로 응답할 수 있습니다.
Consul은 에이전트의 상태를 권위 있는 것으로 취급합니다. 에이전트의 관점과 카탈로그의 관점 사이에 차이가 있으면 에이전트는 자신의 로컬 관점을 사용합니다.
주기적 동기화 (Periodic synchronization)
Consul의 안티 엔트로피 메커니즘은 장기 실행 프로세스입니다. 에이전트 변경을 감지하는 것 외에도 서비스와 상태 검사 정보를 카탈로그에 주기적으로 동기화합니다. 이 동기화를 통해 카탈로그가 에이전트의 실제 상태와 밀접하게 일치하도록 보장합니다.
이 기능을 통해 Consul은 완전한 데이터 손실이 발생한 경우에도 서비스 카탈로그를 다시 채울 수 있습니다.
주기적인 안티 엔트로피 실행 사이의 시간은 클러스터 크기에 따라 다릅니다. 다음 표는 클러스터의 노드 수로 계산된 클러스터 크기와 동기화 간격 사이의 관계를 설명합니다.
| Cluster Size | Periodic Sync Interval |
|---|---|
| 1 - 128 | 1 minute |
| 129 - 256 | 2 minutes |
| 257 - 512 | 3 minutes |
| 513 - 1024 | 4 minutes |
| ... | ... |
이 간격은 대략적인 값입니다. 너무 많은 노드가 한 번에 동기화되는 것을 피하기 위해 각 Consul 에이전트는 간격 창 내에서 무작위로 엇갈린 시작 시간을 선택합니다.
동기화 실패 (Synchronization failures)
Consul의 안티 엔트로피가 실패할 수 있는 상황은 여러 가지가 있습니다. 여기에는 다음이 포함됩니다:
- 에이전트의 잘못된 구성
- 에이전트 운영 환경의 잘못된 구성
- 디스크 가득 참 또는 파일시스템 권한 오류와 같은 I/O 문제
- 에이전트가 서버와 통신할 수 없는 등의 네트워킹 문제
안티 엔트로피 실행 중 오류가 발생하면 에이전트는 오류를 기록하고 계속 실행합니다. 동기화는 이러한 유형의 일시적인 실패에서 자동으로 복구하기 위해 주기적으로 실행되도록 설계되었습니다.
일관성 모드 (Consistency modes)
Consul의 서비스 검색 기능을 사용하여 등록된 서비스 인스턴스를 반환할 때, Consul은 기본적으로 요청을 클러스터의 리더에게 전달합니다. 이렇게 하면 Consul이 카탈로그에서 가장 최근의 권위 있는 결과를 반환합니다.
서비스 네트워킹 환경에서 워크로드의 필요에 따라 에이전트가 더 크거나 더 작은 정확도로 서비스를 반환하도록 Consul 에이전트의 일관성 모드를 변경할 수 있습니다.
에이전트가 카탈로그 정보를 반환하는 일관성 모드에는 세 가지가 있습니다:
default- 가능한 한 빠르게 정확한 결과를 반환하기 위해 에이전트는 카탈로그 읽기 요청을 클러스터 리더에게 전달합니다. Raft에서 에이전트는 리더 임대(leader leasing) 를 사용하는데, 이는 리더가 자신의 역할이 안정적이라고 가정하는 설정된 시간 창을 제공합니다. 리더 임대 창이 완료되기 전에 선거가 발생하면 이전 리더가 전체 클러스터를 대신하여 읽기 요청을 계속 처리합니다. 따라서 Consul이 가끔 오래된 결과를 반환할 수 있지만, 그 대가로 읽기를 더 빠르게 처리합니다.consistent- 이 모드는 단서 없는 강력한 일관성을 제공합니다. 결과를 반환하기 전에 리더가 여전히 리더인지 피어 쿼럼으로 확인해야 합니다. 이 모드의 결과로 모든 서버 노드에 추가 트래픽이 발생합니다. 읽기 요청의 경우 결과는 항상 일관되지만 요청에 추가 대기 시간이 발생합니다.stale- 이 모드는 리더인지 여부와 관계없이 모든 서버가 읽기를 처리하도록 허용합니다. 읽기는 더 빠르고 확장 가능해지지만 오래된 값을 반환할 가능성이 더 높아집니다. 이 모드는 리더 없이 읽기를 허용하므로, 중단 중에도 Consul 서버가 요청에 응답할 수 있습니다.
자세한 내용은 HTTP API 문서의 Consistency modes를 참조하세요.
Jepsen 테스트 (Jepsen testing)
Jepsen은 분산 시스템의 파티션 허용성(partition tolerance)을 테스트하도록 설계된 도구입니다. 시스템에 무작위 작업을 퍼징하면서 네트워크 파티션을 만듭니다. 결과를 분석하여 시스템이 주장하는 일관성 속성을 위반하는지 확인합니다.
Consul 테스트의 일부로 우리는 일관성 문제가 발견될 수 있는지 확인하기 위해 Jepsen 테스트를 실행했습니다. 테스트에서 Consul은 일관성 문제를 유발하지 않고 파티션에서 정상적으로 복구되었습니다.
테스트 출력 (Test output)
다음 출력은 Jepsen 테스트 중에 캡처된 것입니다.
$ lein test :only jepsen.system.consul-test
lein test jepsen.system.consul-test
INFO jepsen.os.debian - :n5 setting up debian
INFO jepsen.os.debian - :n3 setting up debian
INFO jepsen.os.debian - :n4 setting up debian
INFO jepsen.os.debian - :n1 setting up debian
INFO jepsen.os.debian - :n2 setting up debian
INFO jepsen.os.debian - :n4 debian set up
INFO jepsen.os.debian - :n5 debian set up
INFO jepsen.os.debian - :n3 debian set up
INFO jepsen.os.debian - :n1 debian set up
INFO jepsen.os.debian - :n2 debian set up
INFO jepsen.system.consul - :n1 consul nuked
INFO jepsen.system.consul - :n4 consul nuked
INFO jepsen.system.consul - :n5 consul nuked
INFO jepsen.system.consul - :n3 consul nuked
INFO jepsen.system.consul - :n2 consul nuked
INFO jepsen.system.consul - Running nodes: {:n1 false, :n2 false, :n3 false, :n4 false, :n5 false}
INFO jepsen.system.consul - :n2 consul nuked
INFO jepsen.system.consul - :n3 consul nuked
INFO jepsen.system.consul - :n4 consul nuked
INFO jepsen.system.consul - :n5 consul nuked
INFO jepsen.system.consul - :n1 consul nuked
INFO jepsen.system.consul - :n1 starting consul
INFO jepsen.system.consul - :n2 starting consul
INFO jepsen.system.consul - :n4 starting consul
INFO jepsen.system.consul - :n5 starting consul
INFO jepsen.system.consul - :n3 starting consul
INFO jepsen.system.consul - :n3 consul ready
INFO jepsen.system.consul - :n2 consul ready
INFO jepsen.system.consul - Running nodes: {:n1 true, :n2 true, :n3 true, :n4 true, :n5 true}
INFO jepsen.system.consul - :n5 consul ready
INFO jepsen.system.consul - :n1 consul ready
INFO jepsen.system.consul - :n4 consul ready
INFO jepsen.core - Worker 0 starting
INFO jepsen.core - Worker 2 starting
INFO jepsen.core - Worker 1 starting
INFO jepsen.core - Worker 3 starting
INFO jepsen.core - Worker 4 starting
INFO jepsen.util - 2 :invoke :read nil
INFO jepsen.util - 3 :invoke :cas [4 4]
INFO jepsen.util - 0 :invoke :write 4
INFO jepsen.util - 1 :invoke :write 1
INFO jepsen.util - 4 :invoke :cas [4 0]
INFO jepsen.util - 2 :ok :read nil
INFO jepsen.util - 4 :fail :cas [4 0]
(Log Truncated...)
INFO jepsen.util - 4 :invoke :cas [3 3]
INFO jepsen.util - 4 :fail :cas [3 3]
INFO jepsen.util - :nemesis :info :stop nil
INFO jepsen.util - :nemesis :info :stop "fully connected"
INFO jepsen.util - 0 :fail :read nil
INFO jepsen.util - 1 :fail :write 0
INFO jepsen.util - :nemesis :info :stop nil
INFO jepsen.util - :nemesis :info :stop "fully connected"
INFO jepsen.core - nemesis done
INFO jepsen.core - Worker 3 done
INFO jepsen.util - 1 :invoke :read nil
INFO jepsen.core - Worker 2 done
INFO jepsen.core - Worker 4 done
INFO jepsen.core - Worker 0 done
INFO jepsen.util - 1 :ok :read 3
INFO jepsen.core - Worker 1 done
INFO jepsen.core - Run complete, writing
INFO jepsen.core - Analyzing
(Log Truncated...)
INFO jepsen.core - Analysis complete
INFO jepsen.system.consul - :n3 consul nuked
INFO jepsen.system.consul - :n2 consul nuked
INFO jepsen.system.consul - :n4 consul nuked
INFO jepsen.system.consul - :n1 consul nuked
INFO jepsen.system.consul - :n5 consul nuked
1964 element history linearizable. :D
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
우리는 Jepsen을 여러 번 실행했고 Consul은 매번 통과했습니다. 이 출력은 단일 실행을 대표할 뿐이며 길이를 위해 편집되었습니다.