inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10,000++억의 데이터를 다루는 카카오 면접관의 MySQL

라이브 운영중인 환경의 테이블에 인덱스 추가시 고려사항

해결된 질문

17

soap

작성한 질문수 37

0

hong님 안녕하세요!

라이브 운영중인 테이블에 인덱스 추가시 고려할 사항이 궁금합니다!

 

psotgresql이긴 하지만 금일 오전에 데이터 1800만건이 있는 테이블에 인덱스 추가를 했더니 cpu 100% 치솟는 장애 직겨탄을 맞았습니다.. (15분간 앱 사용 중단 ㅠㅠ)

뒤늦게 찾아보니 락을 잡지 않는 옵션을 추가했어야 하더군요.

새벽에 작업, 일시적인 디비 스펙업 정도만 떠오르네요.

 

몇천만건 ~ N억건 데이터가 있는 테이블에 인덱스 생성시 고려할 사항이 무엇들이 있는지 궁금합니다!

 

 

mysql dbms/rdbms 데이터-엔지니어링 backend

답변 2

0

Hong

어우 soap님 질문 남겨주셔서 감사합니다. 꽤나 위험한 작업을 하셨군요 ㅠㅠ 많이 떨리셨겠어요...

 

먼저 발생하신 장애는 기본적으로 발생가능한 장애입니다. 왜냐하면 SharedLock 을 잡기떄문에 쓰기가 차단되는걸로 보여요.

  • SELECT는 허용될겁니다.

 

그래서 데이터가 많게된다면, 해당 데이터들을 모두 스캔하는 동안 쓰기데이터가 대기하면서 커넥션 풀이 고갈되는걸로 보여요..

 

해결하는 방법으로는 CONCURRENTLY 를 사용하는겁니다. 이러면 ShareUpdateExclusive 을 잡기떄문에 블로킹은 딱히 없기는하지만, 좀 더 오래걸리고 부하도 더 크기는 합니다.

  • 대신 서비스는 무중단으로 가능하죠

 

이외에도 고려할만한게 있다면, 우선적으로 디스크 공간을 확인하셔야해요. WAL 증가도 존재하고 인덱스 생성으로 인해 크기를 더 잡아먹기 때문에 디스크가 여유있는지 확인해주시고 복제본이 있다면, WAL 증가로인해 복제지연이 발생하여 데이터가 정상적으로 표기되지는 않는지 확인해보시면 좋을꺼같습니다.

 

근데 뭐... 사실 가장 좋은 방법은 사용자가 별로 없는 시간대에 최대한 영향을 주지 않는 시간대에 실행하는게 좋습니다. 이런 경우에는 굳이 CONCURRENTLY 를 쓸 필요도 없겠죠

 

어느정도 질문에 대한 답이 되셨을까요?? 혹시 추가적인 질문이 있다면 남겨주세요!!

-2

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. soap님.

라이브 운영 중인 데이터베이스에 인덱스를 추가할 때는 여러 가지 고려해야 할 사항들이 있습니다. 특히 대량의 데이터를 다루는 상황에서는 더욱 주의가 필요합니다. 여기 몇 가지 중요한 포인트를 짚어보겠습니다.

인덱스 추가 시 고려해야 할 사항들

  1. Locking 및 Concurrency:

    • 인덱스를 추가할 때 테이블에 락이 걸릴 수 있습니다. 이로 인해 다른 트랜잭션이 대기 상태가 되거나 서비스 중단을 초래할 수 있습니다.
    • PostgreSQL의 경우 CONCURRENTLY 옵션을 사용하여 락을 피할 수 있습니다. 하지만 이 역시 리소스를 사용하며 오래 걸릴 수 있습니다.
  2. CPU 및 I/O 부하:

    • 인덱스를 생성하는 작업은 CPU와 I/O를 크게 소모할 수 있습니다. 사전에 디비의 리소스 사용 패턴을 모니터링하고 비어 있는 자원을 활용하여 작업합니다.
    • 필요시에는 DB 서버의 스펙을 일시적으로 업그레이드하여 작업을 수행할 수 있습니다.
  3. 작업 시간:

    • 트래픽이 적은 시간 또는 새벽 시간에 작업을 수행하는 것이 좋습니다. 성능 저하를 최소화하기 위해서입니다.
  4. 테스트 환경에서의 시뮬레이션:

    • 운영 환경에 적용하기 전에 테스트 환경에서 작은 규모의 데이터셋으로 미리 시뮬레이션을 해보는 것도 좋은 방법입니다.
  5. 모니터링 툴 사용:

    • 실시간으로 CPU, 메모리, I/O 사용량을 모니터링하여 문제 발생 시 빠르게 대응할 수 있도록 준비합니다.

추가적인 조언

  • 백업: 테이블 수정 작업 전에는 반드시 백업을 해주세요. 예상하지 못한 문제가 발생할 수 있기 때문입니다.
  • 지속적인 최적화: 인덱스가 추가된 이후에도 부하를 모니터링하고, 필요한 경우 인덱스를 최적화하거나 재조정합니다.

관련된 토픽을 다룬 강의와 게시물이 있어, 추가적인 정보가 필요하시다면 아래를 참조하시면 좋겠습니다:

이 링크에서는 대규모 데이터와 인덱스 관리에 대한 다양한 실무적 조언을 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

JPA Repository 질문이 있습니다!

1

28

2

페이지네이션 처리를 쿼리에서 하는 방식 질문

1

29

1

DDD 는 마이바티스와 잘 맞지 않는건가요?

0

37

1

스프링부트 버전 문의드립니다.

0

27

1

Json 요청 처리

1

26

2

비동기 스레드풀 분리 이유와 Virtual Thread 전환 시 고려사항

0

26

1

gRPC 실무에서 질문

0

30

2

수강기간 연장

0

18

1

Build 관련 문제 (테스트 관련 문제)

0

30

1

다양한 관점의 코드 경험을 위해 개선하지 않은 코드

1

38

1

BCNF 질문

0

40

2

consumer에서 에러가 발생할 경우 데이터 유실 문의

0

32

2

게시글 테스트 데이터 삽입

0

41

2

Orchestration SAGA 패턴 보상에 대한 질문입니다.

0

46

2

연관 엔티티 네이밍 규칙

0

35

1

[건의][6장][작전1] deprecated 메소드

1

42

2

[예제][3장][작전2] windows 에서 마지막 예제

0

35

1

6강 - 해시태그 모델의 샤딩 전략에 대하여, 분산 정도(데이터 편중)와 트랜잭션 성능의 trade off 상황 발생 시에 대한 고민

0

35

2

2022년 2회차 실기 4번

0

21

1

31강 이미지내용에 틀린 부분이 있는 것 같습니다.

0

41

2

히스토리 관련 질문

0

48

2

오라클

0

50

1

21강에서 이해하기 어려운 부분들이 있습니다!

0

63

1

인덱스 분할, 병합에 따른 인덱스 적용 기준과 OPTIMIZE TABLE

0

77

2