Memo/AmazonWebServices/RDS

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/RDS
 

RDS


ログの分析


スナップショットをS3へエクスポート


RDS proxy: コネクションプールを提供

アプリケーションとRDSデータベースの間の仲介役。
Lambda等のアプリ側で、コネクションプールや自動フェイルオーバー機能を持ってない場合等。


SSL/TLS接続

  • 注意点
    • SSL/TLS接続は使っていないつもりでも、内部的にチェックをしていて問題がでるケースがある。->更新しよう
    • 放置しても rds-ca-2019 へは自動更新されなかった
  • SSL/TLS接続数の確認方法が不明
    • global variableでは、Ssl_accepts 等は取れなかった
      mysql -ureadonly -p -h rds.example.com -e "show global variables like 'ssl_%'\G;"
      *************************** 1. row ***************************
      Variable_name: ssl_ca
              Value: /rdsdbdata/rds-metadata/ca-cert.pem
      *************************** 2. row ***************************
      Variable_name: ssl_capath
              Value:
      *************************** 3. row ***************************
      Variable_name: ssl_cert
              Value: /rdsdbdata/rds-metadata/server-cert.pem
      *************************** 4. row ***************************
      Variable_name: ssl_cipher
              Value: EXP1024-RC4-SHA:EXP1024-DES-CBC-SHA:AES256-SHA:AES128-SHA:DES-CBC3-SHA:DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:RC4-SHA:RC4-MD5:EXP-RC4-MD5:NULL-SHA:NULL-MD5:DES-CBC3-MD5:DES-CBC-MD5:EXP-RC2-CBC-MD5:RC2-CBC-MD5:EXP-RC4-MD5:RC4-MD5:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:ADH-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:ADH-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:EXP-KRB5-RC4-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:KRB5-RC4-MD5:KRB5-DES-CBC-MD5:ADH-RC4-MD5:EXP-ADH-RC4-MD5:DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-DES-CBC-SHA:EXP-KRB5-RC4-SHA:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:KRB5-RC4-SHA:KRB5-DES-CBC-SHA:ADH-DES-CBC-SHA:EXP-ADH-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA
      *************************** 5. row ***************************
      Variable_name: ssl_crl
              Value:
      *************************** 6. row ***************************
      Variable_name: ssl_crlpath
              Value:
      *************************** 7. row ***************************
      Variable_name: ssl_key
              Value: /rdsdbdata/rds-metadata/server-key.pem
  • awscliのバージョンが新しくないと、「--no-certificate-rotation-restart」が存在しない
    aws --version
    aws-cli/1.18.21 Python/2.7.15 Linux/4.4.0-18362-Microsoft botocore/1.15.21
  • SSL/TLSを使用しておらず、RDSの再起動をしたくない場合
    profile=example
    region=ap-northeast-1
    db_instance_id=db01
    
    aws rds modify-db-instance \
     --db-instance-identifier $db_instance_id \
     --ca-certificate-identifier rds-ca-2019 \
     --no-certificate-rotation-restart \
     --apply-immediately \
     --profile $profile \
     --region $region

トラブルシューティング


Storage Auto Scaling: ストレージの自動拡張

  • Storage Auto Scalingの条件
    • DBInstanceClass: db.m4, db.t2以上。db.m3等の古いインスタンスタイプはサポートされない。
    • StorageType: gp2, io. standardはサポートされない。
      aws rds describe-orderable-db-instance-options \
      --engine mysql \
      --engine-version 5.6.44 \
      --vpc \
      --profile example \
      --region ap-northeast-1 > rds.mysql.5.6.44.json
      
      cat rds.mysql.5.6.44.json | jq -r '.OrderableDBInstanceOptions[] | [.DBInstanceClass, .StorageType, .SupportsStorageAutoscaling] | @tsv' | sort
  • max-allocated-storage を 1TB区切りにしたい場合
    storage=30
    echo $(( ($storage / 1000) * 1000 + 1000 ))
    1000

PostgreSQL


セキュリティ


パフォーマンスチューニング


監査ログ


ストレージタイプの変更


ClassicからVPCへ移行


VPC上のRDSにElasticIPを付与

VPC上のRDSは名前解決すると、プライベートIPになるため、VPC以外からアクセスできない。
ElasticIPをVPC上に取得し、それをRDSに付与する事で外部からでもアクセスできる。


DBエンジンのアップグレード

  • MySQL 5.5から5.6へのアップグレード
    • ダウンタイムはMultiAZ:falseで約6時間。trueで約35分。read replicaを使えばよりダウンタイムを短く出来る
    • Instance type: m3.medium / DB size: 50GB
    • mysql5.5のread replicaの作成:約10分
    • storage typeをstandardからgp2へ変更:約2時間
    • mysql5.6から5.6へのアップグレード:約3時間 (m3.largeだと約35分)
    • read replicaをmasterへ昇格:1分
    • 古いRDS IDを適当に変更。新しいRDS IDを古いRDSと同じにする

タイムゾーンの変更

  • パラメータグループの「time_zone」に「Asia/Tokyo」を入れる事ができるようになっている。2016-01-26現在
  • init_connectを変更していた場合、空にはできないのでダミーの値をいれる

レストア


オンプレミスのMySQLからRDSへの移行

  • MySQL replicationが以下で失敗する場合
     Slave_IO_Running: Connecting
    Slave_SQL_Running: Yes
    • VPCの場合、セキュリティグループで、Outboundが「all traffic, all, all, 0.0.0.0/0」になっている事を確認する。terraformでやると記述が無ければ消してしまう。

サービス停止する変更

  • MultiAZが前提だが、サービス停止する場合としない場合がある
  • サービス停止する
    • インスタンスタイプの変更。5分程度のサービス断が起こる
    • ストレージタイプの変更(standard => gp2等)。2分程度のサービス断が起こる
  • サービス停止しない
    • ストレージ容量の拡大。1時間30分程度かかる。

Automated Snapshotが出来ない

  • AWS supportの回答では、「日時バックアップ(Backup Window)の開始前の直近にバックアップが行われた場合、通常行われる日時バックアップがスキップされることがある」
    • 緊急のminor version upgradeされたときに、Automated Snapshotがスキップされた。

デフォルトのmax_connectionsはメモリサイズによって変わる

Management Consoleで任意の値に変更可能

  • max_connections:{DBInstanceClassMemory/12582880}
    t1.micro: 34 connections ($0.035)
    m1.small: 150 connections ($0.115)
    m1.large: 640 connections ($0.455)
    m1.xlarge: 1263 connections ($0.920)
    m2.xlarge: 1441 connections ($0.655)
    m2.2xlarge: 2900 connections ($1.315)
    m2.4xlarge: 5816 connections ($2.630)

mysqldump --all-databasesでAccess Deniedになる場合

  • --all-databasesオプション付きでダンプしようとすると、「Access Denied」になる。これはRDSのユーザが全ての権限を持っておらず、アクセスできないDBがあるため。
  • --skip-lock-tables を付けると良い
    /usr/bin/mysqldump -uUSER -pPASS \
     --single-transaction --default-character-set=utf8 --hex-blob \
     --all-databases --skip-lock-tables \
     -h localhost > /path/to/mysql.`date +%Y%m%d`.sql

RDS起動直後は status=available になっても接続できない場合がある

  • スクリプト等で status=available に変わるのをチェックして、接続しに行くもエラーになる事がある。AWSプレミアムサポートの回答は"仕様"との事。3分以上かかるのは希だと。mysqlコマンドで接続チェックしたほうが良さそうだ
  • しばらく待機するbashスクリプト
    wait_connection() {
    	local db_host=${1:-"127.0.0.1"}
    	local db_user='root'
    	local max_wait_sec=180 # AWS premium support answers
    	local wait_sec=10
    	local mysqladmin=/usr/bin/mysqladmin
    	local start_sec=$SECONDS
    	local end_sec=$SECONDS
    
    	if [ -f "$mysqladmin" ]; then
    		while [ $(( $end_sec - $start_sec )) -le $max_wait_sec ]; do
    			$mysqladmin ping -u $db_user -h $db_host > /dev/null 2>&1
    			if [ $? == 0 ]; then
    				break
    			fi
    			sleep $wait_sec
    			end_sec=$SECONDS
    		done
    	else
    		sleep $max_wait_sec
    	fi
    	return 0
    }

ARN

  • Amazon Relational Database Service - Amazon Web Services(PDF)
    arn:aws:rds:<region>:<account number>:<resoucetype>:<name>
    • リージョン:オレゴン、アカウント:001234567890、 DB Instance Name:mysql-db だけ操作可能なARN
      arn:aws:rds:us-west-2:001234567890:db:mysql-db
    • リージョン:バージニア、アカウント:001234567890、DB Snapshot Name:my-snapshot2 だけ操作可能なARN
      arn:aws:rds:us-east-1:001234567890:snapshot:my-snapshot2
    • リージョン:東京、アカウント:001234567890、DB Instance Name:example_YYYYMMDD, だけ操作可能なARN。(ドキュメントの通りにやってもうまく制限できなかった)
      arn:aws:rds:ap-northeast-1:001234567890:db:example_*

テーブル圧縮


Zabbixで監視


RDS slow log/クエリログの有効化

  • RDSはsshで接続できないのでログを直接みる事ができない。~AWS Management ConsoleおよびAmazon RDS APIを使うとできるようになった。
  • パラメータグループで「log_output = TABLE」を有効にするとTABLEに出力される
  • mysql.general_log : 全てのクエリを記録
    • test_param_group に対して、「general_log:ON」
      rds-modify-db-parameter-group test_param_group -p "name=general_log, value=1, method=immediate"
    • 直近10件の取り出し
      echo "select * from mysql.general_log order by event_time desc limit 10;" \
       | mysql --default-character-set=utf8 -u root -p -h mydb.xxxxx.ap-northeast-1.rds.amazonaws.com mysql
  • mysql.slow_log : スロークエリのみ記録
    • ManegementConsoleからはslow_query_logは数分後に変更されたが、long_query_timeはすぐには変更されなかった。
    • test_param_group に対して、「スローログの記録:ON」、「3秒以上かかるクエリの記録」、「10000行以上を対象にするクエリを記録」。数分で適用
      rds-modify-db-parameter-group test_param_group -p "name=slow_query_log, value=1, method=immediate"
      rds-modify-db-parameter-group test_param_group -p "name=long_query_time, value=3, method=immediate"
      rds-modify-db-parameter-group test_param_group -p "name=min_examined_row_limit, value=10000, method=immediate"
    • 確認
      mysql -uroot -p -h mydb.xxxxx.ap-northeast-1.rds.amazonaws.com mysql
      SHOW global VARIABLES LIKE 'slow_query_log';
      SHOW global VARIABLES LIKE 'long_query_time';
      SHOW global VARIABLES LIKE 'min_examined_row_limit';
    • 直近10件のslow logの取り出し
      echo "select * from mysql.slow_log order by start_time desc limit 10;" \
       | mysql --default-character-set=utf8 -u root -p -h mydb.xxxxx.ap-northeast-1.rds.amazonaws.com mysql
  • ログのクリア。deleteでは削除できないため、用意されているプロシージャを使う。「general_log_backup, slow_log_backup」にリネーム、その後Drop tableされる。
    CALL mysql.rds_rotate_general_log;
    CALL mysql.rds_rotate_slow_log;

タグの取得

  • api-tool
    • REGION:ap-northeast-1
    • ACCOUNT NO:1234567890
    • DBInstanceIdentifier:sample
      rds-list-tags-for-resource "arn:aws:rds:ap-northeast-1:1234567890:db:sample"
      TAG  Name  sample
      TAG  var1  hoge1

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-03-25 (水) 15:50:29 (11d)