Spring Cloud Eureka Server 자체 보존 및 갱신 임계 값 이해


82

나는 마이크로 서비스 개발에 익숙하지 않지만 Spring의 문서와 Netflix의 문서를 모두 읽으며 한동안 조사해 왔습니다.

Github에서 사용할 수 있는 간단한 프로젝트를 시작했습니다 . 기본적으로 Eureka 서버 (Archimedes)와 3 개의 Eureka 클라이언트 마이크로 서비스 (공용 API 1 개, 개인용 2 개)입니다. 자세한 설명은 github의 readme를 확인하십시오.

요점은 모든 것이 실행 중일 때 개인 마이크로 서비스 중 하나가 죽으면 Eureka 서버가이를 인식하고 레지스트리에서 제거하기를 원한다는 것입니다.

나는 유래에이 문제를 발견 하고, 솔루션을 사용하여 전달 enableSelfPreservation:false유레카 서버 설정에서. 잠시 후이 작업을 수행하면 종료 된 서비스가 예상대로 사라집니다.

그러나 다음 메시지를 볼 수 있습니다.

자체 보존 모드가 꺼져있어 네트워크 / 기타 문제 발생시 인스턴스 만료를 보호하지 못할 수 있습니다.

1. 자기 보존의 목적은 무엇입니까? 문서의 상태가에 자기 보존과 "클라이언트가 더 이상 존재하지 않는 인스턴스를 얻을 수 있습니다" . 그렇다면 언제 켜고 끄는 것이 좋습니까?

또한 자체 보존이 켜져 있으면 Eureka 서버 콘솔 경고에 미해결 메시지가 표시 될 수 있습니다.

비상 사태! EUREKA는 그렇지 않은 경우 인스턴스가 잘못 청구되었을 수 있습니다. 갱신은 임계 값보다 적으므로 인스턴스는 안전을 위해 만료되지 않습니다.

이제 Spring Eureka Console로 진행합니다.

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

임계 값 수의 이상한 동작을 발견했습니다. Eureka 서버 만 시작하면 임계 값이 1입니다.

2. 단일 Eureka 서버가 있고 registerWithEureka: false다른 서버에 등록하지 못하도록 구성되어 있습니다. 그러면 임계 값 개수에 왜 표시됩니까?

3. 모든 클라이언트에 대해 임계 값 카운트가 +2만큼 증가합니다. 분당 2 개의 갱신 메시지를 보내서 그런 것 같아요, 맞죠?

4. Eureka 서버는 갱신을 보내지 않으므로 마지막 갱신 시간은 항상 임계 값 미만입니다. 이것은 정상입니까?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

서버 cfg :

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

클라이언트 1 cfg :

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

3
이 질문에 답할 시간을 갖고 싶습니다. 복잡합니다. 답변 중 일부는 Netflix 코드에 있고 다른 답변은 구성입니다. 내 대답이 Spring Cloud 문서의 일부로 끝나기를 원하지만 그 전에 동료가 대답하지 않는 한 추수 감사절 이후 일 것입니다.
spencergibb

이것은 Netflix의 약간의 배경입니다 : github.com/Netflix/eureka/wiki/…
spencergibb


8
@spencergibb 이것은 9 개월이 다가오고 있으며 답변이 없습니다.
Nick

1
@spencergibb 이제 1 년이 넘었습니다. 언제든지 명확한 답변을 얻을 수있는 기회가 아직 있습니까? 어떤 종류의 크리스마스 선물 :)
OcuS

답변:


62

@codependent가 만난 것과 같은 질문을 받았습니다. 저는 많은 검색을했고 몇 가지 실험을했습니다. 여기에 유레카 서버와 인스턴스가 어떻게 작동하는지에 대한 지식을 제공하기 위해 왔습니다.

모든 인스턴스는 30 초당 한 번의 빈도로 Eureka Server에 대한 임대를 갱신해야하며 eureka.instance.leaseRenewalIntervalInSeconds.

Renews (마지막 분) : 마지막 순간에 Eureka 인스턴스에서받은 갱신 횟수를 나타냅니다.

Renews threshold : Eureka 서버가 분당 Eureka 인스턴스에서 수신 할 것으로 예상하는 갱신 수입니다.

예를 들어, registerWithEureka로 설정 거짓 , eureka.instance.leaseRenewalIntervalInSeconds30로 설정하고 2 유레카 인스턴스를 실행됩니다. 두 개의 Eureka 인스턴스는 분당 4 개의 갱신을 Eureka 서버로 전송 하고 Eureka 서버 최소 임계 값은 1 (코드로 작성)이므로 임계 값은 5입니다 (이 숫자는 eureka.server.renewalPercentThreshold나중에 설명 할 요소 를 곱할 것입니다).

자체 보존 모드 : 갱신 (마지막 분)갱신 임계 값 미만일 경우 자체 보존 모드가 활성화됩니다.

따라서 위의 예에서는 임계 값이 5이기 때문에 SELF PRESERVATION MODE가 활성화되었지만 Eureka 서버는 분당 4 개의 갱신 만받을 수 있습니다.

  1. 질문 1:

SELF PRESERVATION MODE는 네트워크 연결 불량을 방지하기위한 것입니다. Eureka 인스턴스 A와 B 간의 연결은 좋지만 B는 연결 문제로 인해 단기간에 Eureka 서버에 대한 임대를 갱신하지 못했습니다. 현재 Eureka 서버는 단순히 인스턴스 B를 킥아웃 할 수 없습니다. A는 B를 사용할 수 있지만 Eureka 서버에서 등록 된 서비스를 사용할 수 없습니다. 그래서 이것이 SELF PRESERVATION MODE의 목적이며, 켜는 것이 좋습니다.

  1. 질문 2 :

최소 임계 값 1이 코드에 기록됩니다. registerWithEurekafalse로 설정되어 있으므로 Eureka 인스턴스 레지스터가 없으며 임계 값은 1이됩니다.

프로덕션 환경에서는 일반적으로 두 개의 Eureka 서버를 배포 registerWithEureka하며 true로 설정됩니다. 따라서 임계 값은 2가되고 Eureka 서버는 분당 2 회 자체 임대를 갱신하므로 RENEWALS ARE LESSER THAN THRESHOLD문제가되지 않습니다.

  1. 질문 3 :

그래 네가 맞아. eureka.instance.leaseRenewalIntervalInSeconds분당 서버로 전송되는 갱신 횟수를 정의하지만 eureka.server.renewalPercentThreshold위에서 언급 한 계수를 곱할 것이며 기본값은 0.85입니다.

  1. 질문 4 :

네, 정상입니다. 초기 임계 값이 1로 설정되어 있기 때문입니다. 따라서 registerWithEureka가 false로 설정되면 갱신 횟수가 항상 임계 값 미만입니다.

이에 대한 두 가지 제안이 있습니다.

  1. 두 개의 Eureka 서버를 배포하고 registerWithEureka.
  2. 데모 / 개발 환경에서 배포하려는 경우 eureka.server.renewalPercentThreshold0.49로 설정할 수 있으므로 Eureka 서버 만 시작하면 임계 값이 0이됩니다.

안녕 니 싱, 당신은 라벨의 뜻이 무엇인지 알고 : "임대 만료가 활성화가"
jabrena

안녕하세요 @jabrena, 인스턴스가 유레카 서버에 대한 임대를 갱신하지 않으면 임대가 만료된다는 의미라고 생각합니다. 기본적으로 값이 90 초인 eureka.instance.leaseExpirationDurationInSeconds와 관련이있을 수 있습니다. 이 값을 0 또는 음수로 설정하면 레이블이 "임대 만료 사용 : False"로 바뀔 수 있습니다. 시도해 볼 수 있습니다.
Nie Xing


작동하지 않습니다. Threshold = 0, Renews = 0은 여전히 ​​경고를 트리거합니다.
SledgeHammer

selfPreservationMode를 비활성화했지만 여전히 Eureka에이 메시지가 표시됩니다. 갱신은 임계 값보다 적으므로 인스턴스는 안전을 위해 만료되지 않습니다. 옳지 않아요?
DHRUV BANSAL

31

여기 에 Eureka에 대한 세부 정보가 포함 된 블로그 게시물을 만들었습니다. Spring doc 또는 Netflix 블로그에서 누락 된 세부 정보를 채 웁니다. 며칠 동안 소스 코드를 디버깅하고 파헤친 결과입니다. 외부 URL에 연결하는 것보다 복사하여 붙여 넣는 것이 더 낫다는 것을 이해하지만 내용이 너무 커서 SO 답변에 적합하지 않습니다.


2
이러한 명확한 게시물을 링크 해 주셔서 감사합니다. 추천 도서 !!
공동

2
@Abhijit Sarkar 님,이 기사는 훌륭합니다. 나는 많은 구성 문제를 해결했습니다.
jabrena

0

유레카 서버 속성에서 갱신 임계 값 제한을 설정할 수 있습니다. 유레카에 등록 할 마이크로 서비스가 약 3 ~ 4 개있는 경우 다음과 같이 설정할 수 있습니다.

eureka.server.renewalPercentThreshold=0.33
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.