2012/04/30

Postgres ディスク 負荷分散 テーブルスペース tablespace

ディスクの負荷分散!?

Postgresインストール先・データは/usr/local/pgsql/(/dev/sda)としてHDD2個追加してDBを作ってみる

テーブルスペース用のディスクをフォーマット&マウント

# mke2fs -j /dev/sdb1
# e2label /dev/sdb1 /pgsql1
# mkdir /pgsql1
# mount /dev/sdb1 /pgsql1
 
# mke2fs -j /dev/sdc1
# e2label /dev/sdc1 /pgsql2
# mkdir /pgsql2
# mount /dev/sdc1 /pgsql2
 
# vi /etc/fstab
LABEL=/pgsql1 /pgsql1 ext3 defaults,noatime 1 2
LABEL=/pgsql2 /pgsql2 ext3 defaults,noatime 1 2

テーブルスペース作成

# mkdir /pgsql1/pgdata1
# chown postgres:postgres /pgsql1
# chown postgres:postgres /pgsql1/pgdata1
 
# mkdir /pgsql2/pgdata2
# chown postgres:postgres /pgsql2
# chown postgres:postgres /pgsql2/pgdata2
 
# su - postgres
$ psql -c "\db+" template1 又は↓
$ psql -c "SELECT spcname FROM pg_tablespace;" template1
 
                        List of tablespaces
    Name    |  Owner   | Location | Access privileges | Description 
------------+----------+----------+-------------------+-------------
 pg_default | postgres |          |                   | 
 pg_global  | postgres |          |                   | 
(2 rows)
 
$ psql -c "create tablespace ts_pgdata1 location '/pgsql1/pgdata1';" template1
CREATE TABLESPACE
 
$ psql -c "create tablespace ts_pgdata2 location '/pgsql2/pgdata2';" template1
CREATE TABLESPACE
 
$ psql -c "\db+" template1
 
                            List of tablespaces
    Name    |  Owner   |    Location     | Access privileges | Description 
------------+----------+-----------------+-------------------+-------------
 pg_default | postgres |                 |                   | 
 pg_global  | postgres |                 |                   | 
 ts_pgdata1 | postgres | /pgsql1/pgdata1 |                   | 
 ts_pgdata2 | postgres | /pgsql2/pgdata2 |                   | 
(4 rows)

出来上がった環境

Postgresインストール先 /dev/sda上の/usr/local/pgsql

Postgresデータ /dev/sda上の/usr/local/pgsql/data

テーブルスペース1 /dev/sdb上の/pgsql1/pgdata1

テーブルスペース2 /dev/sdc上の/pgsql2/pgdata2

DB作成

日々更新・参照されるdb(db1+db2+db3...)はts_pgdata1へ

日々更新されるdb1,db2,db3.....とdbのINDEXはts_pgdata2へ

ということをしてみようかと。

# su - postgres
$ createdb db -D ts_pgdata1
$ psql -c "create table table1 ....." db
$ psql -c "create index index1 ..... tablespace ts_pgdata2" db
 
$ createdb db1 -D ts_pgdata2
$ psql -c "create table table1 ....." db1
$ psql -c "create index index1 ....." db1
 
$ createdb db2 -D ts_pgdata2
$ psql -c "create table table1 ....." db2
$ psql -c "create index index1 ....." db2
 
$ createdb db3 -D ts_pgdata2
$ psql -c "create table table1 ....." db3
$ psql -c "create index index1 ....." db3

確認。。。。。

?。。。テーブルとインデックス作成時にテーブルスペースを指定しなかったので現状を確認したいけれど、方法が分からなかったのでpg_adminでプロパティを見てみると意図したとおりに作成されていた。プロパティを持ってるってことはSQLでも確認できそうなので今度Postgresのシステムテーブルを漁ってみることに。。。

PostgresドキュメントのCREATE INDEX欄も見てみると載っていた。。。

>CREATE [ UNIQUE ] INDEX name ON table [ USING method ]

> ( { column | ( expression ) } [ opclass ] [, ...] )

> [ TABLESPACE tablespace ]

> [ WHERE predicate ]

>tablespace

>インデックスを生成するテーブル空間です。 指定されなかった場合、default_tablespaceが使用されます。 もし、default_tablespaceが空文字列であった場合はデータベースのデフォルトのテーブル空間が使用されます。

おまけ

DBダンプを取って見てみると違う環境でDBダンプから再構築したとしてもCREATE文ではエラーが出ないようになっていた。

ただ同じ名前のテーブルスペースがあったとしたら意図しないテーブルスペースを使用する可能性があるので余計な事を考えたくなければ、テーブルスペース名にサーバの名称など一意なものを加えると管理しやすいかも。

SET default_tablespace = '';
...
CREATE TABLE table1 ...;
...
...
SET default_tablespace = ts_pgdata2;
...
CREATE INDEX index1 ...;

2012/04/29

シェルスクリプト オプション 解析

シェルスクリプトを使いやすく。

シェルのコマンドラインからパラメータを受け取るものとして単純な$1 $2 ...のように$関係のものがあるが、ここではオプションを解析するスクリプトのメモ。

下記のようにしてみたい場合

$ command.sh -c -C -f filename.txt

command.sh

SCNAME=$(basename $0)
while getopts cf:C OPT
do
  case $OPT in
    "C" ) OPTA="TRUE";;
    "c" ) OPTB="TRUE";;
    "f" ) OPTC="TRUE"; OPTC_VALUE="$OPTARG" ;;
      * ) echo "Usage: $SCNAME [-c] [-C] [-f file]"; exit 1 ;;
  esac
done

getoptsの書式は、オプション文字列と、値もある場合はコロン(:)も付けないといけない。

2012/04/10

[ ルーター再起動スクリプト - Windows PHP ]

ルーター再起動

最近回線の調子が悪くて、いちいちルーター管理画面開くのが面倒だったので、なんとなく作ってみた。

ルーターはNTT-ME系のなにか。。。


やっている事は単純で、Basic認証でルーター管理開いたら、切断・接続のフォームをPOSTしてあげるだけ。。。

書いている途中に気づいたが。。。再起動ではなかった(・ω・;、回線の切断と接続でした。

このPHPをbatで実行する感じに。

ルーターの管理画面のHTMLソースを見て何をPOSTで送っているか調べてみると自分用のができるかと思う。

PHPスクリプト

<?php
    include_once("HTTP/Request.php");
    $request_option=array(
        "timeout"=>"3600",
        "allowRedirects"=>true,
        "maxRedirects"=>5
    );
 
    $host="http://192.168.x.x/";
    $url="{$host}/cgi-bin/main.cgi?mbg_webname=pppconnect";
 
    $http = new HTTP_Request($url,$request_option);
    $http->setBasicAuth("username","password");
 
    $http->setMethod(HTTP_REQUEST_METHOD_POST);
    $http->addPostData("mbg_webname", "pppconnect");
    $http->addPostData("ppp_session", "1");
    $http->addPostData("mbg_disconnect", "切断");
 
    $response=$http->sendRequest();
    if(!PEAR::isError($response)){
        $ret_code=$http->getResponseCode();
        $ret_body=$http->getResponseBody();
    }
 
    sleep(3);
 
    $http->clearPostData();
    $http->setMethod(HTTP_REQUEST_METHOD_POST);
    $http->addPostData("mbg_webname", "pppconnect");
    $http->addPostData("ppp_session", "1");
    $http->addPostData("mbg_connect", "接続");
 
    $response=$http->sendRequest();
    if(!PEAR::isError($response)){
        $ret_code=$http->getResponseCode();
        $ret_body=$http->getResponseBody();
    }
    sleep(3);
 
?>

2012/04/09

[ HDDの追加 - CentOS ]

ext3でフォーマット

# mke2fs -j /dev/sdbx

ラベル割り当て

# e2label /dev/sdbx /work

ファイルシステムのチェック

# e2fsck /dev/sdbx

マウントポイント作成

# mkdir /work

fstabに追記する

# vi /etc/fstab
LABEL=/work /work ext3 defaults,noatime 1 2

2012/04/05

tmpfsのグラフ作成 - CentOS グラフ Graph 作成 RRDTool tmpfs /dev/shm

グラフを作成してみた。

16Gのメモリをつんだサーバーを扱うようになったのでtmpfsも少し利用しようかと思って、どのぐらい使用するのかの確認を含めてグラフ化。

RRDTool Install



出来上がったもの

他のグラフにサイズをあわせて作ってしまったので、表示方法はいまいちだと思います。。。(・ω・;

tmpfs - /dev/shm

rrd作成:初めの一回のみ実行

#!/bin/sh
MEMTOTAL=$(cat /proc/meminfo|awk '{if($1=="MemTotal:") print $2}')
rrdtool create shm.rrd --step 60 \
  DS:ramtotal:GAUGE:600:0:${MEMTOTAL} \
  DS:ramused:GAUGE:600:0:${MEMTOTAL} \
      RRA:LAST:0.5:1:1440 \
      RRA:LAST:0.5:60:720 \
      RRA:LAST:0.5:360:1460 \
      RRA:AVERAGE:0.5:1:1440 \
      RRA:AVERAGE:0.5:60:720 \
      RRA:AVERAGE:0.5:360:1460 \
      RRA:MIN:0.5:1:1440 \
      RRA:MIN:0.5:60:720 \
      RRA:MIN:0.5:360:1460 \
      RRA:MAX:0.5:1:1440 \
      RRA:MAX:0.5:60:720 \
      RRA:MAX:0.5:360:1460

rrd更新:1分間隔~5分間隔程度。更新間隔が長いとグラフを作ったときにいまいちな結果になる(・ω・;

#!/bin/sh
CMAX=$(df|awk '{if($6=="/dev/shm") print $2}')
CUSED=$(df|awk '{if($6=="/dev/shm") print $3}')
rrdtool update shm.rrd N:${CMAX}:${CUSED}

グラフ作成:画像更新。適度に。

#!/bin/sh
DEV="shm"
TYPE=day
WIDTH=180
HEIGHT=90
DT=$(date -d '-1 day' '+%Y-%m-%d %H:%M:00')
SEC=$(date --date "${DT}" +%s)
RRD=${DEV}.rrd
FLNAME=${DEV}_${TYPE}.png
DTY=$(date '+%Y-%m-%d')
DTH=$(date '+%H')
DTM=$(date '+%M')
 
/usr/bin/rrdtool graph \
  ${ROOTDIR}/${FLNAME} \
  --start ${SEC} \
  --imgformat PNG \
  --interlaced \
  --width ${WIDTH} \
  --height ${HEIGHT} \
  --x-grid HOUR:1:HOUR:12:HOUR:3:0:%H \
  --y-grid none \
  --alt-autoscale-max \
  --lower-limit 0 \
  --base 1024 \
  DEF:v_used=${RRD}:ramused:AVERAGE \
  DEF:m_used=${RRD}:ramused:MAX \
  DEF:l_max=${RRD}:ramtotal:LAST \
  DEF:l_used=${RRD}:ramused:LAST \
  CDEF:cm_max=m_used,1000,* \
  CDEF:cl_max=l_max,1000,* \
  CDEF:cl_free=l_max,l_used,-,1000,* \
  CDEF:cl_used=l_used,1000,* \
  CDEF:g_used=l_used,l_max,/,100,* \
  CDEF:g_free=l_max,l_used,-,l_max,/,100,* \
  COMMENT:"/dev/shm\\n" \
  COMMENT:"(tmpfs)\\n" \
  AREA:g_used#ff7f50:"used\\g" \
  GPRINT:cl_used:LAST:"\\:%3.0lf%s" \
  GPRINT:cm_max:MAX:"max\\:%3.0lf%s\\n" \
  STACK:g_free#00ff00:"free\\g" \
  GPRINT:cl_free:LAST:"\\:%3.0lf%s\\n" \
  COMMENT:"date ${DTY} ${DTH}\\:${DTM}"

2012/04/03

UOA ツール 開発 #008 - UO UOA TOOL for Visual Basic , 自動化、便利、マクロ、自分で管理などなど(ソース付き)

決まり文句

この記事で紹介しているのはネットゲームのウルティマオンラインのツール開発に関する内容ですが、ウィンドウメッセージを送ったり受け取ったりしたことの無い方には、VBでアプリケーション間通信の手助けとなるコードが書かれてるかもしれません。

途中からこの記事を見た方は、こちらから全て見ることができます。

これまでの内容で取得できたもの

・アカウント名/アカウントID

・サーバー名

・キャラ名/キャラID

・スキル(スキルID/日本語名称/英語名称/表示値/ベース/ロック状態)

スキル管理ツールに必要なデータを取得できたかと思います。

後はVBのスキル次第で好きなものが作れるかなと。


私はというと・・・保存形式をXMLにしようかと調べていたらLINQという機能があることに気づいたのですが、データ量もそれほどないしINIにしてしまおうか。。。と悩み中。まったく進みません(・ω・;

MSDNの Visual Basic における XML

スキル定義

    Public UOA_SKILL_NAME(,) As String = { _
        {"Alchemy", "錬金術"}, _
        {"Anatomy", "解剖学"}, _
        {"Animal Lore", "動物学"}, _
        {"Item ID", "アイテム鑑定"}, _
        {"Armslore", "武器学"}, _
        {"Parrying", "シールド"}, _
        {"Begging", "物乞い"}, _
        {"Blacksmithy", "鍛冶"}, _
        {"Bowcraft", "弓矢製作"}, _
        {"Peacemaking", "沈静化"}, _
        {"Camping", "キャンピング"}, _
        {"Carpentry", "大工"}, _
        {"Cartography", "地図作成"}, _
        {"Cooking", "料理"}, _
        {"Detect Hidden", "探知"}, _
        {"Discordance", "不調和"}, _
        {"Evaluate Intelligence", "知性評価"}, _
        {"Healing", "治療"}, _
        {"Fishing", "釣り"}, _
        {"Forensic Evaluation", "検死"}, _
        {"Herding", "牧羊"}, _
        {"Hiding", "潜伏"}, _
        {"Provocation", "扇動"}, _
        {"Inscription", "書写"}, _
        {"Lockpicking", "鍵開け"}, _
        {"Magery", "魔法"}, _
        {"Magic Resistance", "魔法抵抗"}, _
        {"Tactics", "戦術"}, _
        {"Snooping", "覗き"}, _
        {"Musicianship", "楽器"}, _
        {"Poisoning", "毒"}, _
        {"Archery", "アーチェリー"}, _
        {"Spirit Speak", "霊話"}, _
        {"Stealing", "窃盗"}, _
        {"Tailoring", "裁縫"}, _
        {"Animal Taming", "調教"}, _
        {"Taste ID", "味見"}, _
        {"Tinkering", "細工"}, _
        {"Tracking", "追跡"}, _
        {"Veterinary", "獣医学"}, _
        {"Swordsmanship", "ソード"}, _
        {"Mace Fighting", "メイス"}, _
        {"Fencing", "フェンシング"}, _
        {"Wrestling", "レスリング"}, _
        {"Lumberjacking", "伐採"}, _
        {"Mining", "採掘"}, _
        {"Meditation", "瞑想"}, _
        {"Stealth", "ステルス"}, _
        {"Remove Trap", "罠解除"}, _
        {"Necromancy", "ネクロマンシー"}, _
        {"Focus", "フォーカス"}, _
        {"Chivalry", "騎士道"}, _
        {"Bushido", "武士道"}, _
        {"Ninjitsu", "忍術"}, _
        {"Spellweaving", "織成呪文"}, _
        {"Mysticism", "神秘呪文"}, _
        {"Imbuing", "練成"}, _
        {"Throwing", "スローイング"} _
    }