Ceph分散ストレージのカーネルクライアントの詳細な分析

Ceph分散ストレージのカーネルクライアントの詳細な分析

クラウド コンピューティングの発展により、Ceph はストレージ業界における Linux オペレーティング システムと同様に、最も人気のある分散ストレージ システムになりました。 Ceph はブロックストレージ、ファイルストレージ、オブジェクトストレージを統合しており、幅広いシナリオに適用でき、多くのユーザーが利用しています。この記事では、カーネルにおける Ceph クライアントの実装を紹介し、特別に中国語に翻訳されています。

[[318499]]

Ceph は、Salesforce でブロック ストレージ サービスとして使用されているオープン ソースの統合分散ストレージ システムです。 Ceph のブロック ストレージは、データ デーモンから直接 (ゲートウェイを経由せずに) データを読み書きできるクライアント モジュールを通じて実装されます。クライアント統合エコシステムに応じて、クライアントを実装する方法は 2 つあります。

  • librbd (ユーザーモード)
  • krbd (カーネルモード)

Librbd は通常、仮想マシン環境 (KVM や QEMu など) で使用され、krbd はコンテナーやベアメタル環境で使用されます。 Salesforce では、Ceph を Docker コンテナとして使用し、アプリケーション コンテナが実行されるホストに krbd モジュールをインストールします。

この記事では、Ceph カーネル クライアントの内部について説明します。この記事で取り上げる内容は次のとおりです。

  • 初期化
  • カーネルモジュールがCeph設定を取得する方法
  • 構成を処理するためのコードエントリポイント
  • 接続処理
  • 安全性
  • 接続ステートマシン

krbd 初期化

krbd はカーネル モジュールです。カーネル内にブロックデバイスとして実装されています。 Ceph クライアント全体はカーネル モジュールとして実装されています (ユーザー モードのプロセスやデーモンは関連付けられていません)。

Ceph クライアントは、クラスターへの接続方法を認識するための構成ファイル (ceph.conf) を必要とし、クラスターのプロパティを認識する必要があります。この構成ファイルには通常、モニターの IP アドレス、ユーザー証明書、および Ceph 認証 (Cephx) のセキュリティ プロパティが含まれます。これらのすべての構成は、初期化中にカーネル モジュールにロードする必要があります。これが完了すると、イメージまたはボリュームのライフサイクル、接続管理、認証、ステートマシンなどの残りの実装はすべてカーネル モジュールで実行できるようになります。

Ceph 設定をカーネルモジュールにプッシュする

ceph-deploy を実行してクライアントをインストールすると、Ceph クライアント (rbd で始まるコマンド) CLI コマンドによって呼び出されるバイナリがインストールされます。

rbd CLI

最初のクライアント コマンドは次のとおりです。

  1. rbd map <デバイス名> --pool <プール名>  

デフォルトでは、rbd は設定ファイル /etc/ceph/ceph.conf から設定情報を読み取ります。ファイルには、モニター アドレス (クライアントはこのアドレスを使用してモニターに接続します)、OSD アイドル タイムアウト、OSD タイムアウト、OSD 要求タイムアウト、暗号化などの情報が含まれています。設定オプションの完全なリストは、http://docs.ceph.com/docs/jewel/man/8/rbd/#kernel-rbd-krbd-options にあります。

OSD

krbd 初期化

rbd mapコマンドラインコマンドは、実際にceph.confファイルの内容を読み取り、Linuxの「バス」インターフェース(/sys/bus/)を介してceph.confファイルにマッピングします。 - このシナリオでは、/sys/bus/rbd/add がこれらの構成情報を krbd カーネル モジュールにプッシュします。

依存関係をここで定義します: https://github.com/torvalds/linux/blob/master/include/linux/device.h

バスは、プロセッサと 1 つ以上のデバイス間のチャネルです。目的は、すべてのデバイスがバス (内部の仮想プラットフォーム バスも可能) で接続されるデバイス モデルを実装することです。バスは相互に接続できます。たとえば、USB コントローラーは通常、PCI デバイスです。デバイス モデルは、バスとそれが制御するデバイス間の実際の接続を表します。

Linux デバイス モデルでは、bus_type 構造体はバスを表し、linux/device.h で定義されます。構造は次のとおりです。

この実装のソースコードは、次の ceph/ceph git リポジトリにあります: https://github.com/ceph/ceph/blob/master/src/krbd.cc

KRBD構成分析

カーネル モジュールでは、構成ファイルを処理するためのエントリ ポイントは drivers/block/rbd.c (https://github.com/ceph/ceph-client/blob/for-linus/drivers/block/rbd.c) で定義されています。

静的 ssize_t rbd_add(構造体 bus_type *bus、const char *buf、size_t カウント)

接続設定

カーネル モジュールは、モニターおよび OSD との TCP 接続の確立、これらの接続の検出、問題発生時の接続の再確立、および認証を完全に担当します。この作業はすべてカーネル内で実行されます。

月曜日クライアント初期化

エントリ関数: ceph_monc_init()

この関数は、まずマウント時に提供された IP アドレスを使用して一時的な monmap (build_initial_monmap()) を構築します。この操作は、クライアントがモニターとの新しい接続を確立したときに発生します。その後、認証データ構造を初期化し、接続後の初期ハンドシェイクを完了するために次のメッセージをさらに準備します。

  • CEPH_MSG_MON_SUBSCRIBE (メッセージID: 15)
  • CEPH_MSG_MON_SUBSCRIBE_ACK (メッセージ ID: 16)
  • CEPH_MSG_AUTH (メッセージ ID: 17)
  • CEPH_MSG_AUTH_REPLY (メッセージID: 18)

接続の初期化

エントリ関数: ceph_con_init()

この時点で、ceph_con_init() 関数 (net/ceph/messenger.c 内) が呼び出され、モニターとの接続の初期化が完了し、接続はステート マシンを介して変換されます。 ceph_con_init() はソケットを初期化し、接続を非同期的に設定するワークキュー関数を開始します。

ceph_con_workfn() 関数は、接続を次のソケット状態 (ceph_connection -> sock_state) で処理し、ESTABLISHED 状態に移行します。

  1. /*
  2. * ソケット状態 - 遷移(接続状態はソケット状態異なります
  3. * --------  
  4. * |新着* |一時的な初期状態
  5. * --------  
  6. * | con_sock_state_init()
  7. * ヴ
  8. * ----------  
  9. * |閉店 |初期化されましたが、ソケットがありませんそして いいえ 
  10. * ---------- TCP接続)  
  11. * ^ \
  12. * | \ con_sock_state_connecting()
  13. * | ----------------------  
  14. * | \
  15. * + con_sock_state_closed() \
  16. * |+ ------------------------ \  
  17. * | \ \ \
  18. * | ----------\ \  
  19. * | |閉会 |ソケットイベント; \ \
  20. * | ----------- クローズを待つ \ \  
  21. * | ^ \ |
  22. * | | \ |
  23. * | + con_sock_state_closing() \ |
  24. * | / \ | |
  25. * | / ---------------- | |  
  26. * | / \ v v
  27. * | / --------------  
  28. * | / ------------------|接続 |ソケットが作成されました。  
  29. * | | / -------------- TCP接続 
  30. * | | |開始した
  31. * | | | con_sock_state_connected()
  32. * | |ヴ
  33. * -------------  
  34. * |接続 | TCP接続が確立されました
  35. * -------------  
  36. *
  37. * 状態  ceph_connection->sock_stateの場合; NEW は0みなさます。
  38. */
  39. /*
  40. *接続状態 - 遷移
  41. * --------  
  42. * |閉店 |< ----<------------------<-----------<-  
  43. * -------- | | |  
  44. * | |失敗について| |
  45. * ヴ | | |
  46. * -------- | | |  
  47. * ---->|プレオープン |---- | |  
  48. * | -------- ^ ^  
  49. * | | ceph_tcp_connect() 関数 | |
  50. * |ヴ | |
  51. * ^ ------------- | |  
  52. * | |接続 | ----------------------- |  
  53. * | ------------- |  
  54. * | |読む プロセスバナー ( "ceph v027" )、|
  55. * | |ピア送信する機能準備する|
  56. * | | |
  57. * |ヴ |
  58. * | -------------- |  
  59. * | |交渉中 | ----------------------------------  
  60. * | --------------  
  61. * ------- | connect_reply、認証機能の読み取り 
  62. * |スタンバイ| |仲間から
  63. * ------- |  
  64. * |ヴ
  65. * | -----  
  66. * < ----- |開く |--------------------------------------->  
  67. * ----- (最終ハンドシェイク確認応答を完了)  
  68. *

接続コールバック登録

次のデータ構造は、include/linux/ceph/messenger.h で定義されています。このデータ構造は、モニター接続 (OSD への接続を含む) で接続イベントを処理するためのコールバック関数を定義します。

クライアントが接続されると、次のようなメッセージが届きます。

Mon マップ (net/ceph/mon_client.c の ceph_monc_handle_map())

Osd マップ (net/ceph/osd_client.c の ceph_osdc_handle_map())

Ceph クライアント構成ファイルにクラスター内のすべてのモニターに関する情報が含まれている場合、クライアントはすべてのモニターとの接続を確立します。ただし、クラスター内に 5 つのモニターがあるが、構成ファイルにはモニターが 1 つしかない場合です。この時点で、クライアントは構成ファイル内のモニターとの接続を確立します。モニターとの接続が中断された場合、クライアントはモニターをランダムに選択して接続を確立します (クライアントは受信した monmap を通じてすべてのモニターのリストを取得します)。

モニター接続によって OSD クライアント データ構造と接続の作成がトリガーされると、クライアントは OSD マップに関する情報を受け取ります。

カーネルソースディレクトリ内のkrbd

ソースファイル:

  • ドライバー/ブロック/rbd.c
  • ドライバー/ブロック/rbd_types.h
  • ネット/セフ/

ヘッダーファイル:

インクルード/Linux/Ceph

パッケージ

この記事では、Ceph クライアント krbd について詳しく説明し、カーネルでの実装について説明します。同時にカーネルに実装されている各種クライアント機能のエントリ関数も紹介します。

結論

この記事では、Ceph クライアントのブロック ストレージ部分の初期化と実装の詳細について説明します。 Ceph にはカーネル内の別の部分、有名な Ceph ファイル システムがあります。この部分の内容は比較的複雑なので、翻訳者は後ほど別の記事を書いて紹介する予定です。

さらに、Linux カーネルにおける Ceph の内容には主に 3 つの側面があることを付け加えておきます。 1 つ目は、ブロック デバイスの実装である krbd の実装 (drivers/block/rbd.c 内) です。 2 つ目は、NFS に似た Ceph ファイル システム (fs/ceph ディレクトリ内) の実装です。ネットワーク経由で Ceph クラスター分散ファイルシステムへのアクセスを実装します。 3 番目はネットワーク部分 (net/ceph ディレクトリ内) で、これはパブリックであり、ブロック デバイスとファイル システムの両方で使用されます。

<<:  分散システムにおける「ゴースト再発」を解決するにはどうすればよいでしょうか?

>>:  DevOps がクラウド コンピューティングに影響を与える 5 つの領域

推薦する

ユニクロ:オンラインとオフラインを融合した「型破りな」ゲームプレイで、最も成熟したO2Oモデルを創出

ユニクロといえば、北京や上海などの都市の主要ショッピングモールに店舗が頻繁に出店していることに加え、...

マイクロVMはフルVMとコンテナの間のギャップを埋める

仮想マシン (VM) とコンテナは現在主流のテクノロジーですが、どちらにも欠点があり、モビリティの低...

Baiduに含まれる新しいウェブサイトの調査

過去 1 か月ほど、Baidu は新しいサイトの登録を減速させています。監査パラメータはより厳しくな...

[韓国] 2019年に推奨される最も安価な韓国のVPS。低予算/高コストパフォーマンスを求める人に適しています。

最も安い韓国のVPS、安い韓国のVPSをお勧めします!韓国で最も安い VPS はどれですか?最も安い...

2020 年のクラウド コンピューティングにおける 10 大トレンド

2020 年に見られるクラウド コンピューティングの主要トレンド テーマには、人工知能、自動化、マル...

アリペイ、P2P資金移動協力を一時停止:新たな契約は締結されない

「アリペイのコンプライアンス部門は最近、すべてのP2P資金フロー協力にいくつかの調整を加えることを決...

中国オープンソースクラウドコンピューティングカンファレンス:OpenStackが最も人気

12月6日、北京で第3回中国オープンソースクラウドコンピューティングカンファレンスが開催され、オープ...

tmhhost: 春節期間中20%割引、米国3ネットワークcn2 gia(+200g高防御)、日本ソフトバンク100M、200M香港BGP、鎮江BGP高防御

tmhhost の 20% オフの春節プロモーションが始まりました: (1) ロサンゼルス VPS、...

産業用不動産ウェブサイト運営の3つの要素の詳細を理解し、ウェブサイトの成功を支援します

わが国の経済の急速な発展に伴い、実体のある企業が大量に出現し始めています。このような背景から、多くの...

外国貿易B2Bプラットフォームで製品を宣伝するにはどうすればよいですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています今日は、外...

アリババが知識蒸留法を革新、その論文がトップカンファレンスCVPR 2022の口頭発表に選出

6月23日、アリババDAMOアカデミーの自動運転実験室は知識蒸留法を革新し、複数のコンピュータービジ...

ウェブサイトを飛躍させるための究極の内部リンクをw3schoolから作成する方法

ウェブサイトを構築したことがある人なら、誰でもw3schoolのチュートリアルサイトを訪れたことがあ...

contabo-99.99 ユーロ/2xE5-2620v3/128G メモリ/1Gbps/無制限トラフィック/ドイツ

今日はドイツのコンタボから超巨根の金持ち2人を紹介します。超高構成、超安価、1Gbps無制限のトラフ...

KVMの概念、アーキテクチャ、機能、一般的なツール、仮想化の展開に関する詳細な説明

[[326014]]概要一般的に、仮想化には 2 つのタイプがあります。ハイパーバイザーはホストのロ...