Tillion Mysql Connection Configuration – 첫 번째 해결 – 추가 옵션



Tillion Mysql Connection Configuration – 첫 번째 해결 – 추가 옵션

0 0


revealjs_mysql_options


On Github joohee / revealjs_mysql_options

Tillion Mysql Connection Configuration

틸리언 웹 사이트의 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 Jay

3. timeout 관련 값 수정

interactive_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/

Server Configuration

					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 에 누계됩니다.
				

The End

By Joey