Oracle は、Linux のリモート ダイレクト メモリ アクセス (RDMA) 実装には高可用性や負荷分散などの機能が必要であると考えており、まさにそれを実現するコードをカーネルに組み込むことを望んでいます。
Oracle Linux カーネル開発者の Sudhakar Dindukurti 氏がこの投稿で説明しているように、問題は、パフォーマンスとセキュリティ上の考慮事項により、RDMA アダプターがハードウェアを「特定のポートとパス」に結び付けていることです。
一方、標準的なネットワークインターフェースカードは、netdev
パケットの送信に使用するネットワークデバイスを選択できます。フェイルオーバーと負荷分散はネイティブに実装されています。
Dindukurti 氏の取り組みは、その機能を InfiniBand と RoCE (RDMA over Converged Ethernet) NIC の両方に導入し、Oracle の Unbreakable Enterprise Kernel (UEK) から Linux ソース コードへとアップストリームに移行することを目指しています。
Resilient RDMA over IP (RDMAIP) は、アクティブ/アクティブボンディングを使用してアダプタのポート間でボンディンググループを作成し、高可用性接続を実現します。ポートが失われた場合、トラフィックはグループ内の他のポートに移動します。これは、2009年からLinuxカーネルに組み込まれているOracleのReliable Datagram Sockets (RDS) を利用して実現されます。
RDMAのチャネルボンディング、とても簡単そうです。クリックして拡大
これを Resilient RDMAIP に拡張すると、システムがパケットを送信してノードを削除できる新しいプロセスが必要になります。これは Oracle の投稿で詳しく説明されています。
- 1) クライアントアプリケーションはRDMAアダプタにメモリを登録し、RDMAアダプタは登録されたメモリ領域のR_Keyをクライアントに返します。登録情報はRDMAアダプタに保存されることに注意してください。
- 2) クライアントはこの「R_key」をリモートサーバーに送信します。
- ”3) サーバーはクライアントにRDMA_READ/RDMA_WRITEを要求する際にこのR_keyを含める”; そして
- ”4) クライアント側のRDMAアダプタは「R_key」を使用してメモリ領域を検索し、トランザクションを続行します。「R_key」は特定のRDMAアダプタにバインドされているため、同じR_KEYを使用して別のRDMAアダプタ経由でデータを送信することはできません。また、RDMAアプリケーションはカーネルを経由せずにハードウェアと直接通信できるため、従来のボンディング(カーネル内)ではHAを実現できません。”
負荷分散のシナリオでは、すべてのボンディング グループ インターフェイスに独自の IP アドレスがあり、「コンシューマー」、つまりアプリケーションまたは OS プロセスが、どのインターフェイスを使用するのが最適かを決定します。
RDMAIPはインターフェースのダウンを検知するため、フェイルオーバーが容易になります。モジュールは障害が発生したインターフェースのIPアドレスをグループ内の別のIPアドレスに移動し、RDMA通信マネージャ(RDMA CM)イベントが関連するカーネルプロセスに、使用するアドレスを変更するよう通知します。
フェイルバックも同様に処理されます。RDMAIP モジュールはトラフィックを回復されたアドレスに戻し、別の RDMA CM メッセージを送信します。
Dindukurti氏によると、このモジュールをLinuxカーネル対応にするには、Resilient RDMAIPモジュールをネットワークスタック実装とより緊密に連携させる必要があるとのことです。これにより、RDMAカーネル利用者はアクティブなボンディンググループを作成し、バインドされたグループとそのインターフェースを公開するためのAPIを提供できるようになります。®