가끔 서버를 운영하다 보면 MySQL 서버가 과부하를 먹고 다운되는 (죽는) 현상이 있습니다. 이런 Server crushing 현상은 여러가지 원인이 있지만 일차적으로는 MySQL 서버 자체가 Enterprise 급을 대상으로 만들어진 DBMS 는 아니라는 것에 그 원인이 있습니다. 최대한 막을 수 있는 방법은 Connection pool 을 관리하는 Middleware를 만든 방법이 좋을 것 같습니다. 하지만 현재로서는 그런 middleware 에 관한 얘기가 없는 형편입니다.
그리고 또 다른 한가지 서버가 폭주하는 경우는 MySQL 의 concurrency control 이 미약한 때문에 발생하는 문제입니다. 이것은 많은 테이블로 많은 접속자가 있을 경우 흔히 겪게 되는 문제입니다.
하나의 테이블을 다른 사용자가 사용중일 때 또 다른 사용자가 같은 테이블에 대해서 접속을 요청하면 이것이 한두사람일때는 그럭저럭 견디는데 그 접속 사용자가 늘다 보면 엄청난 서버 오버로딩이 발생합니다.
이것을 해결하려면 TABLE LOCK 이라는 것을 이용하는 겁니다. 오픈 시키는 테이블에 대해서 먼저 LOCK 을 걸어 두고 Query 를 처리하고, Query 처리가 끝나면 다시 Table 을 unlock 시키고 이런 방법을 사용하면, 동시에 두사람이 사용하지는 못하지만 최소한 이런 폭주부분은 상당히 막을 수 있습니다. 참고로 하시기 바랍니다. 이것을 응용하면 semaphore table 을 하나 만들어 보는 것도 좋은 방법인것 같습니다.
|