opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

pgBadgerを使ってみた

pgBadgerなるPostgreSQLログ解析ツールがあることを知ったので使ってみた。

環境

PostgreSQL 9.4.1 (on Docker)
OS: ArchLinux

PostgreSQLを構築したコンテナのBASEイメージはcentos:7(あんまり関係ない)で、これは先日作成した自作のイメージ。最近Dockerhubにあげて"opamp/postgres"でdocker pullできるけど個人用なので完成度はあしからず。
Docker上で動かして入るが、PGDATAディレクトリもログのディレクトリもホスト(ArchLinux)上に存在しているので直接動かしてるのとあんまり変わらない。

pgBadgerのインストール

ArchLinuxならAURから利用可能。

$ yaourt -S pgbadger

現時点でバージョン7.0だった。
インストール先は"/usr/bin/vendor_perl/pgbadger"となる。

postgresql.confの設定

解析するために、logの出力を設定する必要がある。今回はstderr形式でlogファイルに書き出している。

今回設定した内容を簡単に書く...

log_min_duration_statement = 0
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0

それと、log_messageのロケーションは当然英語にしておく必要がある。

ログを解析してみる

設定後に生成されたログファイルを適当にpgbadgerコマンドに読み込ませて解析してみる。

$ /usr/bin/vendor_perl/pgbadger --prefix '%t [%p]: [%l-1] user=%u,db=%d ' /path/to/postgresql.log

f:id:opamp_sando:20150520005411p:plain

生成したばっかりなのでほとんど何もかかれてないが、生成されたout.htmlはこんな感じ。

参考資料

http://dalibo.github.io/pgbadger/

http://pgsqldeepdive.blogspot.jp/2012/12/pgbadgersql.html

https://www.postgresql.jp/document/9.4/html/runtime-config-logging.html

Debian8でdockerを使う

debian8でdockerを使うメモ。

以下のコマンドでインストールできるようだ。

curl -sSL https://get.docker.com/ | sh

dockerユーザーへの追加は以下のようにする

gpasswd -a username docker

これでできた。

参考資料

http://linuxconfig.org/package-docker-io-has-no-installation-candidate-debian-jessie

PostgreSQLのDockerfileを作った

PostgreSQL 9.4.1のDockerfileを作った。

https://github.com/opamp/postgres

普通ならDockerfileでVOLUMEとかPORTとか指定するところだが、これはdocker-composeで割り当てるの前提で一切書いてない。

PORTについて

ポートはPostgresデフォルトの5432ポートを使うので、5432を外部のポートのどこかに結びつければ良い感じ。

  ports:
    - "5432:5432"

VOLUMEについて

うちのDockerベースのサーバー群は昔からログをDockerに拾わせないで、ホストの/var/log/docker以下当たりに分けて入れるようにしていたので、このDockerfileもログをファイルに出力するようにしてみた。

なので、VOLUMEに指定すべきディレクトリはログを入れておくディレクトリと、PGDATAになるディレクトリ。なのでうちでは次のようにしている。

  volumes:
    - /var/log/docker/postgresql:/var/log/pg_log
    - /var/lib/postgresql:/var/lib/postgresql

ENVIRONMENTについて

公式postgresイメージはユーザーも指定できるが、私の技術力がないばっかりに初回起動時にユーザーが存在しなければ作成して云々というのを書きたくなかった書けなかったので、ユーザーはデフォルトの"postgres"ユーザーを使う。
したがって、指定できるのはパスワードのみ。

  environment:
    - POSTGRES_PASSWORD=hogepiyo

ちなみにデフォルト値は"postgres"になっている。
パスワードはinitdbが走った場合のみ設定されるようになっているので、すでにinitdb済みのPGDATAがVOLUMEでマウントされている場合には全く意味がない。
つまりはじめての起動時のみ設定されるので、それ以降変えても全く効果がない。

終わりに

公式のpostgresを使っていたらコンテナを作成するたびにVOLUMEのディレクトリがinitdb済みであってもinitdbし直す仕様のようで、データを全部消し飛ばされてしまったので自作した次第。
(まあデータは定期バックアップがあるしそもそもそんなに大規模には使ってないので傷は浅いんですが)

Dockerhubには多分あげないので、もし私の作ったへっぽこイメージを使いたいという奇特な方はgithubから落として、docker-composeでbuildしてください(もちろん何かあっても責任は取れませんが)。
最後に私が実際にこのイメージを使う時のdocker-compose.ymlの記載を載せます。もちろんパスワードとかは変えてます。

それと、postgresの設定を変えたければイメージをビルドする前にpgconfigの中にある設定ファイルを書き換えるか、ビルド後に生成されたPGDATA内のファイルを直接編集するといいと思います。

postgres:
  build: postgres/
  ports:
    - "5432:5432"
  volumes:
    - /var/log/docker/postgresql:/var/log/pg_log
    - /var/lib/postgresql:/var/lib/postgresql
  environment:
    - POSTGRES_PASSWORD=yoruhasizukanisitekudasai

リモートなmercurialリポジトリを作る2

昨日作ったリモートなmercurialリポジトリを少し改善して、リポジトリの作成、削除、一覧をローカルから1コマンドで見れるようにしてみた。

リモートのmercurialユーザーにシェルスクリプトを配置

やることは簡単でローカルマシンからリモートのユーザーでコマンドを実行させるだけ。

setenv HG_REPO $HOME/repo

という具合にリポジトリのディレクトリをtcshrcか何かに書いておく。
とりあえず3つほどシェルスクリプトを書いたのでそれをmercurialユーザーのPATHが通ってる場所に配置。今回は$HOME/local/binに配置してPATHを通した。

setenv PATH $HOME/local/bin:$PATH

リポジトリを作るcreaterepoコマンドを作る

#!/bin/tcsh

if($#argv != 1) then
    echo "invalie argument"
    exit 1
endif

set PROJECT_NAME=$1

if(-d $HG_REPO/$PROJECT_NAME) then
    echo "Already exists"
else
    mkdir $HG_REPO/$PROJECT_NAME && hg init $HG_REPO/$PROJECT_NAME
    echo "[hooks]\nchangegroup = hg update >&2" > $HG_REPO/$PROJECT_NAME/.hg/hgrc
    echo "Finsihed"
endif

リポジトリを削除するdeleterepoコマンドを作る

実際にはいきなり消すと間違う可能性があるので、バックアップディレクトリに圧縮して待避させるというコマンド。

#!/bin/tcsh

set TARGET=$HG_REPO/$1
set BACKUP=$HOME/backup/removed #バックアップ先

if($#argv != 1) then
    echo "invalid argument"
    exit 1
endif

if(-d $TARGET) then
      cd $HG_REPO
      if(-f $BACKUP/$1-backup.tar.bz2) then
    rm -f $BACKUP/$1-backup.tar.bz2
      endif
      tar cfj $BACKUP/$1-backup.tar.bz2 $1 &&rm -fr $1
      echo "Finished"
else
      echo "$1 repository doesn't exist"
endif

リポジトリの一覧を表示するだけのlsrepo

#!/bin/tcsh

ls $HG_REPO

ローカルから呼び出せるようにする

sshコマンドは、指定したコマンドを実行させることができるが、毎回sshを打っていては長いのでこちらもスクリプト化して見る。

#!/bin/tcsh

set KEY_FILE=$HOME/.ssh/id_ecdsa # remoteのmercurialユーザーの鍵
set DOMAIN="hostname.here.com"
set PORT=22

if($#argv < 1) then
    echo "input error"
else
    ssh -i $KEY_FILE -l mercurial -p $PORT $DOMAIN $argv[*]
endif

このファイルをPATHを通して、hgrepoとか適当な名前を付けて保存する。
そうすると、ローカルユーザーから以下のようにして呼び出せる。

$ hgrepo lsrepo
$ hgrepo createrepo agepoyo
$ hgrepo deleterepo agepoyo

これでターミナルでリポジトリの作成、削除も可能になった。

終わりに

個人的にはシェルスクリプトtcshが書きやすいと思う。

リモートなmercurialリポジトリを作る

昔mercural-serverを使ってremoteなmercurialリポジトリを作ったような気がするが、その時のサーバー環境も記憶も残ってないので今回は素のmercurialsshだけで作ってみた。
要はここでやってることをmercurialでもやってみよう的な。

リモートに専用ユーザーを作る

別に自分の今のユーザーを使っても良いが、念のため専用ユーザーを作った。

$ sudo useradd -m -g users -G users -d /home/mercurial mercurial  
$ sudo passwd mercurial

鍵を登録する

アクセスするローカルマシンで鍵を作る

$ ssh-keygen -t ecdsa

publicキーを先ほど作ったmercurialユーザーのautohirized_keysに追加する。

$HOME/.ssh/configに追記
hostnameはサーバーのホスト名に

Host hostname.here.com
    User mercurial
    Hostname hostname.here.com
    Port 22
    Identityfile ~/.ssh/id_ecdsa #さっき作ったprivateキー
    TCPKeepalive yes

リモートマシンで空のリポジトリを作る

WebのUIなんてないので、リモートのいちいちログインしてリポジトリを作らなければならない。
今回はリポジトリは全部mercurialユーザーのホーム以下のrepoの中に入れることを想定

[mercurial user]$ mkdir -p ~/repo/test-repo
[mercurial user]$ cd ~/repo/test-repo
[mercurial user]$ hg init .

mercurialにはgitのbareがないので、hgrcに以下を追記する必要がある。

[mercurial user]$ emacs .hg/hgrc
[hooks]
changegroup = hg update >&2

clone / pushしてみる

ローカルに戻ってclone pushしてみる。

$ hg clone ssh://hostname.here.com/repo/test-repo

cloneできるなら成功。

$ touch README
$ hg add .
$ hg commit -m "test commit"
$ hg push

pushできたら成功

終わりに

プロジェクトの作成をする時とかめんどくさいと思うなら、ちょっと工夫すれば自動化できそうだと思った(小並感)。
多人数開発には向かないが、個人でプライベートなリポジトリを建てるときはこの方が効率的かもしれない。

続きを書いた

参考資料

http://qiita.com/rerofumi/items/3ffc39dfd6a30be5a711

http://takuya-1st.hatenablog.jp/entry/20110501/1304262598

久々にdocker環境周りの大掃除をしたよ

うちのサーバーが半ば放置状態だったので大掃除した。うちのサーバーはサービスの大半がDockerで動いてるので、それはつまりDocker周りの大掃除をしたということ・・・

opamp/archlinuxを変更してみた

base/archlinuxが全然更新されないことを理由に"nfnty/arch-mini"をベースにしてみた。というか、その時opamp/archlinuxをBuildしたらコケたからこれは早急にbaseのイメージを変えねばと思った次第。

base/archlinuxのdockerhubのコメントで、「これ全然更新こないんだけど」に対して「週1で更新してるうちのを使ってよ!」みたいなテンションで書いてあるのを見つけたのでなんとなくこれにしてみた。

ただちょっとした問題があって、このイメージbase/archlinuxの数分の一ととても小さいイメージなのは良いけど、あまりにも何も入ってなさすぎて原因不明の事故に見舞われることが多い。
ArchLinuxはbaseに含まれるパッケージはインストール時に必ず入ってるよね的な雰囲気があるのか、baseに含まれるパッケージをあえて依存関係に書かないパッケージが多いようだ。それが原因でコケるんだけどどのパッケージがなくてコケてるのかわからないということが多い。

例えば、apacheも原因不明のクラッシュを起こしてたけどbaseを入れるように書いてあげると動いたし、yaourtもbaseなしだと実行時エラーを起こしたのでopamp/archlinuxではそのへんを解決してある。

とりあえずopamp/archlinuxは一般ユーザーuserとyaourtを含む主に自分用のベースイメージとして使ってるけどまだ改善の余地がありそう。とりあえずbaseのうちいくつかはおそらく入れておくべきなんだと思うが、どれを入れれば良いかというのがいまいちわかってない。

figからdocker-composeに

遅すぎる感あるけど、ようやくdocker-composeに移行。移行は簡単でyaourtからdocker-compose入れて、fig.ymlをdocker-compose.xmlに改名すれば大体動くと思う。

fig upで作られるイメージ名が共通なのかはしれないが、イメージやコンテナを再生成する必要はなかった。

その他

その他postgresqlコンテナを追加したり、minecraftサーバーのコンテナのjavaバージョンを挙げたりと細かいところをいろいろいじった。

あ、それとgithubのMyDockerfilesのsimple-redmineを現在のopamp/archlinuxベースに更新した。それとredmineのバージョンを3.0.2にしてみた。gollumの方はまだ。

割と時間がかかった・・・orz

zshでvi操作したときにESCの反応が遅い

zshとかをviキーバインドで操作した時、ESCの反応が遅い なんてときは次のように設定ファイルに書くと良い

KEYTIMEOUT=1

多分単位はミリ秒で、デフォルト値は40になってる。

参考資料

http://www.johnhawthorn.com/2012/09/vi-escape-delays/

Firefox ブラウザ無料ダウンロード