ラベル RDS の投稿を表示しています。 すべての投稿を表示
ラベル RDS の投稿を表示しています。 すべての投稿を表示

2015/12/23

PostgreSQLのネットワークアドレス型と外部モジュールip4r

このエントリーをはてなブックマークに追加
この記事は PostgreSQL Advent Calendar 2015 の22日目の記事です(代打)。
最近、Amazon RDS for PostgreSQLで、ip4rというEXTENSIONが使えるようになったみたいですが、ip4rって初めて聞いたので簡単に調べてみました。

ip4rとは

ipという名前から連想されるように、ipアドレスやipアドレスの範囲を格納するデータ型です。
このモジュールを入れることで、下記の5つのデータ型を利用できるようになります。
  • ip4 :IPv4のアドレス格納用のデータ型
  • ip4r:IPv4のアドレスレンジ格納用のデータ型
  • ip6:IPv6のアドレス格納用のデータ型
  • ip6r:IPv6のアドレスレンジ格納用のデータ型
  • ipaddress :IPv4 or IPv6のアドレス格納用のデータ型
  • iprange :IPv4 or IPv6のアドレスレンジ格納用のデータ型

ネットワークアドレス型との比較

PostgreSQLには、ネットワークアドレス型がサポートされており、inet型、cidr型というものを使うことで、IPv4, IPv6にIPアドレス、アドレスレンジを格納できます。
「ip4rって何のためにできたの?」と気になった方も多いかと思いますが、ip4rのページに下記のように書いてありました。

While PostgreSQL already has builtin types 'inet' and 'cidr', the authors of this module found that they had a number of requirements that were not addressed by the builtin type. Firstly and most importantly, the builtin types have no support for index lookups of the form (column >>= parameter), i.e. where you have a table of IP address ranges and wish to find which ones include a given IP address. This requires an rtree or gist index to do efficiently, and also requires a way to represent IP address ranges that do not fall precisely on CIDR boundaries. Secondly, the builtin inet/cidr are somewhat overloaded with semantics, with inet combining two distinct concepts (a netblock, and a specific IP within that netblock). Furthermore, they are variable length types (to support ipv6) with non-trivial overheads, and the authors (whose applications mainly deal in large volumes of single IPv4 addresses) wanted a more lightweight representation.
つまり、乱暴に言うと下記の通りでしょうか。
  1. ビルトインのネットワークアドレス型では、(column >>= parameter)という演算子での検索にインデックスが利用できない(これが重要らしい)
  2. ひとつのデータ型に意味を込め過ぎている(inetには、アドレスレンジとアドレスレンジ内の単一のIPアドレスを格納可能で、IPv4,IPv6ともにサポートされている)

確かに、IPv4のアドレスだけ管理したいような時は、inet型やcidr型だと、CHECK制約とかで回避しないといけないので、無駄なコストになりそうですね。

注意しなければいけない点としては、ip4rで利用できる関数とビルトインのネットワークアドレス型で利用できる関数の差でしょうか。
ビルトインのネットワーク型で利用できるすべての関数と同様のものが、ip4rにあるわけではなさそうです。

ちなみに最初に書いた通り、ip4rはAmazon RDS for PostgreSQLでもサポートされていまして、RDSでは
CREATE EXTENSION ip4r;
とやるだけで利用できるので、試すのも楽ちんでした。
IPアドレスの管理をしたい方は、ぜひ一度ネットワークアドレス型なりip4rを試してみてください。 簡単ではありますが、こちらからは以上です。
このエントリーをはてなブックマークに追加

2014/06/13

RDS(PostgreSQL)でJSTを使う たった1つの冴えたやり方

このエントリーをはてなブックマークに追加

@j3tm0t0 さんのRDS(MySQL)でJSTを使う たった1つの冴えたやり方という記事があったので、「PostgreSQLも!」ということで、RDS for PostgreSQLでJSTを使う方法をブログにまとめようと思います。
このように書くと、RDS使うから特別なことが必要のように見えますが、普段PostgreSQLを使っている場合と同じ設定でOKです。
ただし、RDSを使用する場合、直接postgresql.conf(パラメータ設定ファイル)を編集できないので、DB Parameter Groupsを使用します。

1. RDS for PostgreSQLのデフォルト設定

Amazon RDS for PostgreSQLのシステム標準設定タイムゾーンはUTCです。
デフォルト設定のままPostgreSQLを立ち上げると下記のように表示されます。
$ date
2014年 6月13日 金曜日 13時32分42秒 JST
$ psql -h postgres.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U postgres -c "SELECT CURRENT_TIMESTAMP"
Password for user postgres: 
              now              
-------------------------------
 2014-06-13 04:32:50.531748+00
(1 row)


2. JSTを使うには

2-1. DB Parameter Groupsによる設定

RDSでは、DB Parameter Groupsを使用することで、パラメータの設定が可能です。



PostgreSQL用のDB Parameter Groupsを作成し、設定項目中のTimezoneを「UTC」から、「Asia/Tokyo」と変更することで、JSTを使用できます。

2-2. RDS起動時にDB Parameter Groupsを割当

DB Parameter Groupsを作成したら、あとは起動時にそれを選ぶだけです。
(Rebootが必要ですが、起動中のRDSでもDB Parameter Groupsの変更が可能です。)



この設定を行ったRDSで試すと、下記のようにJSTで現在時刻が取得できますよー。
$ date
2014年 6月13日 金曜日 13時55分19秒 JST
$ psql -h postgres.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U postgres -c "SELECT CURRENT_TIMESTAMP"
Password for user postgres: 
              now              
-------------------------------
 2014-06-13 13:55:25.306856+09
(1 row)

以上!

このエントリーをはてなブックマークに追加