InfiniBand概要(勉強中)
データベースのディスクI/Oを改善するとの話題の中で、
「InfiniBand」という単語を耳にしたが、全く知らないの調べてみる。
1. InfiniBand(いんふぃにっとばんど)概要
2000年に業界団体であるInfiniBand Trade Associationによって策定された規格。
スーパーコンピューティングなどの分野で使われているサーバ間データ通信技術の1つ。
イーサネットによるLAN間接続よりも高速であるため、最近注目を集めている。
(10Gbpsイーサネットと比較すると、高速であり、価格も安い?
10Gb/s、20Gb/s、40Gb/s、56Gb/s等が存在する。)
補足:
オラクルの「Oracle Exadata Database Machine」等にはInfiniBandスイッチが内蔵されている。
2. InfiniBand接続を構成する要素
構成する要素は以下のとおり。
a. サーバ側に実装するカードであるHCA(Host Channel Adapter)
b. スイッチングを行うInfiniBandスイッチ
c. スイッチとHCAを接続するInfiniBandケーブル
3. InfiniBandのプロトコル
a. IPoIB(IP over InfiniBand): TCP/IPを使いながらInfiniBandの高速性が生かせる
# 通常のTCP/IPシステムと同じようにシステムを構築可能
b. SRP(SCSI RDMA Protocol): 同じくメモリ空間を直接異なるシステム間で共有するRDMA(Remote Direct Memory Access)機構を使いストレージ向けに提供されるプロトコル
c. iSER(iSCSI Extentions for RDMA):
d. NFS-RDMA(NFS over RDMA):
参考URL
http://www.atmarkit.co.jp/fnetwork/tokusyuu/51ib01/02.html
http://www.mellanox.co.jp/infiniband/
http://itpro.nikkeibp.co.jp/article/Active/20130423/472843/?ST=act-infra&P=2
PostgreSQL9.3インストール
PostgreSQLインストールメモ(バージョン 9.3)
最新バージョンの9.3をインストールする。
環境 バージョン
CentOS 6.4
PostgreSQL 9.3.0
1.環境準備
1.1.make
# gmake --version
GNU Make 3.81
1.2.gcc
インストールされていることを確認
# gcc -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
1.3. Readline
Readlineライブラリをインストール
# yum install readline
# yum install readline-devel
2.PostgreSQLインストール
2.1.postgresユーザ作成
# useradd postgres
2.2.ソースの入手と解凍
# cd /usr/local/src/
# wget http://ftp.postgresql.org/pub/source/v9.3.0/postgresql-9.3.0.tar.gz
# mkdir postgresql-9.3.0
# chown -R postgres:postgres postgresql-9.3.0*
# su - postgres
$ cd /usr/local/src
$ tar xvzf postgresql-9.3.0.tar.gz
2.3.コンパイル
$ cd postgresql-9.3.0/
$ ./configure
$ gmake world ※
(省略)
PostgreSQL, contrib, and documentation successfully made. Ready to install.
※ドキュメント(HTMLやman)や追加モジュール(contrib)を含め、構築可能なもの全てを構築したい場合、上記の様に実施
2.4.リグレーションテスト
$ gmake check
(省略)
=======================
All 136 tests passed.
=======================
(省略)
2.5.インストール
$ su
# gmake install-world
(省略)
PostgreSQL, contrib, and documentation installation complete.
2.6.インストールディレクトリの所有者変更
# cd /usr/local/
# chown -R postgres:postgres pgsql/
2.7.postgresユーザの環境変数設定
# su - postgres
$ vi .bash_profile
(下記を設定)
# PostgreSQL PATH
export POSTGRES_HOME=/usr/local/pgsql
export PGDATA=/home/postgres/data
export PATH=$PATH:$POSTGRES_HOME/bin
export PGLIB=/usr/local/pgsql/lib
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export
2.7.postgresユーザの環境変数設定読み込み
$ source .bash_profile
2.8.データベースクラスタの作成
$ initdb -E UTF8 --no-locale
2.9.PostgreSQL起動
$ pg_ctl start
server starting
1$ LOG: database system was shut down at 2013-09-10 01:15:40 JST
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
これでPostgreSQL9.3の新機能を試すことができる。
とりあえず、9.3 新機能 pg_isreadyコマンドを確認
$ pg_isready
/tmp:5432 - accepting connections
以上
shoes(+ruby)の環境構築
rubyのUIツールキットshoesをインストールした。
環境
OS:CentOS 6.4
ruby:ruby 1.9.3
1.gitのインストール
# yum intall git
2.shoesのインストール
# yum install -y giflib-devel cairo-devel libpixman-devel pango-devel libjpeg-devel gtk2-devel libcurl-devel ruby-devel portaudio-devel gcc libxml2 libxml2-devel libxslt libxslt-devel sqlite-devel sqlite bundle install # cd /usr/local/src/ # cd /usr/local/src/shoes/ # gem install bundler # bundle install # rake
rakeコマンドが成功していらば、以下のディレクトリ配下にdistディレクトリが作成される。
3.shoueの動作確認
# sh /usr/local/src/shoes/dist/shoes
参考URL
https://github.com/shoes/shoes/wiki/Building-Shoes-on-Linux
shoesは以下の本に紹介されていた。
- 作者: Sau Sheong Chang,瀬戸山雅人,河内崇,高野雅典,橋本吉治
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/04/26
- メディア: 大型本
- この商品を含むブログ (4件) を見る
PostgreSQL世代バックアップスクリプト
#/bin/sh
# ログ出力関数の読み込み
# log.fncは別途作成してください。
. log.fnc
# ログ出力
LOG "pgbackup_day.shの実行開始"
# pg_basebackupコマンド
PG_BACKUPCMD=/usr/local/pgsql/bin/pg_basebackup
# PostgreSQLデータベースクラスタ
PGDATA=/home/postgres/data
# アーカイブログ格納ディレクトリ
PGARCHIVEDIR=/home/postgres/data/pg_archivelog
# 実行された曜日の取得
DAY=`date +%w`
# echo ${DAY}
# ベースバックアップ格納ディレクトリ
BACKUP_DIR=/home/postgres/backup${DAY}/
#アーカイブログ削除関数
archivelog_del()
{
PG_ARCHIVEDEL=/usr/local/pgsql/bin/pg_archivecleanup
OLDESTKEPTWAL=`grep file ${BACKUP_DIR}/backup_label | cut -f 6-6 -d ' ' | cut -f 1 -d ')'`
OLDESTKEPTWAL=`ls ${PGARCHIVEDIR}/${OLDESTKEPTWAL}.*.backup | xargs -i basename {}`
${PG_ARCHIVEDEL} ${PGARCHIVEDIR}/ ${OLDESTKEPTWAL}
return 0
}
# 曜日別のベースバックアップ格納ディレクトリの初期化
if test -d ${BACKUP_DIR}
then
# アーカイブログの削除
archivelog_del
LOG "ベースバックアップ格納ディレクトリ内を削除"
rm -rf ${BACKUP_DIR}/*
else
LOG "ベースバックアップ格納ディレクトリを作成"
mkdir -p ${BACKUP_DIR}
fi
# ベースバックアップの取得
LOG "ベースバックアップの取得"
${PG_BACKUPCMD} -D ${BACKUP_DIR} -h localhost -p 5432 -c fast -X f
#ログ出力
LOG "pgbackup_day.shの実行完了"
exit 0
PostgreSQLインストールメモ(バージョン 9.2)
PostgreSQLをインストールした際のメモ
環境 バージョン
CentOS 6.4
PostgreSQL 9.2.4
1.環境準備
1.1.make
バージョンが3.8以上であることを確認
# gmake --version
GNU Make 3.81
1.2.gcc
インストールされていることを確認
# gcc -v
1.3. Readline
Readlineライブラリをインストール
# yum install readline
# yum install readline-devel
2.PostgreSQLインストール
2.1.postgresユーザ作成
# useradd postgres
2.2.ソースの入手と解答
# su - postgres
$ cd /usr/local/src/
$ wget http://ftp.postgresql.org/pub/source/v9.2.4/postgresql-9.2.4.tar.gz
$ tar xvzf postgresql-9.2.4.tar.gz
2.3.コンパイル
$ cd postgresql-9.2.4/
$ ./configure
$ gmake world
(省略)
PostgreSQL, contrib, and documentation successfully made. Ready to install.
※ドキュメント(HTMLやman)や追加モジュール(contrib)を含め、構築可能なもの全てを構築したい場合、上記の様に実施します
2.4.リグレーションテスト
$ gmake check
(省略)
=======================
All 131 tests passed.
=======================
(省略)
2.5.インストール
$ su
# gmake install-world
(省略)
PostgreSQL, contrib, and documentation installation complete.
2.6.インストールディレクトリの所有者変更
# cd /usr/local/
# chown -R postgres:postgres pgsql/
2.7.postgresユーザの環境変数設定
# su - postgres
$ vi .bash_profile (下記を設定)
# PostgreSQL PATH
export POSTGRES_HOME=/usr/local/pgsql
export PGDATA=/home/postgres/data
export PATH=$PATH:$POSTGRES_HOME/bin
export PGLIB=/usr/local/pgsql/lib
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export
2.7.postgresユーザの環境変数設定読み込み
$ source .bash_profile
2.8.データベースクラスタの作成
$ initdb -E UTF8 --no-locale
2.9.PostgreSQL起動
$ initdb -E UTF8 --no-locale
以上
PostgreSQLでHINT句が使えるらしい!!
こんばんは。
pg_hint_planというモジュールがリリースされたみたいなので、インストールしてみました!!
----pg_hint_planのドキュメント抜粋----
pg_hint_planの概要
PostgreSQLはコストベースオプティマイザを採用しており、SQL文と統計情報を元に可能なアクセスパスのコストを見積もり、最もコストの低い実行計画を選択します。オプティマイザは可能な限りよい実行計画を作成使用としますが、カラム間の相関関係などは考慮しないため、複雑なクエリでは常に最適なプランが選択されるとは限りません。pg_hint_planを用いると、ヒントを記述したブロックコメントをSQL文の前に加えることで、SQL文やGUCパラメータを変更することなく実行計画を制御することができます。
--------
インストール手順
1.ソースのダウンロード
http://en.sourceforge.jp/projects/pghintplan/releases/
2. tarボールを解凍
$ tar xvzf pg_hint_plan.tar.gz
3.インストール
$ cd pg_hint_plan
$ make USE_PGXS=1 PG_CONFIG=/usr/local/pgsql/bin/pg_config
$ make USE_PGXS=1 PG_CONFIG=/usr/local/pgsql/bin/pg_config install
4.pg_hint_planのロード
$ vi $PGDATA/postgresql.conf
(以下を追加)
shared_preload_libraries = 'pg_hint_plan'
5.PostgreSQL再起動
$ pg_ctl restart
waiting for server to shut down.... done
server stopped server starting
$ [2013-02-05 23:49:03.032 JST][00000][19777] LOG: loaded library "pg_hint_plan"
HINT句を使用してみた。
・HINT句を使用しない場合
=# EXPLAIN ANALYZE SELECT * from pgbench_accounts ;
QUERY PLAN -------------------------------------------------------------------------------- -----------------------------------------
Seq Scan on pgbench_accounts (cost=0.00..2640.00 rows=100000 width=97) (actual time=0.026..30.762 rows=100000 loops=1) Total runtime: 46.029 ms (2 rows)
・HINT句使った場合
/*+ IndexScan(pgbench_accounts) */EXPLAIN ANALYZE SELECT * from pgben ch_accounts ; QUERY PLAN
-------------------------------------------------------------------------------- ----------------------------------------------------------
Seq Scan on pgbench_accounts (cost=10000000000.00..10000002640.00 rows=100000 width=97) (actual time=0.034..35.974 rows=100000 loops=1) Total runtime:
インデックスを定義していないため、IndexSCanとならない。(当然であるが)
よく見ると、Seq Scan on pgbench_accountsnの
cost=10000000000となっており、かなり大きな値になっている。
enable_seqscanをoffに設定した場合と同様に、costの値を大きくしているようです。
WALを無理やり壊してみた。
こんばんは!!!
無理やりWALの壊して、PostgreSQLが起動できない状態にしてみました。
以下の手順を実施しました。
1. WALの現在の書き込み位置を確認
postgres=# SELECT pg_current_xlog_location();
pg_current_xlog_location
--------------------------
6/1559C4E8
(1 row)
2.WALの書き込み位置をファイル名に変更
postgres=# SELECT pg_xlogfile_name('6/1559C4E8');
pg_xlogfile_name
--------------------------
000000010000000600000015
(1 row)
000000010000000600000015とういWALファイルに書き込み中だというとことが
わかった。ので、次のこのファイルを壊します。
$ cd $PGDATA/pg_xlog/
$ echo 1 > 000000010000000600000015
WALファイルを壊してもPostgreSQLは停止しないので、停止させる。
4.PostgreSQL停止
$ pg_ctl stop -m i
waiting for server to shut down... done
server stopped
5.PostgreSQLを起動
$ pg_ctl start
server starting
6.psqlで接続
$ psql
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
起動していない?
7.ログを確認
(ログの抜粋)
LOG: database system was interrupted; last known up at 2013-01-30 21:57:41 JST
LOG: could not read from log file 6, segment 21, offset 0: No such file or directory
LOG: invalid primary checkpoint record
LOG: could not read from log file 6, segment 21, offset 0: No such file or directory
LOG: invalid secondary checkpoint record
PANIC: could not locate a valid checkpoint record
LOG: startup process (PID 31213) was terminated by signal 6: Aborted
LOG: aborting startup due to startup process failure
→起動していない。。
8.pg_resetxlogを実行
-n をつけて、実際の実行の前に確認します。
$ pg_resetxlog -n -f $PGDATA
pg_control values:
First log file ID after reset: 6
First log file segment after reset: 29
pg_control version number: 903
Catalog version number: 201105231
Database system identifier: 5824051138782248887
Latest checkpoint's TimeLineID: 1
Latest checkpoint's NextXID: 0/502509
Latest checkpoint's NextOID: 33059
Latest checkpoint's NextMultiXactId: 1
Latest checkpoint's NextMultiOffset: 0
Latest checkpoint's oldestXID: 1795
Latest checkpoint's oldestXID's DB: 1
Latest checkpoint's oldestActiveXID: 502509
Maximum data alignment: 8
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 64
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 1996
Date/time type storage: 64-bit integers
Float4 argument passing: by value
Float8 argument passing: by value
9.実際に実行
$ pg_resetxlog -f $PGDATA
Transaction log reset
10.PostgreSQLを起動
$ pg_ctl start
server starting
11.PostgreSQLに接続
$ psql
psql (9.1.6)
Type "help" for help.
postgres=#
問題なく接続できた。が、、
pg_resetxlogにドキュメントに以下の記載があるのが、気になるので引き続き調査する。不完全にコミットされたトランザクションとは??
---マニュアル抜粋
このコマンドを実行すると、サーバが開始できるようになるはずです。 ただし、不完全にコミットされたトランザクションが原因でデータベースのデータに矛盾が起こる可能性があることに注意してください。 コマンドの実行後は、データをただちにダンプし、initdbを実行し、リロードすべきです。 リロード後、矛盾がないか検査し、必要に応じて修復を行ってください。
---
参考URL:
http://www.postgresql.jp/document/9.2/html/functions-admin.html
http://www.postgresql.jp/document/9.2/html/app-pgresetxlog.html