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を試してみてください。 簡単ではありますが、こちらからは以上です。
このエントリーをはてなブックマークに追加

2015/02/07

eclipse使ってGoを書く(Macから)

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

コンソールからviで書くのもいいんですが、eclipseでGoが書けるみたいなので設定を行ってみました。
ちなみに、Mac上のeclipseです。
また、Eclipseは既にインストールしている前提で話を進めてます。

環境

OS: Mac OS X
Eclipse: Kepler(4.3)
Go: 1.4.1

Eclipseの設定(Goclipseのインストール)

1.  [ヘルプ]-[新規ソフトウェアのインストール]をクリック

2. 「作業対象」に「http://goclipse.googlecode.com/svn/trunk/goclipse-update-site/」を入力して[追加]をクリックして、「リポジトリーの追加」ダイアログが出てくることを確認
3. 「名前」に任意の名前を入力し、[OK]をクリック

4. 3で入力した名前にチェックを入れ、[次へ]をクリック
5. 以降、ウィザードに従って[次へ]進んだり、ライセンスに同意したりしてインストールを実行
6. インストール終了後、eclipseが再起動することを確認
7. 再起動後、[Eclipse]-[環境設定]をクリック

8. [実行]をクリックし、「GOROOT」にgoをインストールしたPathを入力。
(Eclipseを日本語化すると、"Go"が「実行」と訳されるらしい…orz)

9. [ファイル]-[新規]で、「Goプロジェクト」が作成できるようになっていれば、完了。

オートコンプリートのセットアップ

せっかくEclipseを使うので、オートコンプリート機能(コード補完)を有効にしてみます。
gitをインストールしていない場合、https://code.google.com/p/git-osx-installer/からインストールする必要があります。
そして、ターミナルから下記のように実行するだけです。
go get -u github.com/nsf/gocode

後は、Eclipseを再起動して確認してみてくださいー
何はともあれ以上です。
このエントリーをはてなブックマークに追加

Get gtarted with Go

このエントリーをはてなブックマークに追加
AWS SDK for Go が出るなんてニュースもあったので、一度は触ってみたかったGoに触れることにしました。

環境

OS: Mac OS X
Go: 1.4.1

Goのインストール

インストールは非常に簡単で、コチラに置いてあるインストーラーが簡単に出来ました。
インストールが成功したかどうかは、下記のようなコマンドで確認できます。

$ go version
go version go1.4.1 darwin/amd64

何はともあれHello World

プログラミング

viなどで、下記のように書きます。
package main

import "fmt"

func main() {
 fmt.Println("Hello World!")
}

  • 構文の意味
    • package: ソースファイルの管理単位を指定(Javaなどと同じ)。このプログラムはmainパッケージに属することを宣言。mainパッケージはプログラム実行時にはじめに呼び出されるmain関数を持つ特別なpackage。
    • import:他のパッケージを使用することを宣言(Javaなどと同じ)。
    • func:関数の宣言。
      • fmt.Println:fmtパッケージのPrintln関数を実行。

フォーマットを整える

下記のコマンドで、フォーマットを整えることができます(これはコード規約考えたり、コードの可読性のことを考えたりしたときに嬉しい。特にプロジェクトやる人にとってはきっと)。


$ go fmt helloWorld.go

コンパイル

下記のコマンドで、コンパイルが可能です。

$ go build helloWorld.go

コンパイルが終わったら、実行してみます。
$ ./helloWorld
Hello World!

ちなみに下記のように実行することも可能です。

$ go run helloWorld.go 
Hello World!

とりあえず、Goの第一歩ということで以上。



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

2015/01/31

第31回(仮名)PostgreSQL勉強会に参加してきました!

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

いつになったら、(仮名)がとれるのか気になっている江川(@daiti0804)です。
1/31(土)に行われた第31回(仮名)PostgreSQL勉強会に参加してきました!


今回は、PostgreSQLの勉強会にも関わらず、MySQLの話も聞けちゃうお得な回になりました。知らないことを知るのは新鮮で楽しいですねー。
また、@nuko_yokohamaさんが中国地方DB勉強会にてご登壇。というわけで、まとめてくれる人がいなそうなのもあり、以下、本日のメモ書きをば。ちなみに少し遅刻しました。ごめんなさい。

MySQLのロックについて - Oracle ACE 平塚貞夫(sh2)氏

  • Oracle DB, PostgreSQLと対比させつつ、MySQLのロックの話を。
  • InnoDBでは、不可解なデッドロックが起きることがある(トランザクション分離レベルが"RepeatbleRead"のときの話)。
  • MySQLのつらいとこ
    1. ギャップロックで、コードとレコードの間がロックされるとこ
      • 「MySQLのギャップロックで泣いたことある人RT #jpug_study #俺はブチ切れたことがある」(@soudai1025)
    2. 合致したレコードではなく、走査したレコードに対してロックを取得するとこ
      • 「MySQLは操作したレコードにロックをかけるので、実行計画によってロック範囲が変わる! これは厳しいな・・ 」(@kasa_zip
  • READ COMMITEDを使いましょう
    • 「私、READ COMMITED普及委員会の人なので」
    • READ COMMITEDにしておけば、ギャップロック発生しない
    • 空振りでもギャップロックとらない
  • まとめ

プラクティカルなPostgreSQLチューニング - 喜田 紘介氏 (株アシスト)

  • 出だし、プラクティカルな映画の話して、会場が静まった気がするw
  • チューニングの種類
    • DBチューニング:パラメータチューニングetc
    • SQLチューニング:SQL修正、統計情報の調整etc
  • DBチューニング
    • キャッシュヒット率をあげよう、ディスクI/Oを減らそう
      • →OSが出してくれる情報を監視することが重要
    • 基本はパラメータ設定(postgresql.conf)!
      • アクセスデータ範囲をshared_buffersに収める
        • shared_buffers: 物理メモリの25〜40%程度
      • WAL生成のタイミングを知る。WALバッファがいっぱいになって、ディスクに書きにいくことを避ける
        • wal_buffers:16MB以上(推奨32MB)(旧バージョンの場合。最近のバージョンでは自動調整)
      • ディスクソートの発生を避ける
        • work_mem:SET文でセッションごとに適切な値を
          • trace_sortパラメータを有効にし、ログ出力からディスクソートがあったかを確認!
      • チェックポイント間隔の調整
        • クラッシュリカバリ時に許容できる時間を元に調整
        • checkpoint_segments:16個以上
        • checkpoint_timeout: 30分以上
      • VACUUM処理の調整
    • DBチューニングとっておきのツール!!
      •  pg_statsinfo:PostgreSQL統計情報収集/可視化ツール(9.4対応済み)
  • SQLチューニング
    • 実行時間が長いSQLが、レスポンス要件を満たすように改善!
    • ログ出力から実行時間の長いSQLを確認
      • log_min_durations:SQLの実行時間をログに記録
      • auto_explain:自動的に遅い文の実行計画をログに記録するcontribモジュール
    • 実行計画をよく見ましょう
      • PostgreSQLの計画タイプを覚えておきましょう!(@surumegohan)
      • たまに、nest_loop をoffって、巨大テーブルの結合をHash join or Merge join に倒して、バッチ系のチューニングをすることがありますね(@kasa_zip)
      • pg_hint_planなんてものもある
    • 高速化が期待される機能
    • PostgreSQL9.4での改善
      • WALロックの改善
      • hugepageへの対応
      • JSONB
      • GINの軽量・高速化
      • pg_prewarm
      • auto.conf
    • 堀川さんの質問:「shared_buffersを極端に多くすると、メモリ管理のオーバーヘッドが大きくなるので、注意と言っていたが、なぜ?」→「OS(Linux)の従来のページを扱うため、RDBMS側で多くのページ管理をすることにより、CPU負荷があがることがあるため。ただし、PostgreSQL9.4からLinuxのhugepageをサポートする!」

NTT データと PostgreSQL が挑んだ総力戦・カンファレンスで話せなかった裏話 - 笠原 辰仁氏 (NTTデータ)

  • まずは、PostgreSQLカンファレンス基調講演のダイジェスト
    • 今回は、某Web記事で講演してなかった人みたいになっていた@kasa_zipさんが一人で話すみたい。
    • エネルギー元売会社の情報系システム
      • 販売情報などをもとに、集計などをほぼリアルタイムで行う
      • OSSメイン & 拡張機能フル活用:商用システム初適用のものも
    • 大量SQLの死守
      1. SQLガイドライン
      2. SQLチェックツール:シンタックスチェック。
        • ブラウザでSQL書くと、 「XXだからNG」みたいなのが出る
      3. 実行計画チェックツール:EXPLAINをチェック!
        • 統計情報を偽装するのに、pg_dbms_statsを拡張して使用
        • 開発環境用に統計上をすげ替えて環境整えるとかDBエンジニア思いつくことすごいな。(@cstyles_jp)
      4. アジリティSQLチューニング
        • pg_hint_planを使用:単体テストのやり直ししなくていいので楽だった
      5. SQL書き換え
  • 今日の本題
    • SEGVでPostgreSQLが落ちた
      • コード解析した結果、pg_dbms_statsが誤った統計情報を返していた
      • pg_dbms_statsの内部については、スライド上がったらリンク貼る
        • 本番稼働前に発覚したのが奇跡っぽいw(@yancya)
    • SELECT結果が違う
    • 根本原因を特定することが重要!
      • PostgreSQLのコードには親切なREADMEやコメントがあるので、助けに
      • コミュニティも力になってくれる!
  • ソースがあれば何とかなる

さて、飲み会に行ってくる!

懇親会
  • うぇーい
  • @fujii_masaoさんが育休中という話から、家庭生活話へ。
    • たなけんさんの「子ども二人目できると大変」だわー
    • 結婚のときに色々な契約をコミットするとツラいわー
    • 陰でこそっと言われるのツラいわー
    • 一馬力ツラいわー
    • とりあえず自由なのが一番
  • サポートではまるとツラいわー
  • JPUGなお話
    • マニュアル翻訳に対して、もう少し力入れた方がいいかなー
    • すそ野を広げる意味でも、初心者向け本やDB一般本の中でPostgreSQLを例にとるもの出したら
    • PostgreSQL徹底入門、そろそろ新版出した方がよいのでは?
    • 理事の若返りが求められる
  • pg_bigmPGroongaのお話
  • textsearch_jaというか、形態素解析は需要ありますよー
  • 60歳越えてもコード書くのか論
  • 「ビールとソーセージ作って暮らしたいわー」(by @kasa_zipさん)
  • JPUG合宿を熱海でやるから来てねー(by @kkkida_twtrさん)
  • すき焼きー


次回は5月。久しぶりになにか話したくなってきたー




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