Spring Cloud Eureka Server 자체 보존 및 갱신 임계값 이해
저는 스프링의 문서와 넷플릭스의 문서를 읽으며 오랫동안 연구해 왔지만 마이크로 서비스를 개발하는 것은 처음입니다.
Github에서 사용할 수 있는 간단한 프로젝트를 시작했습니다.기본적으로는 Eureka 서버(Archimedes)와 3개의 Eureka 클라이언트 마이크로 서비스(1개의 퍼블릭 API와 2개의 프라이빗 API)입니다.자세한 설명은 github의 readme를 참조하십시오.
요점은 모든 것이 가동되고 있을 때 프라이빗 마이크로 서비스 중 하나가 파괴되면 Eureka 서버가 이를 인식하고 레지스트리에서 삭제해 주었으면 한다는 것입니다.
Stackoverflow에서 이 질문을 발견하면 해결 방법은enableSelfPreservation:false유레카 서버잠시 후 이 작업을 수행하면 예상대로 종료된 서비스가 사라집니다.
다만, 다음의 메세지가 표시됩니다.
자기 보존 모드가 꺼졌습니다.이로 인해 네트워크 또는 기타 문제 발생 시 인스턴스의 유효기간이 보호되지 않을 수 있습니다.
1. 자기보존의 목적은 무엇입니까?문서에는 "클라이언트가 더 이상 존재하지 않는 인스턴스를 가져올 수 있습니다"에 대한 자체 보존이 명시되어 있습니다.그럼 언제 켜거나 끄는 것이 좋을까요?
또한 자기보존이 켜져 있는 경우 Eureka Server 콘솔에 다음과 같은 미결 메시지가 표시될 수 있습니다.
긴급! EUREKA는 인스턴스가 올라오지 않은 상태에서 인스턴스가 올라갔다고 잘못 주장할 수 있습니다.갱신이 임계값보다 적기 때문에 안전을 위해 인스턴스가 만료되지 않습니다.
이제 Spring Eureka Console로 넘어가겠습니다.
Lease expiration enabled true/false
Renews threshold 5
Renews (last min) 4
임계값 카운트의 이상한 동작을 발견했습니다.Eureka 서버를 단독으로 기동하면 임계값은 1이 됩니다.
, 2대의 Eureka 서버가 .registerWithEureka: false하다그러면 임계값 카운트에 표시되는 이유는 무엇입니까?
3. 클라이언트를 시작할 때마다 임계값 카운트가 +2씩 증가합니다.1분에 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
@codependent meet과 같은 질문을 받고 구글을 많이 검색하여 실험을 했습니다.여기서 Eureka 서버와 인스턴스의 구조에 대한 지식을 좀 더 기고하게 되었습니다.
해야 합니다.은 "Eureka Server"에서 할 수 .이거는 다음에서 정의할 수 있습니다.eureka.instance.leaseRenewalIntervalInSeconds
갱신(마지막 분): 최근 1분 동안 Eureka 인스턴스로부터 받은 갱신 수를 나타냅니다.
갱신 임계값:는 Eureka 서버가 분당 Eureka 인스턴스로부터 수신할 것으로 예상되는 갱신합니다.
를 들어, 「」의 ,registerWithEurekafalse로 설정되어 있습니다.eureka.instance.leaseRenewalIntervalInSeconds는 30으로 설정되며 2개의 Eureka 인스턴스를 실행합니다.2개의 Eureka 인스턴스는 분당 4개의 갱신을 Eureka 서버로 전송합니다.Eureka 서버의 최소 임계값은 1(코드 입력)이므로 임계값은 5(이 숫자는 곱셈 계수)입니다.eureka.server.renewalPercentThreshold나중에 논의하겠습니다.)
자체 보존 모드: 갱신(마지막 분)이 갱신 임계값보다 작으면 자체 보존 모드가 활성화됩니다.
따라서 위 예에서는 임계값이 5이므로 SELF PRESSION MODE가 활성화되지만 Eureka 서버는 리뉴얼/분당 4개만 수신할 수 있습니다.
- 질문 1:
SELF PRESSION MODE는 네트워크 접속 장애가 발생하지 않도록 설계되어 있습니다.Eureka 인스턴스 A와 B의 접속은 양호하지만 B는 접속 딸꾹질로 인해 Eureka 서버에 대한 리스를 단기간에 갱신할 수 없습니다.현시점에서는 Eureka 서버가 단순히 인스턴스 B를 쫓아낼 수는 없습니다.이 경우 인스턴스 A는 B가 사용 가능하더라도 Eureka 서버에서 등록된 서비스를 받을 수 없습니다.이것이 SELF PRESSION MODE의 목적이므로 켜는 것이 좋습니다.
- 질문 2:
1번으로 하다 registerWithEureka되어 있기 레지스터는 은 1. false가 됩니다
가동 에서는 일반적으로 2대의 와 2대의 Eureka 서버를 .registerWithEurekatrue로 됩니다. 임계값은 2가 , 2회 Eureka는 1분마다 리스를 갱신합니다.RENEWALS ARE LESSER THAN THRESHOLD제가가되 되않않않않
- 질문 3:
요.eureka.instance.leaseRenewalIntervalInSeconds분당 되는 갱신 만, 「」의 .eureka.server.renewalPercentThreshold0.85로 하다
- 질문 4:
1로 때문에 정상입니다. 만약 '만약에'가registerWithEureka는 false로 설정되며, 갱신은 항상 임계값을 밑돌고 있습니다.
이에 대해 두 가지 제안이 있습니다.
- 2대의 Eureka 서버를 도입하여
registerWithEureka. - 데모/개발 환경에만 도입하고 싶은 경우는,
eureka.server.renewalPercentThresholdEureka 서버만 기동하면 임계값은 0이 됩니다.
Spring doc 또는 Netflix 블로그에서 누락된 세부사항을 채워주는 Eureka의 세부사항을 여기에 블로그 게시물을 만들었습니다.이는 며칠 동안 소스 코드를 디버깅하고 파헤친 결과입니다.외부 URL에 링크하는 것보다 복사 붙여넣기를 하는 것이 바람직하다는 것은 알고 있습니다만, SO답변에는 내용이 너무 큽니다.
Eureka 서버 속성에서 갱신 임계값 제한을 설정할 수 있습니다.Eureka에 등록할 수 있는 마이크로 서비스가 3~4개 정도 있는 경우 다음과 같이 설정할 수 있습니다.
eureka.server.renewalPercentThreshold=0.33
server:
enableSelfPreservation: false
Eureka는 true로 설정되어 있는 경우 서비스 인스턴스가 자신을 등록하고 30초마다 등록 갱신 요청을 계속 전송할 것으로 예상하고 있습니다.일반적으로 Eureka가 3회 갱신기간(또는 90초) 동안 서비스로부터 갱신을 받지 못하면 해당 인스턴스의 등록을 취소합니다.
false로 설정되어 있는 경우, 이 경우 Eureka는 네트워크에 문제가 있다고 가정하고 자기 보존 모드로 들어가 서비스인스턴스를 등록 해제하지 않습니다.
개발을 위해 자체 보존 모드를 해제하기로 결정한 경우에도 실제 가동 상태로 전환될 때 이 모드를 사용하도록 설정해야 합니다.
언급URL : https://stackoverflow.com/questions/33921557/understanding-spring-cloud-eureka-server-self-preservation-and-renew-threshold
'programing' 카테고리의 다른 글
| Oracle에서 날짜에서 월 이름을 가져옵니다. (0) | 2023.03.06 |
|---|---|
| 브라우저는 언제 Javascript를 실행합니까?실행 커서는 어떻게 이동합니까? (0) | 2023.03.06 |
| RestTemplate를 사용할 때 내부 잭슨 매퍼를 설정하려면 어떻게 해야 합니까? (0) | 2023.03.06 |
| 어떻게 하면 ng-view가 아닌 ui-view에서 ng-animate를 사용할 수 있나요? (0) | 2023.03.06 |
| Redx 상태 및 URL 해시 태그 매개 변수를 동기화하는 방법 (0) | 2023.03.06 |