データベースについてまとめてみた
ちょっと調べてみたのでメモメモ。
RDBMS
リレーショナルデータベースシステム。表形式でデータを保持する仕組み。
行単位で取得するとか、更新するとかが得意。
データを結合して取ってくることができる。
- MS SQLServer
- Oracle
- MySQL
- PostgreSQL
- MS Access
オープン系(出身)技術者はDBを基準にシステム構成を読み解く人が多い気がする(自分とか)。
DB定義書みたら大体どんなことをするシステムかわかるよね。
そういや、正規化ってWeb系開発やるようになってから、あんまりきかなくなったような。
ちょっと古いけど、Oracle、MySQL、PostgreSQL の機能比較は下記が参考になる。
http://lets.postgresql.jp/documents/tutorial/rdbms-hikaku
NoSQLタイプ
KVS型(キー・バリュー・ストア)
キーを元にデータ(Value)を操作する。
データの中身を条件に指定して、操作することができない。
- memcached
- kumofs
- Tokyo Cabinet (Kyoto Cabinet)
kumofs は少しいじってみたけど、使い道にちょっと悩む。
キャッシュとかあくまでオンメモリで動作する手軽さとスピード感が売り?なのかな。
memcached は最近プロトコルとしてよくお名前を見かける気がしますよ。
ドキュメント指向型
スキーマレス。表のようなデータ構造の概念を持たない。
ハッシュの塊をキーで引っ張るイメージ…ってNoSQL全部そんな気が。
JOINはできないけれど、条件検索はできる。
- CouchDB
- MongoDB
CouchDB が JSON で、MongoDB が BSON という形式でデータ保存。
CouchDB は直接 Javascript で操作できるのが魅力になるのかな。
MongoDB) 予想するよりもデータ容量を食う。
http://www.mongodb.org/pages/viewpage.action?pageId=17596968
PostgreSQL の VACUUM みたいに repairDatabase() をしないと駄目とかってことはない?
で、カード型とか思い出すんですけど、桐って今どうなってるんだ…って、ググったらまだあった。
列指向型
表形式の概念はあるけれど、列単位でものを考える。
列に対して、取得をするとか、一括更新をするとかが得意。
スキーマレスっぽい? 列を増やすのに定義の変更みたいなことは不要。
大容量向け。
- HBase
- Cassandra
それぞれ、Facebook、Twitter が採用中。
Cassandra は元々 Facebook が開発してたという話だからちょっと面白い。
オープンソース以外だと Bigtable もこのカテゴリなんだと思われる。
http://gihyo.jp/dev/serial/01/various-nosql/0005
上記の記事によると、「何を保証するか」が大きな違いらしい。SPOF(単一故障点)の有無。
CAP定理で考えると、Facebook は AP型 より CP型 を採用したってことかな。
PHPでmemcached のセッション管理をする
PECL::memcache と PECL::memcached について調べた
(2011.5.14現在)
PECL::memcache
http://pecl.php.net/package/memcache
安定版は v2.2.6。
PHP4.3.3以上で使用可能。
古くから対応しているだけあって、php.iniの設定項目も比較して多い。
memcache.hash_strategy=consistent
これをしておくと、再マッピング不要になる。
サーバーを複数設定したり、追加削除が想定される場合はこっちにしない理由がなさそう。
PECL::memcached
http://pecl.php.net/package/memcached
安定版は v1.0.2。
phpのマニュアルを見た感じだと、こっちのほうがメソッドが多い。
ただ、libmemcached に依存しているのでインストール面倒くさそうな感じ。
PHP5.2.0以上が必須要件。
http://alpha.mixi.co.jp/blog/?p=119
こちらを読んだり、グーグルさんに教えてもらった辺りをさまよってみた感じだと、libmemcached を利用していることによる拡張点が魅力になるのかな。
分散とか考えないなら…なんて、実際の運用ではないので、memcache の魅力をもっと生かしたいなら、こっちなのかもしれない。
PECL::memcache で session する
memcached インストール
$ wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz $ tar zxvf memcached-1.4.5.tar.gz $ cd memcached-1.4.5 $ ./configure $ make $ make install # 入ってなかったらインストール # 開発版じゃないとダメ $ yum install -y libevent-devel # 確認 $ rpm -ql libevent-devel # 起動 $ memcached -d -m 64 -p 11211
-d デーモンモードで
-p メモリ
-p ポート
session につかうなら -C オプションを追加(=CASを使用しない、に)すると少食になるらしい。
php での設定の仕方
PECL::memcache をインストールする。
インストールする環境のPHPが v5.1.6だったので、ついでに v5.2.17にして、静的に組み込んでみる。
公式リファレンスを見て、そのまんま。
http://www.php.net/manual/ja/install.pecl.static.php
$ cd ext $ wget http://jp.php.net/get/php-5.2.17.tar.gz/from/this/mirror $ tar zxvf php-5.2.17.tar.gz $ cd php-5.2.17/ext $ gzip -d < memcache-2.2.6.tgz | tar -xvf - $ mv memcache-2.2.6 memcache $ cd .. # チキンなので退避 $ mv configure configure.org $ ./buildconf --force # なんかいっぱいWarning出たけど見なかったことにする $ ./configure --help | grep memcache # --enable-memcache がいたから成功? $ ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --enable-force-cgi-redirect --enable-mbstring --enable-mbregex -with-mysql --enable-memcache $ make $ make install
configure オプションはいつもの感じのに --enable-memcache を追加したもの。
入ったっぽいので、適当なスクリプトを書く。
<?php $mem = memcache_connect('localhost', 11211); // for object $mem->add('key_dayo', 'item_dayo', false); echo $mem->get('key_dayo'); echo "\n";
予想通りの結果が出力されればOK、のはず。
既にPECL::memcacheがインストールされていれば、移行でも再起動しなくて ini_set() 指定でどうにかなる。
extension=php_memcache.so session.save_handler=memcache session.auto_start=0 session.save_path={ホスト:ポート}
※PECL::memcached 使用の場合は、extension と session.save_handler を memcached に変更。
memcache の場合は、session.save_path にtcp:// をつける、とあるけど、なくても動いた。
IP指定だから?
確認
既にSessionを使用しているアプリとかあるなら、それを動かす。
明示的にセッションのスタートは宣言しなくちゃいけないので、なければ簡単なのを書く。
できたセッションキーをキーにして、直接 memcached に取りに行ってみる。
$ telnet localhost 11211
とりあえず、ステータス確認
$ stats STAT pid 3028 STAT uptime 959 STAT time 1304872012 STAT version 1.4.5 STAT pointer_size 32 STAT rusage_user 0.000000 STAT rusage_system 0.013997 STAT curr_connections 10 STAT total_connections 21 STAT connection_structures 11 STAT cmd_get 10 STAT cmd_set 7 STAT cmd_flush 0 STAT get_hits 6 STAT get_misses 4 STAT delete_misses 1 STAT delete_hits 2 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 2669 STAT bytes_written 2088 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 721 STAT curr_items 2 STAT total_items 7 STAT evictions 0 STAT reclaimed 0 END
curr_items が今登録されているアイテム数。あってる?
セッションで使ってるCookieキーは cbc06e8712af44b07f927ea6e69b5d2d
$ get cbc06e8712af44b07f927ea6e69b5d2d VALUE cbc06e8712af44b07f927ea6e69b5d2d 0 6 nakami END
うん。OKっぽい。
シンプルにWPを使う
条件
- ブログっぽく投稿できて
- サイトっぽくする
- 保存するデータは少なく
バージョンは 2.9.x でやったけど、3.0系でもあんまり変わらないように思われる。
つか、もうあれってCMSだよ。あそこまでやるなら自分で作ったほうがストレスないような気さえする。
テーマ
使用するテンプレートは Sandbox
http://www.plaintxt.org/#sandbox
ウィジェットをあんまり利用する気がないならこれで十分。足りなきゃ作れば良いや、と思えるのならこれが一番いじくり倒しやすい気がする。シンプル。
ところで wordpress のテーマってどうやって派生ライセンスの記述すればいいんだろう。style.css にあるヘッダをそれぞれ2つ書けばいいのか。
バージョンが2.9.x以降なら、ページごとにテンプレートができるけど、sidebar.php だけ、それができない。
そこまでしたいなら、3.0以降でタクソノミー使ったほうが幸せになれる。
初期設定
レコード肥大したくないなら、インストールする前に設定ファイルで「更新履歴を残す機能」を無効化する。
wp-config.php に下記の一行を追加。
ちなみに自動下書き保存機能はこのままだと有効。1記事につき最低2レコードできる。
define ('WP_POST_REVISIONS', false);
require_once(ABSPATH . 'wp-settings.php'); より前に書くように。
これが済んだらインストール→テンプレートを置き換える。
プラグイン
AddQuicktag
記事を書くときに、好きなタグが使えるようになる。
使用できるタグが増える、たくさん改行を空けたい(後述)に対応。
My Category Order
カテゴリの順番を決めることができる。
設定しないと文字コードのソート順になるから。
wp_list_categories() に、&orderby=term_order を追加すると、階層構造でも綺麗にソート可能。
たくさん改行を空けたい
WPは複数改行未対応。というか、そういう文化は海外にはないのか。
できないなら、複数改行してるように見せたらいいじゃない。の精神で、AddQuicktag の出番。ブロックタグを追加する。
これ↓足した。
<p style="padding-top:2em"></p>
設定画面の閉じタグは省略できるので、開始タグ(Start Tag)のところに上の一行を。これを投稿フォームで挿入すると、表示したときに上と2行分の間があく。2em → 3em にしたら3行分。
とりあえずひとつ設定しておき、HTMLモードでタグの内容を書き換えれば、柔軟な対応もできる。
複数改行用のプラグインは存在するけれど、タグがわかるならこっちで色々と兼用するほうが便利なんじゃないかと思ったり。
ビジュアルモードでできるかどうかはわからない。pタグを初期化しておかないと、変に改行が増えそうな気がする。
IE と Firefox はリッチエディタ使用の際に改行時に生成されるタグが違う。そこらがどう影響するのかがちょっと読めないな。
その他
ここちょっとはまったのよ、ってところを。
Javascript のライブラリをヘッダタグの中に書くときの注意。
wp_enqueue_script() を使って追加する場合限定。自力でフルパス書くなら別。
どうも wp_head() の後ろに書くと駄目らしい。出力が全くされない状態になる。仕様かな。