普通,LinuxでLVMと言うとvgcreate, vgchange, lvcreate... を思い浮かべます。
このような高レベルのLVMも十分高機能ですが,dm(device mapper)という低レベルのLVMもまた,とても強力です。
最近,弊社の仕事で使用する機会があり,おもしろいと思いましたのでご紹介いたします。

一瞬で元に戻るディスク


仮想マシンを起動後元にもどしたい,という要件があった場合,普通はddで上書きすると思います。
でも,同じような仮想マシン(それぞれ20GBくらい)が10個あって,全部を5分で戻したい!とか言われると結構悩みます。
lvcreateでスナップショットを作れば良さそうですが,戻せる向きが違う(スナップショットは,消すと最新のものだけが残る)のでそれも無理です。
このようなときに,dmsetupなら簡単に実装可能です。

注意:dmsetupの使い方やデバイスを間違えると,システム全体を破壊する可能性があります。

[やりかた]


  1. 元ネタのディスクを/dev/mapper/testvg-testlvとします。

  2. 次に,十分大きな(変更を保持できる)大きさのファイルを作ります。この時,dd の seek引数でオフセットを指定すれば,スパースファイルが作成されるので高速です。ここでは,testlv.img とします。

  3. losetup で, testlv.img をループバックデバイスと結びつけます。/dev/loop0 を使うとします。

  4. ここで,新しいブロックデバイス(/dev/mapper/testvg-disk)を作成するために dmsetupを使います。 /dev/mapper/testvg-disk に対するすべての書き込みを,testlv.img に行なうようにします。読み出しは,変更されていないセクタは直接/dev/mapper/testvg-lvtestから読み出されます。

    echo 0 $(blockdev --getsize /dev/mapper/testvg-testlv) snapshot /dev/mapper/testvg-testlv /dev/loop0 n 64 | dmestup create testvg-disk


  5. 3を繰り替えして,別のファイル(testlv2.img)を/dev/loop1 と結びつけます。

  6. ディスクを戻すタイミングで,次のコマンドを投入します。このコマンドを投入した時点で,書き込みはtestlv2.imgに行なわれるようになります。

    echo 0 $(blockdev --getsize /dev/mapper/testvg-testlv) snapshot /dev/mapper/testvg-testlv /dev/loop1 n 64 | dmestup reload testvg-disk
    dmsetup suspend testvg-disk
    dmsetup resume testvg-disk


  7. /dev/loop0 と testlv.img が未使用になるので,それぞれ削除・再作成して次の切り替えに備えます。XFSなど,巨大ファイルの扱いが速いファイルシステムを使うと良いです。


dmsetup create, dmsetup reload に echo で送っている文字列は,以下の形式です:

開始セクタ 終了セクタ ターゲット ...

「ターゲット」は,アクセスされたときにどのような処理を行なうかを記述します。
snapshot の場合,copy on writeを行なうことができ,テンプレートになるデバイスと変更を書き込むデバイスを指定します。
他にも,crypt とか error といったターゲットがあり,名前のとおり暗号化したり,アクセスするとエラーにしたりすることができます。
組み合わせて,

  • 一部だけがエラーになるディスク
  • 前半と後半で暗号化キーの異なるディスク

など,変わったボリュームが作れます。
errorターゲットを活用すると,ファイルシステムやRAIDを復旧する練習に使えそうですね。

ボリューム管理のための,簡潔で強力な仕組みを提供する device mapper の紹介でした(TA)。


データベースの学習-その2


表の操作の考え方(関係代数)

さてHAです。

データベース操作のために使われている関係代数を簡単に整理しておきたいと思います。
データベースは操作自体はそれほど難しくないですが、少し失敗するとデータを消去してしまったり
上書きしてしまったり大変恐ろしいときもありますのでしっかり押さえておくようにしたいと思います。


※(ここでは、リレーショナル型データベースを元に
表を2つ関連付けて考えるときのことを例にとっています。)


■■まず集合演算からどうぞ■■


■和集合演算(union)
2つの表の値すべてを結果にして返すこと。
リレーショナルデータベースの場合は重複するデータは表示しない。
A∪B(AまたはB)
Aでも○、Bでも○、AとBでも○(表示時に重複データは1つだけ表示)
(日常の「または」の言葉とはちょっと用法が違います。)


■差集合演算(difference)
2つの表を比べ共通部分を除いた部分を結果にして返すこと。
A-B AにあってBにあるものは× AにあってBにないものは○ AになくてBにあるものは無視。
よってA-BとB-Aは結果が異なるので注意が必要。


■積演算(intersection)
二つの表の「共通部分」
A∩B AとBは○ Aだけは× Bだけは×。
AかつB。


■直積演算(cartesian product)
演算対象となる2つの表のすべての「組み合わせ」を結果として返す。

今までの3つの集合演算とは違い
純粋に列も行も掛け算されたようにふえます。
A×Bと表現する。

例えば
Aの表が列5×行6
Bの表が列3×行8であるとすると
AとBを直積演算すると
A列数5×B列数3の列数=列数15と
A行数6×B行数8の行数=行数48。

列数15と行数48の表Cが作られることになる。
という考え方です。



■■次は関係演算にいきます■■


■選択演算(selection)
表から選択の条件を満たす行だけを取り出して結果を返す演算のこと。

列名、演算子、値を使って様々な条件設定を行える。
演算子は(= ≠ ≧ ≦ > <)
論理積・論理和・否定(AND・OR・NOT)を用いて式をつなぎ
複数の条件で選択することも可能。

例えば表内で男性で東京に住んでいる50歳以上の人だけ抽出する場合

性別(列名)='男'AND 都道府県(列名)='東京'AND 年齢(列名)≧'50'となる。


■射影演算(projection)
列名と並びを指定し、表から列を指定した並びどおりに結果を返すこと。

※リレーショナルモデルの場合全く情報が同じ行は存在できないので
例えば射影演算で性別(男女)の列のみを指定すると、
何人分のデータがあったとしても男と女の2行しか抽出できなくなる。

 これを回避するためには、性別と名前など複数列を指定することによって
 期待した結果を得ることができる。(この場合でも同姓同名は片方が消えるため要注意)
 一意の列名(個別コードなど)と同時に出せば必ずすべてのデータが表示される。


■結合演算(join)
リレーショナル型データベースではこれがないとやっていけないほど大事な演算です。
外部キー(各表に共通の列)を使って表を結合し、新たな表を作ること。
これはさすがに図なしではわかりにくいと思いましたので
(なんとかいままでシンプルにまとめて図は使わない方針だったんですが)
準備しました。

図では製品コードが外部キー(共通項目)となっています。
等結合演算と
自然結合演算がありますが、
とりあえず眺めているとなんのことかわかるかと思います。(ちょっと強引ですみません)

言葉で説明するとわかりにくいですが
等結合演算に対してさらに射影演算を組み合わせると自然結合演算ができます。
重複している列を取り除いて表示しているとかんがえればOKかと思います。


ドリームサポートネットーワークのブログ



■商演算(division)
これが一番難しいと思います。

表現も難しくどこで使うのかも難しいですが
表A÷表Bの場合
「表AB双方の表を比較して」
「表Aのすべての属性(列)の値を満たす表Bの行を取り出す」
「さらにその行から表Aと重なる属性を取り除いたもの」
ということです。

この説明がわかりやすかったです。
図を下に考えてみると良いかもしれません。

http://ja.wikipedia.org/wiki/関係代数_(関係モデル)#.E5.95.86

Wikipediaの例では(直接同じではないですが)
A÷B=Cの場合は当然、
C×B=Aとなる
この考え方をすると理解が深まる気がします。
つまり商演算は直積演算と対照的な存在というわけですね。(あたりまえか・・・)


いい問題があったのでこちらもおすすめです。
http://www.k4.dion.ne.jp/~type_f/23S_L4/23S_L4DB_09.html




頭の体操になる関係代数の話でした。
これらの考え方を理解しておくと
表の操作を実際に行うときに困らないはずです。


HAでした。

データベース学習ーその2 表の操作の考え方(関係代数)終わり








さてご無沙汰しておりましたHAです。
2013年度も始まりましたが皆さんいかがおすごしでしょうか?

今日はシステム・プログラム系統の仕事をされる方であれば日常的に接することがおありと思いますが
データベースについて取り上げてみたいと思いました。
本を読んだ時に専門用語ばかりが書かれていて難しくてつまずいてしまうことがないように
覚えておきたいことばを忘れないため簡単に説明を書きます。
なんとなくあやふやな言葉や、データベースの型で呼び名が変わったりするものも
ありましたのでさっと見て概要だけつかめれば大体の説明を見て理解できるだろうと考えています。
内容をおさらいするときに使えればと思います。
ちょっと長くなりますが、必要な部分だけ見返して使って頂ければ幸いです。


※(今回は2次元のテーブルでデータを収納し、
テーブル同士を関連付けできるリレーショナル型データベースを基本にします。)


■リレーショナル型データベースとは
各データが2次元の表によって表される。この表を複数用いながら関連付をおこない
大規模なデータベースとして活用できるデータベースの型。


■データとは
説明の必要がないかもしれないが
データベースにおいて処理しやすいように加工されている情報のこと。
どのように使うかを理解した上で要望に応えられるよう加工してゆく必要がある。


■データベースとは(DB)
データを貯めておく箱のようなもの
管理・変更、抽出などの再利用がしやすいように秩序だってデータを収納する。


■DBMSとは
データベースマネジメントシステム
データベースの保守や、管理をするためのソフトウェア
ユーザーが同時に同データにアクセスしてきた時にロックするなど
データベースに矛盾が生じないためやデータを守るために用いられている。
したがってユーザはデータベースに直接アクセスするのではなく
まずDBMSを通してデータを取得することができる。
(ユーザーが用いるアプリケーションとDBMSのあいだにはミドルウェアの存在もあります。)


■データベースシステムとは
DBMSやデータベースなどデータベースの構築などに必要なシステム全体を
ひとまとめにして表現したもの。
データモデル・データベース言語・DBMSも含む。


■SQLとは
データベース言語の一つ。リレーショナルデータベースを操作するための言語のこと。
データ定義言語DDL・データ操作言語DML・データ制御言語DCLに分けられる。
データ定義言語DDLにはテーブルを作ったり削除する文が含まれ
データ操作言語DMLにはデータを抽出したり、削除、挿入する文が含まれる。
データ制御言語DCLは処理をロールバックするなどの文が含まれる。
データベースに直接命令を出しているわけではなくDBMSに命令をだし、
命令を受けたDBMSがデータベースの内容を取ってきて応答する。


■データモデルとは
データベースにおいてあらかじめ定められている表現の決まり。規約のこと。
これに沿ってデータの重複を避け正規化することによって管理しやすくできる。


■クエリとは
データベース管理システムの操作をするために使用する命令のこと。
※SQLのQは「Structured Query Language」のクエリーかと思っていましたが、
これはどうも違うようでIBMの操作言語のことを指すらしく
SQLは何らかの略語ではないようです。


■テーブルとは
データが格納された表のこと。
エクセルで例えるなら1シート。


■フィールドとは
エクセルで言うと列のこと、顧客データにおいて生年月日や性別などの項目を作った場合
一つ一つの項目がフィールドとなる。


■レコードとは
一つの情報の単位。
エクセルで言うと行のこと、顧客データベースにおいては横一列に並ぶ1人分の顧客データがレコードとなる。
レコードには複数のフィールドがある。


■ファイルとは
レコードを保存する入れ物のこと。


■キーとは
レコードを一意に識別できるフィールドのことをさします。(キーは列に適用される)
キーのうち「主キー(primary key)」は重要で、一つのレコード(一つの情報の単位)のみに当てはまるキーになります。
主キーがなければ単独でそのレコードだけを抽出することはできません。

複数の項目のうちキーになりうる列のことを「候補キー(candidate key)」ともいいます。

またリレーショナルデータベースの場合ほかのテーブルと関連付ける必要がありますが
複数の表に共通するフィールドを作りテーブル同士が連絡できるようにします。
この外部との連絡を取るフィールドのことを「外部キー(foreign key)」といいます。
(外部キーはいくつでも持てる)

複数のフィールドをまとめて「複合キー(compound key)」とすることもできます。


■リレーションとは
リレーショナル型データベース内の情報は、複数の定義域に分けられて管理されているが
その定義域の中から意味のあるものを複数組み合わせてできる集合の表のこと。

■定義域とは(domain)
これ以上分けることのできない値の集合のこと。データ型と同じ。
属性が項目であるのに対して、定義域はそのデータすべてを含んだもの。性別ならば(男・女・不明)など。

■属性とは(attribute)
リレーショナル型データベースにおいて
住所、電話番号、性別などの一つ一つの項目のこと。列。


■組・タプルとは(tuple)
リレーショナル型データベースにおいて1件1件のデータ行のこと。行。

■リレーションスキーマとは
リレーション名と属性の並びによって表現される記述のこと。
例(会員名簿{会員コード・氏名・性別・年齢・住所})。

■リレーションシップとは
表と表との相互関係。外部キーによって関係を持つことができる。
これにより二次元の表をたくさん関連付けて、膨大なデータベースとして活用することができる。


■マスタとは(マスタファイルとは)
データを保存しているファイルのカテゴリの一つのこと。
複数のファイルを関連付けて利用するのがリレーショナル型データベースですが
そのファイルのうち重要で基本的な情報、元帳的な役割のファイルをマスタと呼ぶ。


■トランザクションファイルとは
マスタとは違い、日々内容の変動が激しいファイルのことをトランザクションファイルという。
例えば、売上情報や、在庫情報等情報量がころころと変動するものをさす。


■トランザクションとは
一連の処理の単位。分けてはいけないもの。
例えば、片方から数を引いて、引いた数をもう片方に追加し、全体の合計は常に同じになるようにする場合、
片方から数を引いただけで処理が中断させると矛盾が生じる。
このような一連のわけずに処理を行わなければいけない単位のことをトランザクションという。
そのように処理することをトランザクション処理またはトランザクション管理ともいいます。

例)銀行で自分の口座から相手の口座に一定金額を振り込む場合等


■ロールバック処理とは
トランザクション処理中に矛盾が生じた時のために
トランザクション開始以前にデータベースの状態を戻すこと。
DBMS中のログファイルにユーザーから出した命令のログが取られているため
ロールバックする際にはログファイルを参照しつつ問題のない時点まで戻す。

■コミット処理とは
トランザクション処理が無事に終了した時に
それを正しいデータとしてデータベースに反映させる処理のこと。


■CRUD操作とは
DBMSに必要な4つの操作のイニシャルをとったもの
作成・読み出し・更新・削除のCreate・Read・Update・Deleteのことで
基本的な機能のこと。


■ACIDとは
簡単に言うと、トランザクションシステムを信頼性のおけるものとするうえで
必要な性質(不可分性・一貫性・独立性・永続性)のイニシャルをとったもの。


■データ辞書ファイルとは(DD Data Dictionary)
=メタデータ、=カタログファイル。
DBMSがデータベースを管理するためにかならず持っているファイル。
データベースにアクセスしたいときユーザーは通常SQL等を用いてDBMSにアクセスするが
それを受けたDBMSは必ずこのデータ辞書ファイルにアクセスする。
そして、DDを読み込んで該当するデータベースのアクセス形式や構造を確認する。
その情報を元に確実にデータベースを操作するという仕組みになっている。


■バックアップファイルとは
その名のとおりデータベースのバックアップ。
データベース自体の複製されたファイルのこと。
自分で作るか、自動化させてつくっておくなどの方法がある。


■作業用ファイルとは
一時的にDBMSが作業する際に必要となるファイル。
テンポラリーファイルとも呼ばれる。
作業域が必要な際に確保されるため、いらなくなったら消去され
ずっとあるものではない。


■同時実行制御管理(並行制御)とは(concurrency control)
一つのデータに対して複数人からアクセス・操作の要望がある場合
ロック制御、アンロック制御によりデータに矛盾が生じないようにするDBMSの機能・管理のこと。


■専有ロックとは(排他ロックともいう)
自分が操作しているデータ内容について、アンロックするまでは
ほかのユーザーが見ることもできない(読み込み禁止)ロックのこと。


■共有ロックとは
自分が操作しているデータ内容について、アンロックするまでは
ほかのユーザーは操作できないが読み込みはできるロックのこと。


■チェックポイントとは
障害回復管理のためにDBMSが一定時間ごとにとっているバックアップのポイントのこと。
WindowsPCのシステムの復元の際の復元ポイントと同じようなもの。
これに対しログファイルはトランザクション処理が完了してデータにコミットされるときに
定期的に書き込まれ、チェックポイントとログファイルを用いて障害回復が行われる。


■障害回復管理とは
データは様々な要因で障害を受けデータが損失を受ける危険性があるため
障害が起きた場合に、その影響がない状態までデータを回復させるDBMSの機能・管理のこと。
方法としては障害が起こった場合、まずDBMSが一定時間単位でバックアップを取っていたチェックポイントを参照し
障害が起こる前に取った最後のチェックポイントまでデータベースの状態を復元する。
その後にデータベースにトランザクション処理が発生している場合のため
DBMSはログファイルを読み込み、
コミットされているもの(作業が正常に完了しているもの)は反映(ロールフォワード)し、
コミットが完了していないもの(作業が中断しているもの)は破棄(ロールバック)することにより
障害直前の状態までデータベースの状態を戻す。


■ディレクトリの二重化とは
障害回復管理の一つの手法。
記憶域を別々のハードディスクなどに二重化しておくことにより
片方が物理的に障害が発生してもデータの救出が可能となる。
ミラーリングとデュープレキシングがあるが、ディスクインターフェースカードを共有するのがミラーリングで
別々に独立させて持つのがデュープレキシングという違いだけの問題。


■機密保護管理とは
セキュリティー管理のこと。DBMSの機能の一つ。
最近Webでデータ管理をするクラウドも増えてきているので説明の必要もないほど管理が行われているようですが
ユーザーパスワードの認証機能や、IP制御、アクセス制御、暗号化などがあります。



ほかにもいろいろありますが、また追記していきたいと思っています。HA