データエンジニアリング必読：データシステムにおける「一貫性」とは何か？

「あなたのシステムは強い一貫性を実現できますか？」 数年間、ストリーム処理システムを開発してきた実務者として、この質問にはよく遭遇します。私はしばしば自信を持って自分たちの製品を推奨したくなりますが、現実的にはこの質問に答えることは複雑です。その挑戦は、質問自体にあるのではなく、「一貫性」という概念が技術的な背景によって人々にとって異なる意味を持つという事実にあります。

実際、以下のような異なるバックグラウンドを持つ人々は、それぞれ一貫性に対して異なる解釈をしています：

- データベース
- 分散システム
- ストリーミングシステム

これらのバックグラウンドを持つ人々にとって、一貫性はそれぞれ異なる意味を持ちます。文脈を理解せずに答えると誤解を招くことになります。この記事では、これらの異なるデータシステムにおける一貫性が実際に何を意味するのかを明確にします。

## **データベースにおける一貫性**

従来のデータベースでは、一貫性はACID特性（原子性、一貫性、独立性、永続性）の基盤です。この原則は、各トランザクションがデータベースを一つの有効な状態から別の有効な状態へと遷移させることを保証します。たとえば、ある銀行取引で1つの口座が引き出され、別の口座が入金される場合、一貫性は合計残高が変わらないことを保証します。この点を原子性と区別することが重要です。原子性は、トランザクション内のすべての操作が成功するか、またはまったく実行されないことを意味します。つまり、部分的なトランザクションがデータベースに残ることがないように保証します。

要約すると、データベースにおける一貫性は、トランザクション全体を通じてデータの正確性と有効性を保つルールを強制することに重点を置いています。

![データベースのACIDモデルにおける一貫性は、データベースが一つの有効な状態から別の有効な状態に遷移することを意味します。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/fef6193a-10cc-e57a-1a8c-56d0c0bc5c04.png)


## **分散システムにおける一貫性**

分散システムに関する議論で頻繁に取り上げられる基本的な概念の一つは、カリフォルニア大学バークレー校の研究者によって初めて紹介されたCAP定理における一貫性のコンポーネントです。この定理は、分散システムに関する学術的なコースや専門的な対話の中で欠かせないテーマとなっています。

CAP定理では、「一貫性」は特に異なるノードに分散されたさまざまなレプリカ間でデータの均一性を指します。この一貫性を保証することは、分散システムにおいて特に挑戦的です。定理は、一貫性、可用性、分断耐性という3つの重要な属性の間のトレードオフを強調します。CAP定理によれば、分散システムはこれら3つの属性を同時に達成することはできません。

この文脈における一貫性は、異なるノードにあるデータのすべてのレプリカが任意の時点で同じ情報を表示することを保証します。これは、特にネットワーク障害や遅延が関係するシナリオにおいて、データの整合性を維持するために重要です。定理は、複数のノード間でデータを同期させることの難しさを浮き彫りにし、強力な分散システムの設計と維持における3つの競合する要求のバランスを取ることの重要性を示しています。

![分散システムにおける一貫性は、異なるノードにあるデータのすべてのレプリカが任意の時点で同じ情報を表示することを保証します。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/d84db542-62a2-5c17-2960-34e9256c80d0.png)

## **ストリーミングシステムにおける一貫性**

ストリーミングシステムに関する議論では、一貫性の話がデータベースや分散システムとは異なり、ユニークな要件や課題を反映しています。記事「Consistency and Completeness: Rethinking Distributed Stream Processing in Apache Kafka」（https://www.confluent.io/blog/rethinking-distributed-stream-processing-in-kafka/）では、ストリーミング環境における一貫性の重要な特徴として「exactly-once（正確に1回）」セマンティクスの概念が言及されています。

ストリーミングシステムでは、一貫性の維持はデータのレプリケーションではなく、システム障害が発生した場合でもすべてのデータイベントが正確に1回だけ処理されることを保証することに焦点を当てています。たとえば、金融取引がリアルタイムで処理されている場合、この処理中にシステムがクラッシュした場合、回復後にその取引が重複しないことを保証することが重要です。この「正確に1回」処理の要件は、ストリーミングデータの整合性を保つために非常に重要であり、システムの中断に関係なく各取引が正確に1回だけ処理されることを保証します。

![ストリーミングシステムにおける一貫性は通常、「正確に1回」セマンティクスを指します。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/e1ac2d6b-0605-061f-2b7f-64392f72fb11.png)


## **人々が本当に求めていることは？**

さまざまなシステムにおける一貫性の要件の違いを強調するために、次の表を考えてみましょう：

| **システムタイプ** | **一貫性のニーズ** | **例** |
| --- | --- | --- |
| データベース | トランザクションの整合性 | 銀行取引では常に口座残高が一致している必要があります |
| 分散システム | ノード間でのデータの均一性 | ソーシャルメディアでのプロフィール更新はどこでも一貫性を保つ必要があります |
| ストリーミングシステム | 順序と処理保証 | 各金融取引はリアルタイムで正確に1回のみ処理されます |

実際には、ユーザーや企業が本当に求めているのは、信頼性とデータ整合性であり、これは一貫性の教科書的な定義を超えています。彼らが必要としているのは、単に堅牢で信頼性の高いシステムだけでなく、現実世界の複雑さを効果的に管理できるシステムです。ユーザーにとっての成功の最終的な尺度は、システムがエラーなしに正しい結果を一貫して提供できる能力です。このレベルの一貫性を達成することは、システムが「正しい」と感じることではなく、理論的に健全で機能的に信頼できることが重要であることを認識することが不可欠です。

## **分散ストリーミングデータベースにおける一貫性**

さて、もっと興味深いことに触れてみましょう：分散ストリーミングデータベースにおける一貫性です。ストリーミングデータベースとは何かに馴染みがない方は、従来のシステムとして[KsqlDB](https://ksqldb.io/)や[PipelineDB](https://github.com/pipelinedb/pipelinedb)を考えてみてください。基本的に、ストリーミングデータベースはストリーム処理に特化しています。詳細については、私の[以前の記事](https://risingwave.com/blog/streaming-databases-everything-you-wanted-to-know/)を参照してください。RisingWaveでは、ストリーム処理のコストと複雑さを軽減することを目指した分散ストリーミングデータベースを開発しています。

分散ストリーミングデータベースは、データベース、分散システム、ストリーミングシステムの3つが組み合わさったものです。では、その一貫性とはどういうものなのでしょうか？理想的には、ストリーミングデータベースはすべての文脈で一貫性を達成できますが、これは具体的なシステムの実装に依存します。ここで、すべての分散ストリーミングデータベースの一貫性モデルを説明するのは現実的ではありませんが、RisingWaveに焦点を当ててみましょう。RisingWaveにおける一貫性はどうなっているのでしょうか？この3つの次元で探ってみましょう。

### **データベースの文脈での「一貫性」**

答えは「はい」です。RisingWaveは、内部状態が1つの有効な状態から別の有効な状態にシームレスに遷移することを効果的に保証します。ただし、RisingWaveは読み取り専用トランザクションをサポートしている一方で、異なるテーブル間での読み書きトランザクションはサポートしていません。そのため、複雑なトランザクションワークロードを管理するOLTPデータベースが必要な場合は、[MySQL](https://www.mysql.com/)や[Postgres](https://www.postgresql.org/)、[CockroachDB](https://www.cockroachlabs.com/)、[TiDB](https://www.pingcap.com/)などのソリューションの方が適しています。この設計決定には、主に2つの要因が影響しています：

- **ストリーミングデータに特化している**: RisingWaveはストリーミングデータの取り扱いを最適化するよう設計されています。完全なトランザクション機能を組み込むと、システムに大きな複雑さをもたらす可能性があります。
- **従来のOLTPデータベースとの統合**: 通常、従来のOLTPデータベースは上流でトランザクションのシリアル化を処理します。RisingWaveは下流システムとして、リアルタイム分析に集中しています。重いトランザクション処理を統合すると、特に実際の運用環境でパフォーマンスが大幅に低下する可能性があります。

![RisingWaveは上流OLTPデータベースからのトランザクションセマンティクスを保持します。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945294/3ad08883-cd4d-b2c2-56eb-415044ce8ecf.png)


さらに、RisingWaveは上流のOLTPデータベースからのトランザクションセマンティクスを理解して処理するように設計されており、金融業界などの分野で重要な機能です。

### **分散システムの文脈での「一貫性」**

答えは「はい」です。RisingWaveはさまざまな地域で高い可用性を提供できます。RisingWaveは、レプリカ間での一貫性を保証するためにPaxosやRaftのような複雑な合意形成プロトコルを実装していませんが、データストレージにS3を活用しています。S3はデータベーステーブルだけでなく、ストリーム処理の内部状態も保存しており、複数のレプリカにデータを複製して一貫性を維持します。

### **ストリーミングシステムの文脈での「一貫性」**

答えは「はい」です。RisingWaveは正確に1回セマンティクスを保証し、順序が乱れたデータ処理を巧みに管理することで、システムの中断やデータストリームの途切れに関わらず各データイベントが正確に1回処理されることを保証します。

## **まとめ**

データシステムにおける一貫性は、データベース、分散システム、ストリーミングシステムで大きく異なります：

- **データベース** はトランザクションの整合性に重点を置きます。
- **分散システム** はノード間でのデータの均一性を重視します。
- **ストリーミングシステム** は正確に1回処理されることを保証することに重点を置きます。

RisingWaveはこれらの多様なニーズに対応できる強力で適応性のある分散ストリーミングデータベースです。私たちのアプローチは、理論的な一貫性基準を遵守するだけでなく、現実世界でのアプリケーションでも優れた成果を発揮し、データの一貫性の進化する風景の中で信頼できるソリューションを提供します。