前回の日記で述べたとおり、herokuは、無料では、格納できるデータのサイズが5Mに制限されています。
一時的にサイズが大きくなっても、しばらくは使えるようですが、長い間放置しておくと、
アカウント登録したメールアドレス宛に「サイズがでかいから有料プランに移行してね」という旨の
メールが来るらしいです。ここでは、データサイズの監視、管理方法について述べます。
なお、ここでは、herokuにあるWebアプリがruby on railsで動き、ActiveRecordが使える状態であることを前提とします。
現在のデータサイズの詳細を確認するために、herokuのコンソールを起動させます。
railsでは、DBに記録したセッションは、明示的に削除しない限り、どんどん溜まっていきます。
なので、データサイズを肥大化させないためには、不必要なセッションを削除していく必要があります。
以下のコマンドを、heroku consoleから実行します。
実行後、再びデータサイズを調べると、セッションに関係する行数(rows)が減っていることが確認できます。
なお、この時点では、データサイズ(bytes)は変化しません。
postgresqlの場合、一度増えたデータサイズは、VACUUMコマンドで明示的に減らす必要があります。
なお、heroku infoで表示されるサイズは、集計するのに一定の時間が必要らしく、データの削減はすぐには反映されません。1~2日置いてから、再度、コマンドで確認してください。
herokuには、一定時間毎にコマンドを実行するcronの仕組みがあるので、セッション削除のコマンドをcronに組み込むことができれば、運用が楽になるかもしれません。
一時的にサイズが大きくなっても、しばらくは使えるようですが、長い間放置しておくと、
アカウント登録したメールアドレス宛に「サイズがでかいから有料プランに移行してね」という旨の
メールが来るらしいです。ここでは、データサイズの監視、管理方法について述べます。
なお、ここでは、herokuにあるWebアプリがruby on railsで動き、ActiveRecordが使える状態であることを前提とします。
現在のデータサイズの詳細を確認するために、herokuのコンソールを起動させます。
>heroku console以下のコマンド(長っ)を打ち込みます。
>> ActiveRecord::Base.connection.select_all("SELECT relname, relkind, to_char(reltuples, '999,999,999') as rows, to_char(pg_relation_size(relname), '999,999,999,999') as bytes FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');").each{|i| puts "#{i['relname'].ljust(30)}#{i['bytes'].rjust(15)}bytes#{i['rows'].rjust(10)}rows"}テーブルごとに、サイズとレコード数が出てきます。
schema_migrations 8,192bytes 14rows'session'と名のつくテーブルが、かなり肥大化しているのが分かります。
unique_schema_migrations 16,384bytes 14rows
users_id_seq 8,192bytes 1rows
sessions_pkey 2,793,472bytes 119,110rows
entries_pkey 40,960bytes 874rows
...
sessions 21,970,944bytes 119,110rows
index_sessions_on_session_id 9,682,944bytes 119,110rows
index_sessions_on_updated_at 2,834,432bytes 119,110rows
railsでは、DBに記録したセッションは、明示的に削除しない限り、どんどん溜まっていきます。
なので、データサイズを肥大化させないためには、不必要なセッションを削除していく必要があります。
以下のコマンドを、heroku consoleから実行します。
>> CGI::Session::ActiveRecordStore::Session. delete_all(["sessions.updated_at < ?", 3.days.ago])上記の例では、3日前のセッションを削除しています。
>> ActiveRecord::Base.connection.select_all("REINDEX TABLE sessions")
実行後、再びデータサイズを調べると、セッションに関係する行数(rows)が減っていることが確認できます。
なお、この時点では、データサイズ(bytes)は変化しません。
postgresqlの場合、一度増えたデータサイズは、VACUUMコマンドで明示的に減らす必要があります。
これで、サイズが削減されたはずです。
>> ENV['DATABASE_URL']
=> "postgres://xxxxxxxx:yyyyyyyyyyyyyyyy@zzzzzzzzz/xxxxxxxx" (←xxxxxxxxがデータベース名)
>> ActiveRecord::Base.connection.select_all("select pg_size_pretty(pg_database_size('xxxxxxxx'))") (←xxxxxxxxはデータベース名を指定)
>> ActiveRecord::Base.connection.select_all("VACUUM FULL") (←VACUUM処理)
>> ActiveRecord::Base.connection.select_all("select pg_size_pretty(pg_database_size('xxxxxxxx'))") (←データサイズ減少を確認)
なお、heroku infoで表示されるサイズは、集計するのに一定の時間が必要らしく、データの削減はすぐには反映されません。1~2日置いてから、再度、コマンドで確認してください。
herokuには、一定時間毎にコマンドを実行するcronの仕組みがあるので、セッション削除のコマンドをcronに組み込むことができれば、運用が楽になるかもしれません。