Tag Archives: mysql

MySQL 팁

지난 3년간 번개장터 서비스를 운영하면서 얻은 MySQL 운영 팁을 알려드립니다.

1. 서비스 중인 데이터베이스의 테이블의 스키마를 서비스 중단 없이 변경하려면?

InnoDB 스토리지의 경우 스키마를 변경하면 변경이 완료될 때 까지 Lock 이 걸리게 되어 서비스가 잠시 중단 되어야 했습니다. 그래서 저희는 Percona Toolkit 의 pt-online-schema-change 기능을 사용 하여 중단 없이 변경합니다. 사용 방법도 간단하고 나름 안정성이 있다고 합니다. 그러나 단점으로는 기존에 트리거(Trigger)가 걸려 있는 테이블에는 적용이 불가능 합니다.

대안으로, MySQL 5.6을 도입하거나 MySQL Cluster 와 같이 스키마를 변경하는 것이 자유로운 제품을 선택하는 것도 방법이지만 아직 검증이 많이 되지 않아서 문제가 있습니다.

2. 데이터베이스 연결이 너무 많은데 어떻게 하나요?

MySQL 클라이언트의 동시 접속 개수가 1200개를 넘어가는 경우가 생기면서 기존 MySQL 5.5 에서 쓰레드 생성 실패하여 서버가 죽어버리는 문제가 발생하였습니다. 클라이언트에서 접속 개수를 줄이도록 수정하였으나 향후에도 유사한 문제가 발생할 가능성이 있어서 Connection Pool 기능이 제공되는 MariaDB 5.5 를 도입하였습니다. 덕분에 수천개의 동시 접속이 들어와도 서버가 죽는 경우는 예방할 수 있었습니다.

3. 실시간 백업 / 증분 백업을 하고 싶어요
Xtrabackup 을 사용하면 서버가 돌아가는 중간에도 데이터 백업을 할 수 있으며 증분 백업도 가능합니다. 저희도 아무런 문제 없이 사용 하고 있지만 백업된 데이터가 문제 없는지 확인 하는 과정이 필요합니다.
Xtrabackup 의 단점은 데이터를 통째로 바이너리 형태로만 뽑아낼 수 있다는 점입니다. 그래서 SQL 형태로 뽑아내고 싶은 경우에는 Mydumper를 추천합니다.
4. 몇백만건이 넘어가는 테이블 관리하기

하루에 수십만건씩 추가되는 테이블은 파티셔닝을 하도록 설계합니다. 용도에 따라서 다르겠지만 저희는 대체로 시간 단위로 데이터를 물리적으로 분리해서 저장합니다. 적절히만 사용해도 수십억건의 데이터 관리도 불가능 하지 않습니다.

 

5. MyISAM의 Fulltext 검색에 부하가 심해요

저희는 myisam 스토리지 엔진을 사용 하다가 여러가지 문제점 때문에Sphinx 검색엔진을 사용 하고 있습니다. 위치검색, 한글 검색, 비 텍스트 검색 모두에서 매우 빠른 성능을 보여줍니다. 게다가 확장성이 좋아서 저가 서버에 분산 배치해두었는데 로드가 거의 없었습니다.

 

6. 마스터 서버 장애 복구 솔루션은 뭐가 좋나요?

저희는 MariaDB Galera 를 검토중에 있습니다. MySQL MHA, MySQL MMM 을 사용하는것 보다 설정이 간편하고 복잡도가 줄어듭니다.DRBD와 Pacemaker/Corosync 을 이용한 방법에 비해서 쓰기 속도가 조금 떨어지지만 읽기 속도는 서버를 추가할 때 마다 높아집니다.

 

7. 데이터베이스를 모니터링 하는 좋은 방법이 뭘까요?

MONyog를 추천합니다.

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

8. 트리거(Trigger)를 사용해야 하나 말아야 하나?

요구사항 마다 다를것입니다. 저희의 경험으로는 트리거를 사용하면 굉장히 일이 편해지긴 하지만 트리거를 변경하는 해야하는 경우 삭제하고 다시 생성 해야 하는데 Lock 이 걸려서 서비스가 잠시 중단되는 문제가 있고 위에서 언급한 것 처럼 실시간으로 스키마를 변경하는데 걸림돌이 됩니다. 그래서 가능하면 저희는 어플리케이션 단에서 해결하려고 합니다.

9. 로그성 데이터 관리는?

저희는 Data-driven 방식으로 서비스를 개선해 나가고 있습니다. 그러기 위해서는 로그를 잘 쌓아야 하는데요, Google Analytics 나 Flurry를 잘만 활용하면 다양한 분석과 고객 세분화 까지 할 수가 있습니다. 그러나 자체적으로 데이터를 쌓아야 하는 경우가 있을 때는 Redis에 순차적으로 저장하고 1분에 한번씩 MySQL에 벌크로 저장합니다.

제가 생각하는 MySQL의 장점

온라인 스키마 변경, 고가용성 때문에 NoSQL을 고려한적이 많았으나 MySQL에서 해결 가능합니다. NoSQL은 숙련된 인력을 구하기 힘들기 때문에 개발 비용이 더 올라갈 수 있고 데이터 분석에 SQL 만큼 좋은 인터페이스를 가진 것이 별로 없는것 같습니다. 우리 회사에서는 개발자 아닌 사람들이 분석을 많이 하는데 SQL으로 분석하는데요 NoSQL을 사용했다면 조금 힘들지 않았을까요? 스타트업에게 MySQL 은 좋은 선택인것 같습니다.