Redshift Serverlessを使って気づいたことを書きます。
今回はトランザクションを実行した際に、RPUが消費され続けるという挙動を検知し、防ぐために実行した事例です。
対策 その1
Redshift ServerlessでRPUが消費されたままになることを検知したいできるようなモニタがしたい。
使うのはAWS上であれば、まずはCloudWatch Alarmと考えるべきである。
Redshift ServerlessのComputeCapacityに対するアラームを条件「0より大きい」で、「アラームを実行するデータポイント」をつかって設定する。
データポイントが5分単位なので、データポイントが「100/100」なら「500分間0より大きい状態が続く」となる。
あとはSNSトピックをつくってアラームと連携すれば通知が可能になる。
対策 その2
長時間トランザクションを強制的に切断することを検討する。
Redshift上で実行されているトランザクションを
・Queryし
・実行時間を確認し
・実行時間が長いものを切る。
というステップの処理を、Stepfunctions、Redshift DataAPIで実装する。
1.Stepfunctionsで以下3つの処理をつくる
-長時間トランザクションのPIDを取得する検索SQLを実行する
テーブルSVV_TRANSACTIONSからtxn_startの時刻を取得し、現在時刻とdatadiffを取得してトランザクションの実行時間を出し、それが閾値より大きいセッションのPIDをとる
実行するSQLは「"select pid from SVV_TRANSACTIONS where datediff(minute,txn_start,getdate()) > 閾値となる時間(分)"
-GetStatementResultでSQLの結果を取得(Dataapiは非同期なのでWaitしてから取得する必要がある)
-結果に含まれるPID(複数あるかもしれないので、Mapを使って処理を分岐する)について、それぞれ「 pg_terminate_backend」を実行する
2.Stepfunctionsを実行するIAMがRedshift上で使用するユーザ("IAMR:(IAMロール名称)"というユーザになる)をRedshiftにCreate Userして、"GRANT ROLE sys:superuser to (ユーザ名)"でスーパーユーザー権限を与える。(他のユーザのセッションを切るのでスーパーユーザ権限が必要)
3.1で作ったStepfunctionsをEventbridgeのスケジューラから定期実行する。(実行タイミングはどのくらいの時間の処理を切りたいか次第で調整する必要がある)
結果
上記によって、実現したい機能を実装し、実際に期待した通りに動くことを確認することができた。
が、そもそもなぜトランザクションがタイムアウトしなかったのか、という疑問は残ったままである。