# Atomix
Atomixは、[[ONOS]] が内部に持つ分散key/valueストアである。単なるストアにとどまらず、分散システムを構築するための汎用ツールとしても正確に説明できる、Javaベースのシステムである。Atomixが採用するコンセンサスアルゴリズムはRaft(Diego OngaroとJohn Ousterhoutの論文で詳述)であり、Atomixはこのコアのraftアルゴリズムを超えて、分散状態管理とアプリケーションからの容易なアクセスを可能にする豊富なプログラミングプリミティブを提供する。この分散アプローチは、リクエストワークロードを処理できるだけの仮想化インスタンス上で稼働する点で「スケーラブル」、障害発生時にもサービスを継続できるだけの十分なインスタンス上で稼働する点で「高可用」なシステムを実現するという、現代のクラウドサービスに共通する一般的な設計パラダイムである。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 6 Network OS]] ch.6 §6.2)
## プリミティブ
Atomixは以下を含むサポートを提供する。
- **分散データ構造**: map・set・tree・counterを含む。
- **分散通信**: 直接メッセージングとpublish/subscribeを含む。
- **分散協調**: ロック・リーダー選出・バリアを含む。
- **グループメンバーシップの管理**。
代表的なプリミティブとして`AtomicMap`と`DistributedMap`があり、いずれもJavaの`Map`ユーティリティを拡張したメソッド群を持つ。`AtomicMap`は楽観的ロックによる原子的な更新を行い、すべての操作が原子的であることを保証する(各値は単調増加するバージョン番号を持つ)。対して`DistributedMap`は保証された一貫性ではなく結果整合性(eventual consistency)をサポートする。両プリミティブとも、対応するmapへの変更をイベントベースで通知する仕組みを持ち、クライアントは挿入・更新・削除エントリのイベントリスナーをmapに登録して監視できる。mapはONOSが多用する主力プリミティブである。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 6 Network OS]] ch.6 §6.2.1)
## ONOSインスタンスの協調
Atomixは、ONOSインスタンス群相互の協調にも用いられる。第一に、水平スケール可能なサービスとして稼働するONOSインスタンス数は、ワークロードと障害時の可用性確保に必要なレプリケーションレベルに依存するため、Atomixのgroup membershipプリミティブが稼働中インスタンス集合の把握(新規起動インスタンスの検知、障害インスタンスの検知)に用いられる。なお、ONOSインスタンスの集合とAtomixインスタンスの集合は別個であり、両者は独立にスケールできる。第二に、各ONOSインスタンスの主要な役割はネットワーク中の物理スイッチの部分集合を監視・制御することであり、ONOSはスイッチごとにmasterインスタンスを選出するアプローチを取る。masterのみが対象スイッチへ制御命令を発行(書き込み)し、全インスタンスがスイッチ状態を監視(読み取り)できる。このmaster選出にはAtomixのleader-electionプリミティブが用いられ、ONOSインスタンスが障害を起こした場合や新規スイッチがオンラインになった場合にも同じプリミティブで(再)選出が行われる。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 6 Network OS]] ch.6 §6.2.1)
## ONOSサービスとの関係
ONOSの多くのサービス(Topology・Device・Link Serviceなど)は、Atomixに実装された対応するテーブル(map)の上にサービスとして提供される。テーブルとサービスは同じものを2つの視点から見たものであり、一方は key/value ペアの集合、他方はアプリケーションや他サービスがそれらのペアと相互作用するインターフェースである。Cluster ServiceはAtomixクラスタノードおよび全ピアONOSノードの情報を提供し、Atomixノードがコンセンサスの基盤となる実際のクラスタを形成する一方、ONOSノードは制御ロジックとI/Oをスケールさせるための実質的なクライアントに過ぎない。個々のアプリケーションはこのサービス集合を独自サービスで拡張し、独自の分散ストアで実装を裏付けることも自由であり、そのためONOSはアプリケーションに`AtomicMaps`・`DistributedMaps`などのAtomixプリミティブへの直接アクセスも提供する。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 6 Network OS]] ch.6 §6.2.2)
ONOSの規模拡張においても、複数のONOSインスタンスはAtomixを介してネットワーク状態を共有する。あるインスタンスが障害を起こすと、残りのインスタンスがAtomixのleader-electionプリミティブを用いて代替インスタンスを選出し、高可用性を確保する。マイクロサービス指向の後継であるμONOSでは、Atomixは独自のマイクロサービスとしてカプセル化される。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 6 Network OS]] ch.6 §6.5)
## 第7章での利用例
[[SD-Fabric]] は、リーフ-スパイン間のECMPグループ集合の管理に独自のAtomixマップを使う。(Source: [[SD-Fabric]])
## 関連
- [[ONOS]] — Atomixを分散コアとして採用するネットワークオペレーティングシステム
- [[SD-Fabric]] — 独自のAtomixマップでECMPグループ集合を管理するONOS上の制御アプリケーション群
## 出典
- Peterson, Cascone, O'Connor, Vachuska, and Davie, *Software-Defined Networks: A Systems Approach*, 2021, Chapter 6, §6.2, §6.2.1, §6.2.2, §6.5.