2017年12月25日月曜日

年末RDSメンテナンスでハマった件

12/13~1/4で予定されているRDSのメンテナンスについてです

余計な事をした結果なのか、サンタさんからのプレゼントなのか判断できませんが、
がっちりハマったのでログを残します。
久しぶりの更新で心が痛い。

やりたかったこと:
年末年始にRDSのメンテナンスが予定されて居たため、コレを機にMySQLのマイナーバージョンアップと、Timezoneをスマートにする

できたこと:
MySQLのマイナーバージョンアップ(5.6.37になりました)

できなかったこと:
Timezoneをスマートにできなかった

何があったのか:
メンテナンスウインドウによる自動アップデートではなく、事前にメンテナンス時間を決めて、対応を行いたかったので、どうすればいいのかサポートに問い合わせたところ、
「インスタンスタイプを変更すれば今回のメンテナンス要件を満たせますよ。リブートだけじゃダメ。」
との提案をいただきました。

上記対応を完了し、少人数で動作確認を実施しサービスイン。
10分後くらいに凄まじくConnectionが滞留し、インスタンスが再起動を頻発しサービス停止・・・。

何が原因なのかサポートに問い合わせるも、いまいち原因がつかめないため、MySQLのバージョンアップ以外の要素を切り戻し、様子見すると負荷が落ち着いている。

ということで、Timezoneをストアド・プロシージャで設定する旧来の方法と、パラメータグループで設定するスマートな方法を比較して見ることにしました。

sysbenchで負荷試験を掛けてみる:
以下の3パターン
1,ストアド・プロシージャ設定有り(init_connect有り+プロシージャ残し)+Timezone設定無し
2,ストアド・プロシージャ設定有り(init_connect無し+プロシージャ残し)+Timezone設定Asia/Tokyo
3,ストアド・プロシージャ設定無し(init_connect無し+プロシージャ削除)+Timezone設定Asia/Tokyo
基本的には、パラメータグループのinit_connectの設定で、ストアド・プロシージャを呼ばないはずなので、2と3はほぼおなじ結果になるはず。

結果:
1のパターン:
SQL statistics:
    queries performed:
        read:                            13818
        write:                           3948
        other:                           1974
        total:                           19740
2,3のパターン:
    Initializing worker threads...
    FATAL: Worker threads failed to initialize within 30 seconds!
ということで、Timezoneの設定をパラメーターグループに任せた場合なぜかパフォーマンスが落ちました。

サポートにベンチ結果を含めて緊急障害でアラートを上げていますが、多分次回メンテには間に合わない気がする…。

あまり居ないとは思いますが、同じように色々と一緒に対応しようとしている人は気をつけてください。

おまけ:
今回のRDSメンテナンスでAWS側がやった作業
2017-12-25 04:17:02 Looking for 'mysql' as: /rdsdbbin/mysql/bin/mysql
2017-12-25 04:17:02 Looking for 'mysqlcheck' as: /rdsdbbin/mysql/bin/mysqlcheck
2017-12-25 04:17:02 Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/tmp/mysql.sock' '--socket=/tmp/mysql.sock' 
2017-12-25 04:17:02 Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/tmp/mysql.sock' '--socket=/tmp/mysql.sock' 
2017-12-25 04:17:02 mysql.columns_priv                                 OK
2017-12-25 04:17:02 mysql.db                                           OK
2017-12-25 04:17:02 mysql.event                                        OK
2017-12-25 04:17:02 mysql.func                                         OK
2017-12-25 04:17:02 mysql.general_log                                  OK
2017-12-25 04:17:02 mysql.general_log_backup                           OK
2017-12-25 04:17:02 mysql.help_category                                OK
2017-12-25 04:17:02 mysql.help_keyword                                 OK
2017-12-25 04:17:02 mysql.help_relation                                OK
2017-12-25 04:17:02 mysql.help_topic                                   OK
2017-12-25 04:17:02 mysql.host                                         OK
2017-12-25 04:17:02 mysql.innodb_index_stats                           OK
2017-12-25 04:17:02 mysql.innodb_table_stats                           OK
2017-12-25 04:17:02 mysql.ndb_binlog_index                             OK
2017-12-25 04:17:02 mysql.plugin                                       OK
2017-12-25 04:17:02 mysql.proc                                         OK
2017-12-25 04:17:02 mysql.procs_priv                                   OK
2017-12-25 04:17:02 mysql.proxies_priv                                 OK
2017-12-25 04:17:02 mysql.rds_configuration                            OK
2017-12-25 04:17:02 mysql.rds_global_status_history                    OK
2017-12-25 04:17:02 mysql.rds_global_status_history_old                OK
2017-12-25 04:17:02 mysql.rds_heartbeat2                               OK
2017-12-25 04:17:02 mysql.rds_history                                  OK
2017-12-25 04:17:02 mysql.rds_replication_status                       OK
2017-12-25 04:17:02 mysql.rds_sysinfo                                  OK
2017-12-25 04:17:02 mysql.servers                                      OK
2017-12-25 04:17:02 mysql.slave_master_info                            OK
2017-12-25 04:17:02 mysql.slave_relay_log_info                         OK
2017-12-25 04:17:02 mysql.slave_worker_info                            OK
2017-12-25 04:17:02 mysql.slow_log                                     OK
2017-12-25 04:17:02 mysql.slow_log_backup                              OK
2017-12-25 04:17:02 mysql.tables_priv                                  OK
2017-12-25 04:17:02 mysql.time_zone                                    OK
2017-12-25 04:17:02 mysql.time_zone_leap_second                        OK
2017-12-25 04:17:02 mysql.time_zone_name                               OK
2017-12-25 04:17:02 mysql.time_zone_transition                         OK
2017-12-25 04:17:02 mysql.time_zone_transition_type                    OK
2017-12-25 04:17:02 mysql.user                                         OK
2017-12-25 04:17:02 Running 'mysql_fix_privilege_tables'...
こういう事が「12月 25 1:19 午後 Database instance patched」の中で行われていたみたいです。

内容が全くかかれていなかったため、気になるかたはチェックしてみてください。

サポートからの連絡を待ちつつ、メリークリスマス

2017/12/26追記:
MySQL5.6.34で「3,ストアド・プロシージャ設定無し(init_connect無し+プロシージャ削除)+Timezone設定Asia/Tokyo」のベンチも取得してみた。
Timeoutにならず、ベンチが普通に完了。
SQL statistics:
    queries performed:
        read:                            8540
        write:                           2440
        other:                           1220
        total:                           12200
・・・・・・MySQL5.6.37とTimezoneのあわせ技が原因・・・?

0 件のコメント:

コメントを投稿