レプリケーション

レプリケーション（）とは、ソフトウェアやハードウェアの冗長なリソース間で一貫性を保ちながら情報を複製し多重化する処理を意味し、信頼性やフォールトトレラント性やアクセス容易性を強化する。同じデータを複数の記憶装置に格納することを「データレプリケーション」、同じ計算タスクを何度も実行することを「計算レプリケーション」という。計算タスクの場合、異なる機器上で実行すれば「空間的レプリケーション」となり、同じ機器上で繰り返し実行すれば「時間的レプリケーション」となる。"Replication" は本来は「複製」の意。
複製された実体へのアクセスは、一般に複製されていない単一の実体へのアクセスと同じである。外部のユーザーから見てレプリケーションは透過的でなければならない。また、障害発生時の複製物へのフェイルオーバーは、可能な限り隠蔽される。
データやサービスのレプリケーションは、一般に動的レプリケーションと静的レプリケーションに分けられる。動的レプリケーションでは、同じ要求を全複製で処理する。静的レプリケーションでは、1つの要求は1つの複製で処理され、それによる状態変化を他の複製に転送する。ある時点で1つのマスター複製が選ばれ、全要求を処理する場合、これを「プライマリ/バックアップ」型（マスタースレーブ型）といい、高可用クラスターでよく使われる。一方、任意の複製が要求を処理して状態を分配する場合、これを「複数プライマリ」型（データベースではマルチマスターレプリケーション）と呼ぶ。複数プライマリ型では、何らかの分散並行性制御が必須であり、分散ロックマネージャなどが使われる。
負荷分散は、異なる計算タスクを複数マシンに分配するのであって、計算レプリケーションとは異なる。ただし、負荷分散ではデータを複数マシンで共有する必要があるため、データレプリケーションを内部で行っている。
バックアップは、長期に渡ってコピーを保持し続けるため、レプリケーションとは異なる。レプリケーションでは、データは頻繁に更新される。
分散システム.
レプリケーションは、分散システムには古くからある概念で、しかも重要である。
レプリケーション対象がデータであっても計算であっても、その目的は、入って来るイベントを処理するプロセス群を用意することである。データレプリケーションの場合、そのプロセス群は受動的であり、格納されたデータを維持し、要求に応じて読み出したり、更新したりする。計算レプリケーションの場合、その目的はフォールトトレラント性を持たせることにある。例えば複製されたサービスは、プライマリのコントローラが故障してもバックアップがその機能を引き継げると保証する目的で、電話の交換網の制御に使われるだろう。しかし、潜在的なニーズはどちらでも同じである。すなわち、複製が同じ順序で同じイベント列を見ると保証することによって全体として一貫性を保ち、どの複製でも要求に答えることができる。
レプリケーション・モデル.
データレプリケーションには、それぞれに特徴の異なる以下のようなモデルが存在する。
どういったモデルを選択するかによって、性能は大きく変わる。単一コピー逐次化可能性を保証しようとすると、トランザクション・レプリケーションは最も遅くなる（性能を改善するには、ログベースのレプリケーションを採用することが考えられるが、ログの一部が障害によって失われると一貫性が保てなくなる）。仮想同期はこの中では最も高速だが、障害への対処はあまり厳密ではない。状態機械レプリケーションはこれらの中間である。
仮想同期モデルは、動的レプリケーションにも静的レプリケーションにも使える。一方、状態機械レプリケーションやトランザクション・レプリケーションは制約が多く、エンドユーザーがアクセスできない層に埋め込まれていることが多い。
データベース.
データベースのレプリケーションは多くのデータベース管理システムが採用している概念で、データベースのオリジナルとコピーのマスタースレーブ関係を意味する。マスター側は更新を記録し、それがスレーブ群に通知される。スレーブ側は更新を正しく受け取ったというメッセージを送り、次の更新を受け付けられる状態であることを通知する。
マルチマスターレプリケーションでは、任意のデータベースノードに更新要求を送ることができ、そこから他のサーバに通知する。しかし、実際にはコストや複雑さの増大によって、この方式を採用できない場合もある。マルチマスターでの一般的課題として、トランザクションがかち合った場合の解決方法（あるいはかち合うのを防ぐ方法）がある。一般に、同期式レプリケーションではトランザクションの衝突を防ぐ方式をとるが、非同期式レプリケーションでは衝突を防ぐことはできず、何らかの方法で解決しなければならない。例えば、2つのノードで同時に1つのレコードが更新されたとき、先行レプリケーションではコミット以前に衝突を検出し、一方を中止させることができる。遅延レプリケーションの場合、両方がコミットされた後、再同期が行われたときに解決処理を施す。その場合、トランザクションのタイムスタンプに基づいて解決したり、ノードの優先順位に基づいて解決したり、もっと複雑な方式で解決する必要がある。
ストレージ.
リアルタイムのストレージレプリケーションは、単一のブロックデバイスへの更新を複数の物理ハードディスクドライブに分散させるよう実装することでなされることが多い。こうすることで、オペレーティングシステムのサポートするファイルシステムを改造することなくレプリケーションが可能となる（ファイルシステムのコードはブロックデバイスのドライバ層の上で動作するため）。ハードウェア（ディスクアレイ）で実装される場合とソフトウェア（デバイスドライバ）で実装される場合がある。
最も基本的な方式はミラーリングであり、一般にローカルに接続されたディスク群を使う。
一般にストレージ業界では、ローカルな方式を「ミラーリング」、コンピュータネットワーク経由で遠隔にあるディスク間で行える方式を「レプリケーション」と呼ぶ。その目的は何らかの障害によってデータが損なわれることを防ぎ、災害が起きた場合にディザスタリカバリによって復旧可能とすることである。通常、マスタースレーブ型のレプリケーションモデルが使われる。書き込み操作をどう扱うかによって以下のように分類される。
主な実装として、次のものがある。
分散共有メモリ.
レプリケーションの別の用法として、分散共有メモリシステムがある。この場合、システム内の多数のノードがメモリ上の同じページを共有する場合があり、それはすなわち個々のノードがそのページの複製を保持することを意味する。
プライマリ/バックアップ型と複数プライマリ型.
古典的なレプリケーションの多くはプライマリ/バックアップ・モデルに基づいており、1つのデバイスやプロセスが他のデバイス群やプロセス群を制御する。例えば、プライマリがバックアッププロセスに更新ログを渡しながら何らかの計算をしている。そして、プライマリプロセスが何らかの障害で停止すると、バックアップが交代して計算を引き継ぐ。この方式では障害発生時にログの一部が失われ、バックアップがプライマリの最近の状態と全く同一とはならない可能性がある。そのため、トランザクション結果の一部が失われる危険性があるにもかかわらず、データベースでのレプリケーションでは一般的な方法であった。
プライマリ/バックアップ型の欠点は、2つのプロセスが動作しているのに、その一方しか実際には操作を行っていない点である。それによってフォールトトレラント性は得られるが、同じ処理能力にほぼ倍のコストを費やしていることになる。このため1985年ごろから、新たなレプリケーション方法が模索されはじめた。その成果として、複製群が協調動作し、各プロセスが相互にバックアップの役目を果たしつつ、負荷を共有する方式が生まれた。
データベースの研究で有名なジム・グレイは、複数プライマリ型レプリケーションによるトランザクションモデルを研究し、最終的にその方式に懐疑的な論文を発表した。簡単に説明すると、グレイはデータベースが "n" 個のサブデータベースに自然に分割できない限り、並行性制御の競合が生じて性能を低下させ、その性能低下は "n" の関数で表されるだろうと主張した。彼は典型的な手法による性能低下が "O(n3)" になると予測した。従って、自然に分割できるような場合のみ、データベースの分割をすべきであるとの主張である。
現実は、それほどひどいことにはならなかった。例えば、1985年から1987年にかけて、仮想同期モデルが登場して標準として広く受け入れられるようになった（各社が採用し、CORBAのフォールトトレラント標準の基盤にもなった。また、IBM WebSphere やマイクロソフトのエンタープライズ・クラスタリング技術でもレプリケーションに採用された）。仮想同期は複数プライマリ型の実装も可能で、プロセスグループが協調して処理を並列化する。この方式はメモリ上のデータにしか適用できないが、グループの規模に比例して性能が向上する。
最近の製品でも同様の手法がサポートされている。例えばSpread Toolkitは仮想同期モデルをサポートし、複数プライマリ型レプリケーションの実装に使っている。C-Ensemble や Quicksilver でも同様の方式が可能である。WANdisco は動的レプリケーションが可能であり、ネットワーク上の全ノードが正確な複製になっていて、全ノードが同時に動作可能である（WAN向けに最適化されている）。