728x90

MySQL 운영하면서 겪은 문제점과 해법들

원본 : http://vstarmanv.tistory.com/350


컨설팅 회사에 MySQL을 운영하면서 겪고 있는 문제들을 해소하고자 여러가지를 물어보았고 큰 도움을 얻었다.본격적인 컨설팅은 아니었기 때문에 돈은 지불하지 않고 도움을 받았다.

 

1. 데이터가 이천만건 정도 있는데 테이블의 스키마를 변경하려고 하면 많은 시간이 걸리는데 어떻게 해야하나?

  • 페이스북이 개발한 툴킷을 이용한다. 온라인으로 스키마 변경하는데는 3가지 방법이 있는데 페이스북에서 개발한 방법이 제일 좋다.
  • InnoDB 대신 TokuDB 를 사용할 수도 있다. 컬럼을 추가하거나 수정, 삭제, 인덱스 걸기 등의 스키마 변경시 InnoDB엔진이 몇시간이 걸릴 때 TokuDB 엔진은 몇초면 된다.

 

2. 데이터베이스 부하가 심하다. 쿼리 최적화 외에 성능 개선할 방법이 없을까?

  • MySQL의 변형인 MariaDB를 추천한다. MySQL으로 운영하다가도 바이너리만 MariaDB 를 설치하면 된다. MySQL 상용버전에 들어있는 Thread Pool 같은 기능을 무료로 사용 가능하며, MySQL보다 더 많은 테스트가 이루어지고 테이블 변경시 변경 상황 등이 제공된다. Oracle MySQL 을 쓰면서 아쉬웠던 점이 해결된다.
  • TokuDB 라는 것도 있다. InnoDB를 대신하여 사용 가능하며 쓰기 속도가 크게 향상되었다. SSD에서 Insert 는 InnoDB 대비 9배 빨라졌다. 단, 유료다. 그러나 연구용이나 스타트업은 싸게 해준다.

 

3. 읽기쪽 부하를 줄이기 위해 Slave를 추가해야하는데 지금까지는 잠시 서비스를 잠시 중단하고 복사하는 방법을 사용했는데 좋은 방법이 없을까?

  • Xtrabackup 을 사용하면 서버가 돌아가는 중간에도 데이터를 백업할 수 있다.
  • 증분 백업도 가능하다.
  • Xtrabackup 의 단점은 데이터를 통째로 바이너리 형태로만 백업한다는 점이다.
  • SQL 형태로 뽑아내고 싶다면 Mydumper 를 추천한다.

 

4. 몇천만건이 넘어가는 데이터를 쌓을 때 주의할 점은?

  • 100만건이 넘어가면 꼭 파티셔닝을 고려해야 한다.
  • 대체로 시간단위로 데이터를 물리적으로 분리해서 저장한다. 적절히만 사용해도 수십억건의 데이터 관리도 불가능하지 않다.

 

5. 검색 부하가 매우 심하다. 좋은 검색 엔진을 추천해달라. 

  • MyISAM 스토리지 엔진은 Fulltext 검색에 부하가 심하다.
  • 스핑크스를 추천한다.
  • 추천 받아서 적용해보니, 위치검색, 한글 검색, 비 텍스트 검색 모두에서 매우 빠른 성능을 보여준다. 게다가 확장성이 좋아서 저가 서버에 분산 배치해두었는데 로드가 거의 없다. 기존에는 MyISAM Full-text Search 을 쓰다가 Groonga Full-text Search 를 사용했었는데 MyISAM 은 Table locking 때문에 정기적으로 크게 느려졌고, Groonga 라는 검색엔진은 버그도 많고 비 텍스트 검색에서 최악의 성능을 보여준다. 암튼 MySQL 서버 로드가 무지 무지 올라갔었다. 그런데 스핑크스를 도입하면서 전반적으로 빨라지고 위치검색도 덤으로 10배 빨라졌다. 매우 만족한다.

 

6. 마스터 서버가 다운된적이 있다. 이중화 하려면 어떻게 해야하나?

  • MySQL MHA 를 추천한다.
  • 기타 대안 : MySQL Cluster 혹은 MySQL-MMM 

 

7. 어떤 쿼리가 부하를 일으키는지 확인하는데 효과적인 방법 없을까? Slow Log 가 너무 많이 쌓여서 우선순위대로 정렬이 되면 좋겠다.

MONyog를 추천한다.

  • 실시간으로 쿼리를 분석하고 느린 쿼리들을 취합하여 가장 느린 쿼리부터 개선할 수 있다. 
  • 어떤 쿼리가 Lock 을 유발하는지 알 수 있다. 놀라운것은, 어떤 쿼리가 Lock에 영향을 받았는지 까지 알 수 있다. 환상적이다.
  • Cache Miss 같은 것이 어떤곳에서 발생하는지를 보고 메모리를 늘려야 하는지 등을 결정할 수 있게 해준다.
  • Connection Refuse 가 얼마나 일어나는지 확인가능하다.
  • 어떤 테이블이 많이 접근되는지 알 수 있다. (가장 접근이 많은 테이블 부터 최적화를 할 수 있다)

 

[기타] 내가 생각하는 MySQL의 장점

온라인 스키마 변경, 고가용성 때문에 NoSQL을 고려한적이 많았으나 MySQL에서 해결 가능하다. NoSQL은 숙련된 인력을 구하기 힘들기 때문에 개발 비용이 더 올라갈 수 있고 데이터 분석에 SQL 만큼 좋은 인터페이스를 가진 것이 거의 없다. 빨리 치고 나가야하는 스타트업에게 MySQL은 좋은 선택인것 같다

 

 

블로그 이미지

Link2Me

,