[Test] Chaos Monkey - 운영 이슈 테스트

홍정완·2022년 8월 26일
1

Java

목록 보기
24/25
post-thumbnail

Chaos Monkey 소개


이번 포스팅에서는 운영 이슈 테스트를 학습할 것이다. HTTP API 요청을 할 때 늘 같은 인터넷 속도와 환경, 그리고 서버의 메모리 상태동시 접속하는 사용자는 늘 달라진다. 그렇게 다음과 같은 운영 환경 문제가 발생할 수 있다.


네트워크 지연서버 장애
디스크 오작동메모리 누수

이러한 이슈들은 간혹가다 한 번씩 발생을 하지만, 발생했을 때의 여파는 매우 크다.
이렇게 생기는 문제들을 카오스(Chaos)라 하는데, 이런 이슈를 핸들링하는 방법을 카오스 엔지니어링이라 한다.
그리고 이런 카오스 엔지니어링을 도와주는 툴들이 있는데, 대표적으로 넷플릭스에서 만든 Chaos Monkey라는 툴이 있다.


✅ 카오스 엔지니어링 툴

  • 넷플릭스카오스 엔지니어링을 설명하기 위한 기본 원칙을 담고 있는 책의 번역본

카오스 엔지니어링의 원칙 :: Channy's Blog


Chaos Monkey for Spring Boot를 사용해서 카오스 엔지니어링을 해 볼 것이다.
다음과 같은 어노테이션이 붙어있는 빈(bean)들에 접근제어자가 public인 경우 다음과 같은 공격을 할 수 있으며, Chaos Monkey를 사용해 공격을 해서 카오스 엔지니어링을 진행해 볼 것이다.


공격 대상(Watcher)공격 유형(Assaults)
@RestController응답 지연(Latency Assault)
@Controller예외 발생(Exception Assault)
@Service애플리케이션 종료(AppKiller Assault)
@Repository메모리 누수(Memory Assault)
@Component



ChaosMonkey 동작 과정



💡 왜 이런 운영 이슈 테스트를 해야 할까?

테스트 대상 프로젝트에서 특정 Repository가 응답 지연이 발생한다면 해당 Repository를 사용하는 Service나 Controller도 같이 응답이 지연된다. 이런 상황들을 재연할 수 있다면, 우리는 개발 단계에서 임의의 응답 지연이나 문제가 이슈가 발생하는 대상을 찾을 수 있고, 문제가 없는 Repository로 바꾸거나 성능 개선을 추구할 수 있다.



Chaos Monkey 설치


  • 스프링 부트 환경에서 Chaos Monkey 라이브러리 설치는 기타 다른 의존성을 추가하듯이
    (메이븐 기준) pom.xml에 코드를 추가

의존성 추가

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>chaos-monkey-spring-boot</artifactId>
    <version>2.1.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Chaos Monkey 활성화

  • 의존성만 추가한다고 동작하지는 않고 설정 파일(ex: application.properties)에 옵션을 넣어줘야 한다.
    (vm 옵션으로 줄 수도 있다.)
spring.profiles.active=chaos-monkey

스프링 Actuator 엔드 포인트 활성화

management.endpoint.chaosmonkey.enabled=true
management.endpoints.web.exposure.include=health,info,chaosmonkey

✅ 스프링 부트 Actuator란?

  • 스프링 부트 운영 툴로, 런타임 중에 Chaos Monkey 설정을 변경할 수 있다.
  • 그 밖에도 헬스 체크, 로그 레벨 변경, 매트릭스 데이터 조회 등 다양한 운영 툴로 사용이 가능하다
  • /actuator



CM4SB 응답 지연


CM4SB(Chaos Monkey For Spring Boot) 라이브러리를 이용해 응답 지연 이슈를 확인해 보자.


Repository Wathcer 활성화

  • 우선 프로젝트 설정 파일에서 @Repository 어노테이션에 대해 Watcher를 활성화

    • 프로젝트에 repository응답 지연 공격 대상으로 지정해준다는 어노테이션
chaos.monkey.watcher.repository=true

Chaos Monkey 활성화

애플리케이션 서버에 http 요청을 보내서 카오스 몽키를 활성화시키자
POST /actuator/chaosmonkey/enable로 요청을 보내면 된다.



end-point (/actuator)설명Method
/chaosmonkey현재 카오스 몽키 설정 정보Get
/chaosmonkey/status카오스 몽키 on/off 여부Get
/chaosmonkey/enable카오스 몽키 onPost
/chaosmonkey/disable카오스 몽키 offPost
/chaosmonkey/watchers현재 켜져있는 watchers 정보Get
/chaosmonkey/watcherswatchers 정보 수정Post
/chaosmonkey/assaults현재 켜져 있는 assaults 정보Get
/chaosmonkey/assaultsassaults 정보 수정Post



  • GET /watchers로 현재 활성화된 watcher 목록을 볼 수 있다.



  • Repository에 지연 공격을 해보자. 아래와 같이 요청을 보내면 된다.
  • "level": 3 : 3번 요청할 때마다 1번씩 공격(지연) 하도록 설정
  • "latencyRangeStart": 2000 "latencyRangeEnd": 5000 : 2초~5초 응답 지연
  • "latencyActive": true : 지연 공격 활성화



JMeter 테스트 결과

이제 요청들이 1/3 확률로 지연되는 것을 볼 수 있다. Repository에 지연 공격을 가했는데 요청을 받는 Controller에서 해당 Repository의 결과를 참조하기 때문에 요청에 대한 응답도 지연된다. 그래도 요청이 대체로 성공하는 것을 알 수 있다.

profile
습관이 전부다.

0개의 댓글