On Github joohee / revealjs_mysql_options
틸리언 웹 사이트의 Mysql Connection 옵션 설정에 대해 공유합니다.
Created by joey
Replication DB 서버의 CPU 점유율이 100% 에 육박하여 정상적으로 DB 서버가 동작하지 않는 상황.
Replication DB CPU 점유율이 100%에 육박한 이유는 아직 찾지 못한 상태.1. Sleep 걸린 쿼리 강제 종료.
mysql> show processlist; 또는 mysql> select * from information_schema.processlist where command = 'Sleep'; +------+----------+--------------------+---------+---------+------+-------+------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | +------+----------+--------------------+---------+---------+------+-------+------+ | 7 | rdsadmin | localhost:23373 | NULL | Sleep | 6 | | NULL | | 5987 | tillion | 1.1.1.1:59302 | tillion | Sleep | 5 | | NULL | | 6059 | tillion | 1.1.1.1:33816 | tillion | Sleep | 383 | | NULL | | 5959 | tillion | 1.1.1.1:35629 | tillion | Sleep | 385 | | NULL | | 5998 | tillion | 1.1.1.1:36685 | tillion | Sleep | 25 | | NULL | | 6001 | tillion | 1.1.1.1:59787 | tillion | Sleep | 0 | | NULL | +------+----------+--------------------+---------+---------+------+-------+------+ mysql> kill THREAD_ID;try pressing down.
2. DB Replication Instance 교체
by Jayinteractive_timeout = 60000 wait_timeout = 60000
mysql> show variables like '%timeout%'; +-----------------------------+----------+ | Variable_name | Value | +-----------------------------+----------+ | connect_timeout | 10 | | delayed_insert_timeout | 300 | | innodb_flush_log_at_timeout | 1 | | innodb_lock_wait_timeout | 50 | | innodb_rollback_on_timeout | OFF | | interactive_timeout | 600 | | lock_wait_timeout | 31536000 | | net_read_timeout | 30 | | net_write_timeout | 60 | | rpl_stop_slave_timeout | 31536000 | | slave_net_timeout | 3600 | | wait_timeout | 600 | +-----------------------------+----------+try pressing up.
No operations allowed after connection closed.
2014-07-03 20:21:20 [ERROR]: org.springframework.transaction.interceptor.TransactionInterceptor - Application exception overridden by rollback exception org.springframework.dao.DataAccessResourceFailureException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Tomcat JDBC Connection Option - timeBetweenEvictionRunsMillis="7200000"
timeBetweenEvictionRunsMillis=5*60*1000 // Idle 커넥션 체크를 하는 주기 minEvictableIdleTimeMillis=5*60*1000 // Idle 커넥션 객체를 체크할 때 이 최소 Idle유지 시간이 지난 것들만 체크함. 기본값 30분 numTestsPerEvictionRunsMillis=20 // Idle 커넥션 체크 시 테스트 할 커넥션의 수. 기본값 3
initialSize=10 maxActive=70 maxIdle=20 testWhileIdle=true timeBetweenEvictionRunsMillis=5*60 *1000 // Idle 커넥션 체크를 하는 주기 minEvictableIdleTimeMillis=5*60*1000 // Idle 커넥션 객체를 체크할 때 이 최소 Idle유지 시간이 지난 것들만 체크함. 기본값 30분 numTestsPerEvictionRunsMillis=20
initialSize=10 – 커넥션 풀을 생성하는 시점에 만들어지는 초기 커넥션 수. maxActive=70 – 풀에서 할당할 수 있는 최대 액티브 커넥션 개수. mysql server에서 설정한 커넥션 수에 맞게 커넥션 수를 제한하기 위해 쓰인다. 참고로 서버의 my.cnf에 설정되어 있는 최대 커넥션 수 (maxActive+maxIdle) maxIdle=20 – 커넥션 풀에서 항상 유지되어야 하는 대기 커넥션의 최대값. 주기적으로 대기 커넥션에 대해 체크하며 minEvictableIdleTimeMillis값 보다 큰 커넥션은 릴리즈된다. testWhileIdle=true - 대기 커넥션에 대해 체크하겠다는 의미. minIdle=default – 커넥션 풀에서 지되어야 할 대기 커넥션의 최소값. 유효한 쿼리 수행에 실패하면 커넥션 풀 안의 커넥션 수는 이 숫자보다 줄어들 수 있다. timeBetweenEvictionRunsMillis = 300000 – 대기 커넥션의 유효성 체크 및 청소하는 쓰레드가 수행되는 주기값. (ms) 이 값은 1초 이하로 내려가면 안된다. 대기 상태이거나 버려진 커넥션을 얼마나 자주 체크할 지, 대기 커넥션을 얼마나 자주 검증할 지를 결정한다. minEvictableIdleTimeMillis = 300000 – 정리 대상이 되기 전에 풀 안에서 대기 상태로 있을 수 있는 최소 시간값. 이 시간 이상 대기 상태에 있던 커넥션이 eviction 대상이 되고, minIdle/maxIdle 개수를 검토하여 유효하지 않으면 버려진다. numTestsPerEvictionRunsMillis=20 - 대기 커넥션에 대해 테스트 할 때 한 번에 수행할 커넥션 수.http://www.codingpedia.org/ama/tomcat-jdbc-connection-pool-configuration-for-production-and-development/
connect_timeout=10 # mysqld 와 mysql client 가 연결(connection)을 맺기 위해서 mysqld 가 연결 패킷을 기다리는 최대 시간입니다. interactive_timeout=600 # interactive모드에서의 timeout값. # mysqld 와 mysql client 가 연결을 맺은 다음, 다음 쿼리까지 기다리는 최대 시간을 의미합니다. wait_timeout=600 # interactive 모드가 아닐 때, 다시 말해 API를 이용한 client program 모드일 때의 timeout값. # mysqld 와 mysql client 가 연결을 맺은 후, 다음 쿼리까지 기다리는 최대 시간을 의미합니다. # wait_timeout 까지 아무런 요청(쿼리)이 없으면 연결은 취소되고 그 결과는 Aborted_clients 에 누계됩니다.
By Joey