inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

해결된 질문

45

soap

작성한 질문수 37

0

hong님 안녕하세요!

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

 

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

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

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

 

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

 

 

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

답변 2

1

Hong

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

 

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

  • SELECT는 허용될겁니다.

 

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

 

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

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

 

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

 

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

 

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

0

soap

원리까지 설명해주셔서 감사합니다! 처음부터 인덱스 설계를 잘했으면 불상사가 일어나지 않았을텐데 말이죠 ㅠ

 

인덱스 추가를 위해 잠시 디비 스펙업을 해야하는 경우도 종종 있을까요?

cpu 2코어로 평시 트래픽을 충분히 받고 있었는데 CONCURRENTLY 옵션 없이 인덱스 추가해서 cpu 100% 장애가 발생했었거든요.

말씀해주신대로, CONCURRENTLY 를 사용해도 대용량 테이블 같은 경우 부하가 클것으로 예상되는데 사용자 가장 적은 새벽에 작업 + 디비 스펙업(무중단 불가능하니 공지 때림)을 기본으로 깔고 작업해야 하는건지 궁금합니다!

0

Hong

아 이거 알람이 오지 않아서 제가 이 부분을 놓쳤네요 ㅠㅠ 너무 늦게 답변드려서 죄송합니다.

 

넵 당연하게도 트래픽이 최소화되는 시간에 진행하는게 당연합니다. 물론 이 부분에 대해서 따로 공지를 띄우고 진행한다?? 까지는 회사 정책이나 플랫폼 성질에 따라 다르겠지만

 

기본적으로는 그런 부분은 깔고 들어가시는게 맞아요.

 

또한 임시로 스펙업을 한다라.. 흠 사실 현실적으로 그정도는 아닙니다. 보통은 그런 상황이 되기 전에 스펙업을 우선적으로 진행하는게 정상적이에요 ㅋㅋㅋㅋ

 

모니터링하면서 어 이게 너무 올라가네?? 그러면 스펙업을 해두자는게 맞지 어 이게 다 찼네?? 스펙업 하고 인덱스 추가하자 느낌은 아니였던거 같습니다.

  • 물론 이것도 조직 구성에 따라 다를 수 있습니다!!

-1

인프런 AI 인턴

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

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

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

  1. Locking 및 Concurrency:

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

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

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

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

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

추가적인 조언

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

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

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

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

일대일 fk 위치

0

14

1

GROUP BY, HAVING 실습 1번문제

1

13

2

수업에서 사용하는 툴 질문드려요

0

24

2

중복내용 제보?!

1

22

2

2강에 파일 어디있을까여,,

0

18

2

다음 강의는 언제쯤 나올까요?

0

24

2

궁금한점이 여러개 생겼습니다.

1

34

1

강의자료 문의

0

18

1

마인드맵 사용 프로그램

0

19

1

엔터티 종류

0

21

2

제 3 정규형 vs BCNF 정규형 차이점?

0

30

3

XAMPP에서 Apache, DB 재기동 시 접속안되는 문제

0

17

1

DESC, ASC

0

28

2

수파베이스 ORM 질문

0

27

2

GROUP BY 시 인덱스를 타지 않는 이유가 궁금합니다

0

22

1

FOREIGN KEY 정리하기, 영상대로 SQL코드 복붙해도 안되요.

0

19

1

트리거 질문

0

27

1

강사님 안녕하세요 ㅎdatabricks환경에 대한 설

0

30

3

패키지 구분에 대해 궁금한게 있습니다

0

25

2

3강 질문

0

41

2

Substack 1년 제공

1

33

3

오라클

0

60

1

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

0

72

1

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

0

85

2