1.需求
1.1. 故障描述
【故障现象】DRDS经常通过JDBC会连接超时,但是当时DRDS负载及连接数都不高。
【故障频率】2017年7月1日开始正式使用这套系统
(一)2017年7月8日下午2点到4点之间又出现连接超时现象。具体报错见下图。
(二)2017年7月9日全天都有问题。报错日志还没有提供
【联系方式】
联系人1:
联系人2:
【系统权限】
【报错日志】
20170708报错:
20170709报错:
1.2. 信息获取
【架构信息】
【监控信息】
其中一台后端RDS
【参数配置】
auto_increment_increment = 1
auto_increment_offset = 1
back_log = 3000
binlog_cache_size = 2048KB
binlog_checksum = CRC32
binlog_row_image = full
binlog_stmt_cache_size = 32768
character_set_server = utf8
concurrent_insert = 1
connect_timeout = 10
default_storage_engine = InnoDB
default_time_zone = SYSTEM
default_week_format = 0
delayed_insert_limit = 100
delayed_insert_timeout = 300
delayed_queue_size = 1000
delay_key_write = ON
div_precision_increment = 4
eq_range_index_dive_limit = 10
explicit_defaults_for_timestamp = false
ft_min_word_len = 4
ft_query_expansion_limit = 20
group_concat_max_len = 1024
innodb_adaptive_hash_index = ON
innodb_additional_mem_pool_size = 2097152
innodb_autoinc_lock_mode = 1
innodb_concurrency_tickets = 5000
innodb_ft_max_token_size = 84
innodb_ft_min_token_size = 3
innodb_large_prefix = OFF
innodb_lock_wait_timeout = 50
innodb_max_dirty_pages_pct = 75
innodb_old_blocks_pct = 37
innodb_old_blocks_time = 1000
innodb_online_alter_log_max_size = 134217728
innodb_open_files = 3000
innodb_print_all_deadlocks = OFF
innodb_purge_batch_size = 300
innodb_purge_threads = 1
innodb_read_ahead_threshold = 56
innodb_read_io_threads = 4
innodb_rollback_on_timeout = OFF
innodb_stats_method = nulls_equal
innodb_stats_on_metadata = OFF
innodb_stats_sample_pages = 8
innodb_strict_mode = OFF
innodb_table_locks = ON
innodb_thread_concurrency = 0
innodb_thread_sleep_delay = 10000
innodb_write_io_threads = 4
interactive_timeout = 7200****
key_cache_age_threshold = 300
key_cache_block_size = 1024
key_cache_division_limit = 100
log_queries_not_using_indexes = OFF
long_query_time = 1
loose_max_statement_time = 0
loose_rds_indexstat = OFF
loose_rds_max_tmp_disk_space = 10737418240
loose_rds_tablestat = OFF
loose_rds_threads_running_high_watermark = 50000
loose_tokudb_buffer_pool_ratio = 0
low_priority_updates = 0
max_allowed_packet = 1024M
max_connect_errors = 100
max_length_for_sort_data = 1024
max_prepared_stmt_count = 16382
max_write_lock_count = 102400
myisam_sort_buffer_size = 262144
net_read_timeout = 30
net_retry_count = 10
net_write_timeout = 60
open_files_limit = 65535
performance_schema = OFF
query_alloc_block_size = 8192
query_cache_limit = 1048576
query_cache_size = 3145728
query_cache_type = 0
query_cache_wlock_invalidate = OFF
query_prealloc_size = 8192
rds_reset_all_filter = 0
slow_launch_time = 2
sql_mode =
table_definition_cache = 512
table_open_cache = 2000
thread_stack = 262144
tmp_table_size = 2097152
transaction_isolation = READ-COMMITTED
wait_timeout = 86400
|
2. 分析
id |
时间 |
报错信息 |
详细内容 |
1 |
2017-07-08 14:44:52 |
mysql.jdbc.exceptions.jdbc4.ConnectionException |
conmunication link fail |
2 |
2017-07-08 15:51:08 |
mysql.jdbc.exceptions.jdbc4.MysqlNonTransientConnectionException |
the server has been shutdown |
客户截图中的两个报错信息
RDS 默认设置连接超时时间的参数有两个:
【wait_timeout = 86400】
【interactive_timeout = 7200】
【wait_timeout\interactive_timeout】值为mysql在关闭一个交互式/非交互式的连接之前所要等待的时间。建议不需要设置太长的时候,否则会占用实例的连接数资源。
分别为24小时和2小时,同一时间,这两个参数只有一个起作用。到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用wait_timeout。如果应用程序的连接超过24小时没有新的动作,那么RDS就会断开此连接。
【故障原因】
原因可能性有:
drds url连接有问题;
应用端连接闲置超时而被 MySQL 断开
3. 解决方案
第一原因需要客户等再次出现的时候再观察一下url连接是否有效。我这边也发工单给阿里了。
第二个原因的解决建议如下。
建议:
1)数据库层:将wait_timeout值设为最大259200
2)应用开发层:减少连接池内连接的生存周期,使之小于上一项中所设置的 wait_timeout 的值;或者定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。
例如:
参考:
https://help.aliyun.com/knowledge_detail/41714.html
https://help.aliyun.com/document_detail/51475.html?spm=5176.doc29668.6.624.QJeTt1