|
||
PostgreSQL Advent Calendar 12/2。もちろん日本時間で進行してます。
さてあまりディープな話しても仕方ないかなと思い、今話題絶頂渋谷女子高生の間でも噂になっていると言われるHeroku Postgresを早速使ってみた感想。ご存じない方のために念のため説明しておくと、HerokuがクラウドサービスとしてPostgreSQL単品で使えるサービスをこの間から提供しています。Database As A Serviceというやつか。
まずはログイン。Webサービスの方は無料から始められるけど、Postgresは最低月200ドルの有料サービスなのでクレジットカードを登録。Postgresの方とWebとでシングルサインオンです。
ログインしてデータベース作成。マジで2クリックぐらいです。できあがるとこんな感じ。
フルAjaxでさくさく動きます。データベース名やユーザ名、パスワードはランダム文字列が勝ってに割り振られますが、右上のConnection Settingの矢印からpsqlを選ぶとコピペでそのままシェルキックできる文字列を作ってくれます。ついでにJDBCやActiveRecord用文字列も作ってくれます。
SSL必須なのでソースインストールでpsql使っているようなマニアックな方はぜひ--with-opensslでビルドしなおしてください。っていうかこのオプション指定したことなかったアルよ。あ、おしゃれな六本木のお兄さんはもちろんpgAdminとかで接続してね。
psqlでログインすると何のからくりもないバニラPostgresです。\cでtemplate1にもつながります。おもむろにCREATE DATABASEすると権限がないとおこられます。\lはこんな感じ。
dv2jnpm7g28edxm=> \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------------+-----------------+----------+-------------+-------------+------------------------------------- dv2jnpm7g28edxm | uv25d4bx5cii4b0 | UTF8 | en_US.UTF-8 | en_US.UTF-8 | uv25d4bx5cii4b0=CTc/uv25d4bx5cii4b0+ | | | | | collectd=c/uv25d4bx5cii4b0 postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
9.0でDO構文使えますので
dv2jnpm7g28edxm=> do $$ declare begin raise 'hoge'; end; $$; ERROR: hoge
とかも動きました。
システムカタログもpg_authidとか以外は普通に見えるので、pg_pltemplateをのぞいてみました。
dv2jnpm7g28edxm=> select * from pg_pltemplate; tmplname | tmpltrusted | tmpldbacreate | tmplhandler | tmplinline | tmplvalidator | tmpllibrary | tmplacl ------------+-------------+---------------+------------------------+--------------------------+-------------------+-------------------+--------- plpgsql | t | t | plpgsql_call_handler | plpgsql_inline_handler | plpgsql_validator | $libdir/plpgsql | pltcl | t | t | pltcl_call_handler | | | $libdir/pltcl | pltclu | f | f | pltclu_call_handler | | | $libdir/pltcl | plperl | t | t | plperl_call_handler | plperl_inline_handler | plperl_validator | $libdir/plperl | plperlu | f | f | plperl_call_handler | plperl_inline_handler | plperl_validator | $libdir/plperl | plpythonu | f | f | plpython_call_handler | plpython_inline_handler | | $libdir/plpython | plpython2u | f | f | plpython_call_handler | plpython_inline_handler | | $libdir/plpython2 | plpython3u | f | f | plpython3_call_handler | plpython3_inline_handler | | $libdir/plpython3 | (8 rows)
ん?先日の話だと「安全じゃない(untrusted)言語なんて導入できない」とか言ってたような。
dv2jnpm7g28edxm=> create language plperl; ERROR: could not access file "$libdir/plperl": No such file or directory
なるほど。共有オブジェクト置いてないんですね。っていうかそれならpg_pltemplateからはずしとけよって気もしますが。パッケージインストールなのかな?
そのうちここにplv8jsが並ぶわけですね。わかります。
dv2jnpm7g28edxm=> create table t(a, b, c) as select i, i % 100, repeat('x', 100 + i % 100) from generate_series(1, 1000000)i; SELECT 1000000 Time: 23165.819 ms dv2jnpm7g28edxm=> select pg_size_pretty(pg_database_size('dv2jnpm7g28edxm')); pg_size_pretty ---------------- 189 MB (1 row) Time: 107.376 ms dv2jnpm7g28edxm=> select count(*) from t; count --------- 1000000 (1 row) Time: 937.279 ms
手元のMacBookでやったらCTASは4秒ぐらいで終わったのでやっぱり書き込みはちょっと遅いですね。もちろんWAL設定が手元はデフォルトなんですが。ただ参照は手元と同じぐらいかちょっと早いぐらい。キャッシュが1.7Gでテーブル作成は自由にできて参照もこのぐらい出るのならば、なんかもうこれでいいかって気がします。ていうかこれで最低ランクなんですが、最高ランクのMechaって誰が月6400ドルも払って数十ギガのキャッシュのせるのか。面白いから用意してみたって匂いがぷんぷんするw。
さてさて目玉はレプリケーション。ポチットな。
一回失敗しましたが、二回目で完成。ログもAjaxかWebSocketか知らないけどWeb画面開いたまま更新されていきます。もちろんこのFollowerも一台につき200ドル/月。
バックアップもワンクリック。リストアは新しいDBインスタンスになる模様。金稼ぐなー。バックアップのダウンロードもリンクのクリックでダウンロード始まります。形式は-Fcですね。
あ、ちなみに料金は月極の時間単位なので、11月31日の夜にDB作って早速2ドル請求が来ました。逆に言うとこうして実験してインスタンス破棄すれば200ドルもいらないわけです。ていうかこのぐらいの性能でレプリケーション、バックアップ、リストア、ログ管理等等を全く気にしなくていいとすれば、月200でサーバ+DBAなんか雇えないわけで、十分ペイする気がします。
そんなわけで長くなりましたが、Heroku Postgres使ってみました。
明日はitagaki.takahiroさんです。よろしう。
P.S.
pg_settingsをコピペしときます。興味のある人はご覧あれ。
dv2jnpm7g28edxm=> select name, setting from pg_settings; name | setting ---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------- allow_system_table_mods | off application_name | psql archive_command | test -f /etc/postgresql/9.0/main/wal-e.d/ARCHIVING_OFF || envdir /etc/postgresql/9.0/resource6279_heroku_com/wal-e.d/env wal-e wal-push %p archive_mode | on archive_timeout | 60 array_nulls | on authentication_timeout | 60 autovacuum | on autovacuum_analyze_scale_factor | 0.1 autovacuum_analyze_threshold | 50 autovacuum_freeze_max_age | 200000000 autovacuum_max_workers | 3 autovacuum_naptime | 60 autovacuum_vacuum_cost_delay | 20 autovacuum_vacuum_cost_limit | -1 autovacuum_vacuum_scale_factor | 0.2 autovacuum_vacuum_threshold | 50 backslash_quote | safe_encoding bgwriter_delay | 200 bgwriter_lru_maxpages | 100 bgwriter_lru_multiplier | 2 block_size | 8192 bonjour | off bonjour_name | bytea_output | hex check_function_bodies | on checkpoint_completion_target | 0.7 checkpoint_segments | 40 checkpoint_timeout | 300 checkpoint_warning | 30 client_encoding | UTF8 client_min_messages | notice commit_delay | 0 commit_siblings | 5 constraint_exclusion | partition cpu_index_tuple_cost | 0.001 cpu_operator_cost | 0.0005 cpu_tuple_cost | 0.003 cursor_tuple_fraction | 0.1 custom_variable_classes | DateStyle | ISO, MDY db_user_namespace | off deadlock_timeout | 1000 debug_assertions | off debug_pretty_print | on debug_print_parse | off debug_print_plan | off debug_print_rewritten | off default_statistics_target | 100 default_tablespace | default_text_search_config | pg_catalog.english default_transaction_isolation | read committed default_transaction_read_only | off default_with_oids | off effective_cache_size | 191250 effective_io_concurrency | 1 enable_bitmapscan | on enable_hashagg | on enable_hashjoin | on enable_indexscan | on enable_material | on enable_mergejoin | on enable_nestloop | on enable_seqscan | on enable_sort | on enable_tidscan | on escape_string_warning | on extra_float_digits | 0 from_collapse_limit | 8 fsync | on full_page_writes | on geqo | on geqo_effort | 5 geqo_generations | 0 geqo_pool_size | 0 geqo_seed | 0 geqo_selection_bias | 2 geqo_threshold | 12 gin_fuzzy_search_limit | 0 hot_standby | on ignore_system_indexes | off integer_datetimes | on IntervalStyle | postgres join_collapse_limit | 8 krb_caseins_users | off krb_srvname | postgres lc_collate | en_US.UTF-8 lc_ctype | en_US.UTF-8 lc_messages | en_US.UTF-8 lc_monetary | en_US.UTF-8 lc_numeric | en_US.UTF-8 lc_time | en_US.UTF-8 listen_addresses | * lo_compat_privileges | off local_preload_libraries | log_autovacuum_min_duration | -1 log_checkpoints | on log_connections | off log_destination | syslog log_disconnections | off log_duration | off log_error_verbosity | default log_executor_stats | off log_hostname | off log_line_prefix | %u [ONYX] log_lock_waits | off log_min_duration_statement | 50 log_min_error_statement | error log_min_messages | notice log_parser_stats | off log_planner_stats | off log_rotation_age | 1440 log_rotation_size | 10240 log_statement | none log_statement_stats | off log_temp_files | -1 log_timezone | UTC log_truncate_on_rotation | off logging_collector | on maintenance_work_mem | 65536 max_connections | 500 max_files_per_process | 1000 max_function_args | 100 max_identifier_length | 63 max_index_keys | 32 max_locks_per_transaction | 64 max_prepared_transactions | 500 max_stack_depth | 2048 max_standby_archive_delay | -1 max_standby_streaming_delay | -1 max_wal_senders | 10 password_encryption | on plpgsql.variable_conflict | error port | 5432 post_auth_delay | 0 pre_auth_delay | 0 random_page_cost | 4 search_path | "$user",public segment_size | 131072 seq_page_cost | 1 server_encoding | UTF8 server_version | 9.0.5 server_version_num | 90005 session_replication_role | origin shared_buffers | 53120 silent_mode | off sql_inheritance | on ssl | on ssl_renegotiation_limit | 524288 standard_conforming_strings | off statement_timeout | 0 superuser_reserved_connections | 3 synchronize_seqscans | on synchronous_commit | on syslog_facility | local0 syslog_ident | resource6279_heroku_com tcp_keepalives_count | 9 tcp_keepalives_idle | 7200 tcp_keepalives_interval | 75 temp_buffers | 1024 temp_tablespaces | TimeZone | UTC timezone_abbreviations | Default trace_notify | off trace_recovery_messages | log trace_sort | off track_activities | on track_activity_query_size | 1024 track_counts | on track_functions | none transaction_isolation | read committed transaction_read_only | off transform_null_equals | off unix_socket_group | unix_socket_permissions | 511 update_process_title | on vacuum_cost_delay | 0 vacuum_cost_limit | 200 vacuum_cost_page_dirty | 20 vacuum_cost_page_hit | 1 vacuum_cost_page_miss | 10 vacuum_defer_cleanup_age | 0 vacuum_freeze_min_age | 50000000 vacuum_freeze_table_age | 150000000 wal_block_size | 8192 wal_buffers | 1024 wal_keep_segments | 127 wal_level | hot_standby wal_segment_size | 2048 wal_sender_delay | 200 wal_sync_method | fdatasync wal_writer_delay | 200 work_mem | 102400 xmlbinary | base64 xmloption | content zero_damaged_pages | off (196 rows)
うーん。shared_buffers=53120ってことは8KBかけて400MBですね。キャッシュって何のことなんだろう。。。