[펌] Mysql 운영 Tip

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


지난 2년간 번개장터 서비스를 운영하면서 MySQL 을 사용하였는데
여러가지 한계에 부딛히면서 전문 업체에게 컨설팅을 받아서 시행착오를 줄이는게 낫겠다는 생각을 했습니다.


그래서 컨설팅 회사에 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 을 사용하면 무중단으로 Slave를 만들 수 있다. 추가적으로 데이터베이스 백업 할 때도 유용한
    툴이다.

 


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



  • 100만건이 넘어가면 꼭 파티셔닝을 고려해야 한다.

 


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








  • 스핑크스
    추천한다.

  • 추천 받아서 적용해보니, 위치검색, 한글 검색, 비 텍스트 검색 모두에서 매우 빠른
    성능을 보여준다. 게다가 확장성이 좋아서 저가 서버에 분산 배치해두었는데 로드가 거의 없다. 기존에는 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 만큼 좋은 인터페이스를
가진 것이 잘 없다. 우리 회사에서는 개발자 아닌 사람들이 분석을 많이 하는데 SQL으로 분석한다. NoSQL 이었다면 조금 힘들지 않았을까?
빨리 치고 나가야하는 스타트업에게 MySQL은 좋은 선택인것 같다

출처: http://quicket-engineering.tumblr.com/post/37961576249/mysql

댓글 남기기