From b74181eeea94bac03f180866d1abd4a63e8e7429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 21 Mar 2019 13:05:03 +1100 Subject: [PATCH] Added aws_aurora_replicas_skipped_during_query aws_aurora_replicas_skipped_during_query is a status variable for better monitoring behavior due to replication lag in AWS Aurora Also fixed lag computing in connection pool --- include/MySQL_HostGroups_Manager.h | 2 +- include/MySQL_Thread.h | 2 ++ lib/MySQL_HostGroups_Manager.cpp | 16 +++++++++------- lib/MySQL_Thread.cpp | 23 ++++++++++++++++++++++- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 2d7685c3b..c933e8726 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -384,7 +384,7 @@ class MyHGC { // MySQL Host Group Container MySrvList *mysrvs; MyHGC(int); ~MyHGC(); - MySrvC *get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_lag_ms); + MySrvC *get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_lag_ms, MySQL_Session *sess); }; class Group_Replication_Info { diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index b6fef27c3..ceea8e688 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -247,6 +247,7 @@ class MySQL_Thread unsigned long long unexpected_packet; unsigned long long killed_connections; unsigned long long killed_queries; + unsigned long long aws_aurora_replicas_skipped_during_query; unsigned int active_transactions; } status_variables; @@ -513,6 +514,7 @@ class MySQL_Threads_Handler unsigned long long get_max_connect_timeout(); unsigned long long get_unexpected_com_quit(); unsigned long long get_unexpected_packet(); + unsigned long long get_aws_aurora_replicas_skipped_during_query(); unsigned long long get_killed_connections(); unsigned long long get_killed_queries(); iface_info *MLM_find_iface_from_fd(int fd) { diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 3268ec577..bdbe9d2a2 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -2190,7 +2190,7 @@ void MySQL_HostGroups_Manager::push_MyConn_to_pool_array(MySQL_Connection **ca, wrunlock(); } -MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_lag_ms) { +MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_lag_ms, MySQL_Session *sess) { MySrvC *mysrvc=NULL; unsigned int j; unsigned int sum=0; @@ -2210,9 +2210,11 @@ MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_ } } else { if (max_lag_ms >= 0) { - if (max_lag_ms <= mysrvc->aws_aurora_current_lag_us/1000) { + if (max_lag_ms >= mysrvc->aws_aurora_current_lag_us/1000) { sum+=mysrvc->weight; TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } else { + sess->thread->status_variables.aws_aurora_replicas_skipped_during_query++; } } else { sum+=mysrvc->weight; @@ -2256,7 +2258,7 @@ MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_ } } else { if (max_lag_ms >= 0) { - if (max_lag_ms <= mysrvc->aws_aurora_current_lag_us/1000) { + if (max_lag_ms >= mysrvc->aws_aurora_current_lag_us/1000) { sum+=mysrvc->weight; TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); } @@ -2299,7 +2301,7 @@ MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_ } } else { if (max_lag_ms >= 0) { - if (max_lag_ms <= mysrvc->aws_aurora_current_lag_us/1000) { + if (max_lag_ms >= mysrvc->aws_aurora_current_lag_us/1000) { sum+=mysrvc->weight; TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); } @@ -2336,7 +2338,7 @@ MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_ } } else { if (max_lag_ms >= 0) { - if (max_lag_ms <= mysrvc->aws_aurora_current_lag_us/1000) { + if (max_lag_ms >= mysrvc->aws_aurora_current_lag_us/1000) { New_sum+=mysrvc->weight; New_TotalUsedConn+=len; } @@ -2379,7 +2381,7 @@ MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid, int max_ } } else { if (max_lag_ms >= 0) { - if (max_lag_ms <= mysrvc->aws_aurora_current_lag_us/1000) { + if (max_lag_ms >= mysrvc->aws_aurora_current_lag_us/1000) { New_sum+=mysrvc->weight; } } else { @@ -2486,7 +2488,7 @@ MySQL_Connection * MySQL_HostGroups_Manager::get_MyConn_from_pool(unsigned int _ wrlock(); status.myconnpoll_get++; MyHGC *myhgc=MyHGC_lookup(_hid); - MySrvC *mysrvc=myhgc->get_random_MySrvC(gtid_uuid, gtid_trxid, max_lag_ms); + MySrvC *mysrvc=myhgc->get_random_MySrvC(gtid_uuid, gtid_trxid, max_lag_ms, sess); if (mysrvc) { // a MySrvC exists. If not, we return NULL = no targets conn=mysrvc->ConnectionsFree->get_random_MyConn(sess, ff); if (conn) { diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index c533c341e..38c71f9ac 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -3813,6 +3813,7 @@ MySQL_Thread::MySQL_Thread() { status_variables.unexpected_packet = 0; status_variables.killed_connections = 0; status_variables.killed_queries = 0; + status_variables.aws_aurora_replicas_skipped_during_query = 0; match_regexes=NULL; @@ -4321,6 +4322,12 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_GlobalStatus(bool _memory) { pta[1]=buf; result->add_row(pta); } + { // AWS Aurora replicas skipped during query + pta[0]=(char *)"aws_aurora_replicas_skipped_during_query"; + sprintf(buf,"%llu",get_aws_aurora_replicas_skipped_during_query()); + pta[1]=buf; + result->add_row(pta); + } { // killed connections pta[0]=(char *)"mysql_killed_backend_connections"; sprintf(buf,"%llu",get_killed_connections()); @@ -5126,7 +5133,8 @@ MySQL_Connection * MySQL_Thread::get_MyConn_local(unsigned int _hid, MySQL_Sessi // c=(MySQL_Connection *)cached_connections->remove_index_fast(i); if (max_lag_ms >= 0) { - if (max_lag_ms >= (c->parent->aws_aurora_current_lag_us / 1000)) { + if (max_lag_ms < (c->parent->aws_aurora_current_lag_us / 1000)) { + status_variables.aws_aurora_replicas_skipped_during_query++; continue; } } @@ -5289,6 +5297,19 @@ unsigned long long MySQL_Threads_Handler::get_unexpected_packet() { return q; } +unsigned long long MySQL_Threads_Handler::get_aws_aurora_replicas_skipped_during_query() { + unsigned long long q=0; + unsigned int i; + for (i=0;istatus_variables.aws_aurora_replicas_skipped_during_query,0); + } + } + return q; +} + unsigned long long MySQL_Threads_Handler::get_killed_connections() { unsigned long long q=0; unsigned int i;