Berkeley DB

[ガラケー版(QRコード)]
アクセス記録[推移 / PV内訳(過去1日 / 過去1週間) / 外部アクセス元 (昨日 / 過去1週間) / ログイン論客足跡]
プロフィール私書(メール)
   /   /送済
評価(一覧   /)
投票   /共:   /
ファン登録
作品/情報/
DB構築()
ブログ
[書く]
攻略記事リンク集
My Play List
 作成日時分類記事タイトル
12012/10/31Berkeley DB紹介::Berkeley DBの進化の歴史..
22010/12/06Berkeley DBperl::BDB-Wrapper-0.38リリース..
32010/08/16Berkeley DBperl::BDB-Wrapper-0.32リリース..
42010/07/21Berkeley DBperl::BDB-Wrapper-0.31リリース..
52009/12/03Berkeley DBperl::BDB-Wrapper-0.30リリース..
=>古記事
 反応日時来客名来客者の最近のメッセージ
12017/02/25Merciこんばんは。サーバー移転後からだと思いますが、以前は見られた..
22017/02/17ねこじゃらしブログ投稿やコメントをしようとすると、たまにエラーになります..
32017/02/16Barnirunお世話になっております。https対応の影響か(またはhtm..
42016/11/10伏魔の剣こんばんわ。形式変更お疲れ様でした。 ところでこの改定につい..
52016/10/31雪霞いつもありがとうございます。ところで、ログアウトした時にポッ..
その他最近のコメント
1.
2012/10/31 Berkeley DB > 紹介 > Berkeley DBの進化の歴史」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]拍手:4個

1. 文章目的
2. Berkeley DBとは
    1. ライブラリから使うKV型DB
    2. 複数のAPIのサポート
    3. 複数のレベルでのデータ読み書き
    4. 複数のデータ形式
    5. 利用状況
    6. ライセンスについて
3. Berkeley DBの進化の歴史
4. 裏側の仕組みの変化図解
    1. Berkeley DBの始まりとなった設計
    2. Berkeley DB 2.0
    3. BerkeleyDB 2.06
    4. BerkeleyDB 5.0.21
5. まとめ
6. 参考になる資料

1. 文章目的

Berkeley DBの進化の歴史をまとめる事で、その作りにと使用方法に対する理解を深めてみようと思います。
2. Berkeley DBとは


    1. ライブラリから使うKV型DB

BerkeleyDBは所謂一つのキーを入力として値を得る、Key Value型の老舗のDBです。

但し、ライブラリとしてアプリケーションに組み込んで使うのが通常なので、所謂DBサーバーが別プロセスとして動いていて、それと会話をして動くといったSQL DB系のようなものとは、仕組みが大きく異なります。
アプリケーションの内部でBerkelyDBのライブラリのメソッドを通してデータの読み書きをする事になります。
arch_smallpic
なので、完全に開発者向けのDBですね。
SQLのような解釈が必要な言語も要らず、プロセスとプロセス間の会話も要らないので、超高速な読み書きと、携帯電話のような小さな機器内での稼働も可能になります。
    2. 複数のAPIのサポート

機能的には、APIとしてはKey/Valueだけでなく、SQL、XML/XQuery、Java Object APIを持っています。
自分はまだ使った事ありませんが、バージョン5からSQLのAPIでのサポートが始まっています。
119920_ja
    3. 複数のレベルでのデータ読み書き

データの保存の仕方としては、最もシンプルな単なるデータ保存だけでなく、同時書き込み排他保存、トランザクションでの保存、レプリケートした保存、といったレベルを変えた保存も可能になっています。
126914_ja
同時書き込み排他にせよ、トランザクションのサポートにせよ、レプリケートのサポートにせよ、どんどん読み書きのコストが高まっていく事になるので、そこら辺を必要性に応じてどこまでするかを選び分けれるのは強みの一つですね。
一つのプロセスしかアクセスしない事が保証されているのなら、同時書き込み排他機能も使う必要はなく、より高速に使用が可能になります。
    4. 複数のデータ形式

データの保存形式としては、Hash, Btree, Recno, Queue, Heapをサポートします。
データへのアクセスの仕方と、データの形式を考えて、最適な形式を選ぶ事が出来ます。
このレベルから根本的な「チューニング」が出来るのが、Berkeley DBの一つの強みでしょう。
勿論、逆に言えば、それぞれの違いが分っていないと、十分には使いこなせないことになってしまいますが。
情報処理試験とかで勉強した知識を活用する機会となります。
    5. 利用状況

MySQLと同じく、Sleepycat社から買収される事でOracleの軍門に下ってしまいましたが、再配布しない限り、無料のオープンソースとして使える状態は続いており、開発も続けられています。
歴史としては、現時点で20年もの歴史があるDBで、UNIXがAT&Tの所有物だった時代に遡るものになります。
KV系は最近は色々と出てきていますが、個人実装のものに比べると、その継続性や信頼性については安心レベルが異なります。

日本ではWeb系ではあまり使われる例は聞いた事ありませんが、GoogleやAmazon等Web系の企業だけでなく、その小ささからOS、ルーター、ブラウザー、携帯電話等々への組込み型DBとしてもよく使われます。
Linux系には全部組み込まれているとも言えるので、というのもあるでしょうが、Oracle曰く世界中で2億以上の機器で使われているDBとなります。
最初から組込まれているのだから、ぱぱっとkey/value型を使うのならまず使用する候補になりますね。
自分の場合もあれやこれやと使わせて頂いています。

そのように、Linux系にデフォルトで付いてくることもあり、それなりにLinux系の人は縁があったりするものですが、単純なデータ読み書きは使っていても、中々それ以上(CDSロック、トランザクション、レプリケーション)といったレベルまで使っている人は、日本では少ないかもしれません。
ただ、別サーバープロセスが起動し続けて、基本的にはファイルシステム自体を守ってくれるようなものとは異なり、プログラムのプロセスと同じ所で読み書きがされるBerkeleyDBは、TCP通信とかもなく処理効率は最高クラスですが、その取り扱いはプログラム側が責を負う事になるので、適切に使わないとマルチプロセス環境ではかなり簡単に壊れてしまって、大変な事になります。
また、killする時にも、きちんと閉じるようにSIGHUPを補足するように気をつけないといけません。
そういう環境では、適切にCDSロック、場合によってはトランザクションといった仕組みを組込む必要があります。
トランザクションの使用にまでいくと、シンプルな筈のkey/value型も色々書く事が多くなってしまうので、そこら辺は使い所として考え所にもなります。

Berkeley DBに関する日本語での情報はかなり少ないので、主に英語圏の情報を読みながら使う事にはなる事は、これだけ長い歴史がありながら覚悟はしないといけません。
    6. ライセンスについて

組み込んで再配布等をする時には、その使用しているソフトのソースコードについて、開示するというオープンソースのルールに従う事が求められます。
自社のサーバーで使うというのは、再配布にはあたりません。

商用ライセンスにお金を払う場合には、ソースコードを公開する必要はありません。
但し、それなりのお値段が請求されます。

種別ソフト費用年間サポート費用課金単位
高可用性バージョン106.5万円23.4万円1プロセッサーあたり
トランザクションサポート版652円143円1組み込み機器あたり。10万機器から販売
トランザクションサポート版63万円13.9万円1プロセッサーあたり
同時書き込み排他版652円143円1組み込み機器あたり。10万機器から販売
同時書き込み排他版19.5万円4.3万円1プロセッサーあたり
書き込み排他処理無し版652円143円1組み込み機器あたり。10万機器から販売
書き込み排他処理無し版9.8万円2.2万円1プロセッサーあたり

なお、
種別ソフト費用年間サポート費用課金単位
XMLの高可用性バージョン150万円33万円1プロセッサーあたり
という形でXML版は更に高くなっています。
3. Berkeley DBの進化の歴史

Berkeley DBのプロジェクトは、メモリー内のhsearchハッシュパッケージと、ディスク上のndbmハッシュパッケージを、新しく改善されたハッシュ実装で置き換える為に始まりました。
要件としては、メモリー内でもディスク上でも使えて、自由なライセンスで使える事でした。
BerkeleyDBはバージョンを重ねる毎に以下のように進化してきました。

リリース時期バージョン内容
19911HashとBTREEをサポートしたバージョン。排他書き込み処理やトランザクションはないので自分で別途排他処理をする必要があります。1.x系はUNIX系システムには必ず組み込まれているバージョンですが、その為アプリ側の責任で守ってあげないと破損してしまう事もあり、Berkeley DBの印象をトラブルになったら手に負えない恐ろしい子...、というイメージを作る原因の一つにもなってるかなとは思います。
19972トランザクションのサポート。Netscapeからのリクエストで進化。以降ブラウザーに組み込まれて使われたり。この時、その商用サポートの為、Sleepycat社が作られました。
19993抽象化等再デザインして、機能拡張し易い形に
20014レプリケーションと高可用性の実現。つまり書き込み用Masterサーバー、複数の読み込み用Slaveサーバとした運用が出来るようになりました。
201052006年にOracleがBerkeley DBの所有権を取得してから初めてのメジャーリリース。SQLのサポート等が5系からはされる。

4. 裏側の仕組みの変化図解

ソフトウェアでは境界を定め、それを守る事が、保守性を維持する事になる。
これに従ってObject Orientedの仕組みについて述べれば、応答のAPIは同じで、その裏側が色々進化していくという事だ。

の原則を守った形で、表側ではkey/valueの仕組みは一貫して提供され続けていますが、裏側の仕組みは以下のように進化してきています。
    1. Berkeley DBの始まりとなった設計

libtp

LIBTPという無料のオープンソースなトランザクションの機能をもたらすライブラリを考えた時の設計書
http://www.aosabook.org/en/bdb.html
    2. Berkeley DB 2.0

bdb20
Process Managerがなくなりました。
    3. BerkeleyDB 2.06

bdb20-actual
リカバリー(=処理の巻き戻し)ができるようになった
    4. BerkeleyDB 5.0.21


現在のメジャーバージョン。
裏側の変更としては、レプリケーションが出来るようになったり、logモジュールがlogとdbregモジュールに分かれたり、名前空間が整理されたり、logサブシステムがカーソルベースのAPIになったり、トランザクション保護のDBの生成、削除、名称変更が出来るようになったり。
年月の積み重ねと共に、かなり線が増えている事が見えます。
5. まとめ

KV型DBはSQL系DBでは手が届かない所を補完してくれるものとして、近年になって日本では注目が増えた所はありますが、KV型DBは近年出来たわけではなく、長い歴史を持っています。
その中でもBekeley DBは使用実績から言えば王様のようなもので、それが故にOracleも買収し、開発主体もOracleという大御所が持ってくれる状態になっているので、信頼度的にはまず第一に考えうるKV型DBです。
日本では日本発のKV型DBの方に言及される事が多く、Berkeley DBが単純なKV以上にどれ程の事が出来るものになっているのか、認識があまりされていないなと思うので、その存在と1.x系からの進化について、もっと認識が進んでくれると良いな、と一利用者として思っています。
6. 参考になる資料


OracleのBerkeley DBのページ

Oracleの音声とプレゼンテーションでの説明(英語)

Berkeley DBの開発の歴史からソフトウェアの開発について知見も得るページ

このブログのBerkeley DBに関する記事
LBerkeleyDBのソースからのインストール
LC言語でのログラム例
LC++でのプログラム例 / Berkeley DBのサイズを小さくする② & 200万円超の費用削減
など

perlから使う用途のBDB::Wrapperモジュール(自分が作って使っている物の配布)
http://search.cpan.org/~hikarine/

コメントする4個

2.
2010/12/06 Berkeley DB > perl > BDB-Wrapper-0.38リリース」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

今はOracleから提供されているKey/Value型DBのBerkeleyDBをperlから簡単に使う為のモジュール、BDB::Wrapperのバージョン0.38をリリースしました。

一番大きな変更はトランザクションのサポートです。
今までCDSロックで対応させてきたけど、一応必要な事もあるかなと対応させました。
また、Podの文章も文法の基礎も理解せず書いていた所を直して、例文を読み易いように代えてあります。
その他clear_bdb_home()メソッド追加など。

http://search.cpan.org/~hikarine/

基本的な使用方法
  #!/usr/bin/perl -w
  package test_bdb;
  use strict;
  use BDB::Wrapper;
  my $pro=new test_bdb;
  $pro->run();
  sub new(){
    my $self={};
    return bless $self;
  }

  sub run(){
    my $self=shift;
    $self->init_vars();
    $self->demo();
  }

  sub init_vars(){
    my $self=shift;
    $self->{'bdb'}='/tmp/test.bdb';
    $self->{'bdbw'}=new BDB::Wrapper;
  }

  sub demo(){
    my $self=shift;
    if(my $dbh=$self->{'bdbw'}->create_write_dbh($self->{'bdb'})){
      ###############
      # 必須じゃないけど突然のプロセス停止による不測事態への予防措置
      local $SIG{'INT'};
      local $SIG{'TERM'};
      local $SIG{'QUIT'};
      my $lock=$dbh->cds_lock();
      $SIG{'INT'}=$SIG{'TERM'}=$SIG{'QUIT'}=sub {$lock->cds_unlock();$dbh->db_close();};
      ###########
      if($dbh && $dbh->db_put('name', 'value')==0){
      }
      else{
        $lock->cds_unlock();
        $dbh->db_close() if $dbh;
        die 'Failed to put to '.$self->{'bdb'};
      }
      $lock->cds_unlock();
      $dbh->db_close() if $dbh;
    }

    if(my $dbh=$self->{'bdbw'}->create_read_dbh($self->{'bdb'})){
      my $value;
      if($dbh->db_get('name', $value)==0){
        print 'Name='.$name.' value='.$value."\n";
      }
      $dbh->db_close();
    }
  }

トランザクションを使った例
  #!/usr/bin/perl -w
  package bdb_write;
  use strict;
  use BDB::Wrapper;
  use FileHandle;

  my $pro = new bdb_write;
  $pro->run();
  sub new(){
    my $self={};
    return bless $self;
  }

  sub run(){
    my $self=shift;
    $self->{'bdbw'}=new BDB::Wrapper;
    # トランザクションを使うBDB_HOMEを/home/txn_data/bdb_home/$BDBFILENAME/以下に作りたい場合
    my ($dbh, $env)=$self->{'bdbw'}->create_write_dbh({'bdb'=>'/tmp/bdb_write.bdb', 'transaction'=>'/tmp/txn_data'});
    my $txn = $env->txn_begin(undef, DB_TXN_NOWAIT);
  
    my $cnt=0;
    for($i=0;$i<1000;$i++){
$dbh->db_put(rand(), $i*rand());
      $cnt=$i;
      if($cnt && $cnt%100==0){
        $txn->txn_commit();
        $txn = $env->txn_begin(undef, DB_TXN_NOWAIT);
      }
    }

    $txn->txn_commit();
    $env->txn_checkpoint(1,1,0);
    $dbh->db_close();
    chmod 0666, '/tmp/bdb_write.bdb';
    print "Content-type:text/html\n\n";
    print $cnt."\n";
  }


コメントする

3.
2010/08/16 Berkeley DB > perl > BDB-Wrapper-0.32リリース」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

BDB-Wrapper-0.32をリリースしました。
http://search.cpan.org/~hikarine/
に表示されるにはタイムラグがありますが、24時間以内に現れる筈です。
すぐにダウンロードされたい方は
http://www.cpan.org/authors/id/H/HI/HIKARINE/
から得る事が出来ます。

record_error($msg);

というメソッドが加わっています。
これを使うと$msgの内容と時間のセットを
/tmp/bdb_error.log
に追記出来ます。

!/usr/bin/perl -w
use strict;
use BDB::Wrapper;
my $bdbw=new BDB::Wrapper;
my $bdb='/tmp/example.bdb';
my $key=1;
my $value=2;

if(my $bdbh=new $bdbw->create_write_dbh($bdb)){
  if($bdbh->db_put($key, $value)==0){
  }
  else{
    $bdbh->record_error('Failed to write to '.$bdb);
  }
  $bdbh->db_close();
}

といった形に使う事を想定しています。

コメントする

4.
2010/07/21 同日3番目 Berkeley DB > perl > BDB-Wrapper-0.31リリース」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

0.31リリースしました。
バグフィックスです。
Fixed the bug of rmkdir($bdb_dir) for create_write_dbh

ふとツイッターで呟いてあげてなかったなぁ、と思いついたので、
http://search.cpan.org/~hikarine/
へのアップ自体は2010/08/12/

コメントする

5.
2009/12/03 同日2番目 Berkeley DB > perl > BDB-Wrapper-0.30リリース」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

大規模サイト向けとしてkey/value型DBがそのパフォーマンスの良さから脚光を浴びるようになってきていますが(パフォーマンスの良さはSQL文もサーバープロセスも要らないので当然といえば当然)、世界で見ると一番使われているのはBerkeleyDBというOracleによってSleepycat社から買収されたDBです。

当サイトではSQL DBは使わずDB系ではBerkeleyDBのみ使っていますが、BerkeleyDB.pmを適切なパラメーターで簡単に使う為のラッパーモジュールBDB::Wrapper-0.30をリリースしました。
ダウンロードは以下のURLから出来ます。
http://search.cpan.org/~hikarine/

rootになって
perl -MCPAN -e shell
install BDB::Wrapper
でもインストール出来ます。

主な変更点:
・deadlockによるハング回避の為LockDetectの機能を追加しました。デッドロックは一番古いものを破棄するように作動します。

・cacheとno_lockのオプションnew()からだけでなく、create_write_dbh(), create_read_dbh()で使えるようにしました。今まではnew()でのみ指定が可能でした。
一つのBDB::Wrapperオブジェクトを経由してこれによりBDBファイル毎にcacheサイズの指定等カスタマイズが出来るようになります。
no_lockオプションは同時書込みが絶対にない書込みでお使い下さい。
cacheオプションは生成されるBDBより大きいサイズを指定するとパフォーマンスが最適化されます(メモリーがその分消費されますが)。
例:
#!/usr/bin/perl -w
use strict;
use BDB::Wrapper;

my $bdb='/tmp/test.bdb';
$cache_size=10000000;
my $bdbw=new BDB::Wrapper();
my $bdbh=$bdbw->create_write_dbh({'bdb'=>$bdb, 'cache'=>$cache_size, 'no_lock'=>1});
$bdbh->db_put('key1', 'value1');
$bdbh->db_close();

$bdbh=$bdbw->create_read_dbh({'bdb'=>$bdb, 'cache'=>$cache_size, 'no_lock'=>1});
my $value;
if($bdbh->db_get('key1', $value)==0){
  print $value."\n";
}
$bdbh->db_close();


コメントする

=>古記事
RSS購読
RSS
ブログ表示スタイル
リスト/携帯(QRコード)
画像/動画/音声/リンク
表示開始年月
分類
全て
1.このサイトについて
2.作品DB開発/運用
3.ホームページ制作技術
4.Perl
5.C言語 / C++
6.検索エンジン&SEO
7.サッカー
8.自分のこと
9.Linux
10.旅行
11.思ったこと
12.パソコン
13Berkeley DB
14.その他技術系
15.企画
16.スマートフォン
17.鑑賞
18.皆声.jpニュース
19.インターネット業界
20.運用マニュアル(自分用)
21.技術系以外実用書
22.料理
23.ALEXA
24.アニメ
25.会計
26.漫画
27.設計書
28.色々サイト作成
29.サーバー
30.自分専用
31.生活
32.OP/ED/PV
33.ゲーム
34.DB整備
35.新規開始作品紹介
36.英語圏の話題
37.大道芸
38.映画
39.PHP
40.ダイエット
41.Mac
42.JavaScript
43.MySQL
44.介護
45.作品DB作品追加作業
46.BI
47.Web API
48.パフォーマンス
49.インターネットの活用方法
50.Riak
51.Androidアプリ開発
52.Cassandra
53.スパム
54.写真
55.iOSアプリ開発
56.AWS
57.マーケティング
58.Web漫画
59.法律
60.mongodb
61.開発環境整備
62.Google Apps Script
63.meteor
64.Pentaho
65.Ansible
66.VPS
67.技術書メモ
68.Vagrant
69.Docker
70.dokuwiki
71.Apple Watch
72.Webサービス
73.セキュリティ
74.Elastic Search
75.Wordpress
76.クラウド
77.英語
78.MVNO
79.シンガポール
80.マレーシア
81.管理人さん
82.管理人さん
日記の主な内容
サイト運営/開発
検索エンジン情報
・技術ネタ(Berkeley DB,
Linux, Perl, サイト作成)等

サイト管理
全まとめ
サーバー管理
定期処理状況
開発予定
削除提案
作品追加依頼
OP/ED追加依頼
OP/ED not found
作品提案承認欄

格言 fromスクライド
この世の理は即ち速さ
20年かければ馬鹿でも
傑作小説を書ける

助けられたら助け返す
それが俺のルール

強くなるには
一番弱い考えをする事だ
そしてその考えに反逆する




右側に何か入れてみるテスト


仕事でのサイト
介護DB
Helpyou
Doctor career
Nurse career
上へ ↑上へ 最速検索作品DB皆声