ByteDoc 3.0: MongoDB クラウド ネイティブ プラクティス

ByteDoc 3.0: MongoDB クラウド ネイティブ プラクティス

著者: 李嘉軍

背景

この記事では、Bytedoc 3.0 のクラスター配信に関するコンテンツと、クラウド ネイティブのプラクティスの一部を紹介します。Bytedoc 3.0 とクラウド ネイティブの機能を組み合わせて、ソフトウェア レイヤーの機能と一致し、Bytedoc 3.0 の「弾力性」機能を最大限に活用する、すぐに使用できるクラスターをユーザーに提供する方法について説明します。

問題点

データベース サービスを使用するのは、ユーザー (ビジネス) と DBA (運用と保守) の 2 者です。運用・保守能力を継続的に強化することによってのみ、ユーザーにより良いサービス体験を提供することができます。

ユーザーのニーズ

運用および保守要件

目標とアイデア

ターゲット

上記の問題を解決するために、Bytedoc 3.0 ソフトウェア レイヤーには関連機能が実装されています。全体的な「弾力性」機能と一致するように、配信層で同様の機能を提供する必要があります。

目標 1:データベースはスレーブを迅速に拡張/回復し、データベースの読み取り機能を数秒で拡張できます。スレーブ インスタンスの拡張は、高度に自動化され、可能な限り高速に行われる必要があります。

目標 2:コンピューティング リソースをオンデマンドで拡張できます。コンピューティング集約型のビジネスでは、コンピューティング リソースを迅速に拡張し、実際の負荷に合わせてユーザーにさらに多くのリソースを割り当てることができます。

目標 3:コンピューティング/ストレージ リソースの使用率を改善し、ビジネス使用コストを削減します。

目標 4:より標準化された配信機能とより高い配信品質により、ユーザーに優れたデータベース サービスを提供します。

実装のアイデア

私たちは、Kubernetes をクラウドネイティブにすることで目標を達成します。

Kubernetes は、コンテナ化されたアプリケーションの展開、スケーリング、管理を自動化するための、業界全体にわたるオープンソースのオーケストレーション システムです。簡単に言えば、サービス(この場合は Bytedoc データベース サービス)を体系的にパッケージ化し、実行し、管理することができます。これにより、既存の運用および保守の経験を​​業界全体のサービス配信/管理ソリューションと組み合わせて、より優れた高品質のデータベース サービスを提供できるようになり、Bytedoc 3.0 の「弾力性」を最大限に活用できるようになります。

ByteDoc 1.0 の時代では、ほとんどのデータベース サービス インスタンスは仮想マシンに直接デプロイされていました。仮想マシン仕様の分割によりリソース割り当てが制限され、マシンリソースをオンデマンドで柔軟に割り当てることができず、ほとんどのマシンリソースがアイドル状態となり、有効活用できない状況となっていました。同時に、コンピューティングとストレージのリソースが制限されていたため、1.0 の自社開発デプロイメント プラットフォームでコンテナ化されたデプロイメントを実装することは非常に困難であり、仮想マシン デプロイメント ソリューションが保持されました。

ByteDoc 3.0 が登場するまでは、データはストレージ層に移動され、サービスを提供する際にはコンピューティング層でのリソース割り当てに重点が置かれ、コンテナ化された展開モデルが実現可能になりました。 Kubernetes のコンテナ展開および管理ソリューションと組み合わせて、コンテナの自動管理操作の大部分を Kubernetes コントローラーに引き渡し、クラスター展開、スレーブ拡張などの ByteDoc 3.0 サービス オーケストレーション プロセスに重点を置き、3.0 の「弾力性」機能を十分に発揮できるようにしました。

クラウドネイティブ実践

サービスをクラウドネイティブにすることは、実際には「移行」プロセスであり、既存のサービスをパッケージ化、実行、管理し、Kubernetes によって提供されるソリューションに基づいてそれらを再現することが含まれます。

Kubernetes では、ByteDoc 3.0 クラスターをカスタム リソース (CustomResource) として定義します。データベース サービスを提供すると、実際にリソースが作成されます。 K8s の組み込みワークロード リソースと同様に、カスタム リソースも管理するためのコントローラーが必要です。このタイプのコントローラーは通常、オペレーターと呼ばれます。

したがって、ByteDoc 3.0 クラウドネイティブ実践の鍵は、ByteDoc Operator を構築することです。

Kubernetes の基本概念

コンテナ化された展開

前述のように、Kubernetes はコンテナのライフサイクル管理を主な役割とするコンテナ オーケストレーション システムであるため、実際のアプリケーションは事前にコンテナ イメージにパッケージ化して、K8s に配信して使用できるようにする必要があります。

ポッド

https://kubernetes.io/zh/docs/concepts/workloads/pods/

パッケージ化されたコンテナは最終的に Pod 内で実行され、Pod によって管理されます。

Pod は、K8s に組み込まれている最も基本的なリソースの 1 つであり、デプロイメントのための最小のコンピューティング ユニットです。これは、マシン リソースを共有するコンテナーのグループに例えることができます。

例外により Pod (内部のコンテナ) が終了した場合、通常、Pod は削除され、破棄され、高度なワークロードは Pod を「再起動」するのではなく、新しい Pod を作成して置き換えます。

高度なワークロード

通常、構築する Operator は Pod を直接作成しません。代わりに、K8s によって提供される高度なワークロード リソースを使用します。これにより、ポッドを作成し、基本的なリソース管理機能を提供できるようになります。

展開:

通常はステートレス サービス用に、指定された数の同一 Pod を維持します。

ステートフルセット:

ポッドのグループも維持されます。特別なのは、各ポッドに安定したネットワーク識別子があることです。このシナリオでは、Pod が破棄されて再構築されると、外部ユーザーには Pod が「再起動」されたように見えるため、通常はステートフル サービスに使用されます。

K8sとのやり取り方法

Kubernetes コントロール プレーンの中核は API サーバーです。 API サーバーは、ユーザー、クラスターのさまざまな部分、およびクラスター外部のコンポーネントが相互に通信するための HTTP API を提供する役割を担います。

一般的に言えば、K8s とのやり取りは命令型ではなく宣言型で行われます。

 # サンプル. ヤム
apiバージョン: アプリ/ v1
種類: デプロイメント
メタデータ:
名前: nginx - デプロイメント
仕様:
セレクター:
マッチラベル:
アプリ: nginx
最小準備秒数: 6
テンプレート
メタデータ:
ラベル:
アプリ: nginx
仕様:
コンテナ:
- 名前: nginx
イメージ: nginx : 1.14.2
ポート:
- コンテナポート: 80

Kubernetes 上の ByteDoc 3.0 アーキテクチャ

(ByteDoc クラシック アーキテクチャ、3 つの部分から構成)

モンゴス:

  • プロキシ層は、ユーザー要求の転送と単純な処理を担当します。
  • Config Server を認識し、そこからシャード トポロジを取得する必要があります。

設定サーバー:

  • マスターとスレーブを区別するレプリカ セット モード。
  • 各シャード内のインスタンスのアドレスを含むクラスターのメタデータを保存します。

シャード:

  • マスターとスレーブを区別するレプリカ セット モード。
  • サーバー層はユーザー要求を処理します。

  • mongos - ステートレスサービスに対応するデプロイメント
  • config server/shard - ステートフルセット、ステートフルサービスに対応

mongo のレプリカ セットの場合、レプリカ セット メンバーは、他のレプリカ セット メンバーと通信するために、ネットワーク識別子 (ホスト、DNS、サービス検出、ヘッドレス サービスなど) を使用して構成に登録する必要があります。そのため、ここでは、StatefulSet によって提供される安定したネットワーク識別子をメンバー名として使用し、データベース インスタンス (対応するポッド) に障害が発生した後、同じ ID でレプリカ セットに追加され、正常にサービスが提供されるようにします。

連邦モデル

複数のコンピュータルームのシナリオにおけるアーキテクチャ

実際、上記の ByteDoc 3.0 クラスターは、単一のコンピュータ ルーム内のアーキテクチャです。オンライン本番環境では、複数のコンピュータ ルームの災害復旧シナリオも考慮する必要があります。複数のコンピュータ ルームのシナリオでは、3 つのレプリカを持つクラスターが必要であり、各コンピューティング インスタンスは異なるコンピュータ ルームに展開されます。ただし、これらのレプリカは同じレプリケーション セット内にある必要があります。いくつかのクロス K8s ソリューションを参照した後、次のマルチコンピュータ ルーム アーキテクチャを採用しました。

候補となるクロス K8s ソリューションは何ですか?

1. コミュニティによって提供される Federation V1 ソリューション (非推奨、後に V2 ソリューションに改善)

  • 複数のクラスタの管理をサポートするために、主にクラスタ間リソース同期とクラスタ間サービス検出という2つの主要な機能を提供します。

2. クラウドネイティブSREチームが提供する一般的なオペレータソリューション

 ...
仕様:
チャート:
- 名前: nginx
チャート: チャート/ nginx
​​: '"replicaCount": "{{ .replica_count | デフォルト 1 }}"'
クラスター:
- 配置:
- 名前:
- クラスター- サンプル
実行ジョブ:
- 名前: ls
指示
-ls
- 「-l」
必須:
- チャートnginx
変数:
レプリカ数: '2'
  • 一連のチャート、K8s クラスター、実行タスク、変数を定義する
  • ユニバーサルオペレーターを介して複数のK8sクラスター上でリソースの展開とタスクの実行を完了します。

3. MongoDBが提供するCross-K8sソリューション

  • MongoDB の追加の k8s-agent を使用して、クロス K8s クラスター シナリオでレプリカ セットとクラスターの構築を完了します。
  • コードはオープンソースではない

なぜ今このオプションを選んだのですか?

私たちの現在のソリューションは、実際にはコミュニティの Federation ソリューションに似ています。私たちは以下の機能を通じて完全な ByteDoc 3.0 クラスターを構築します。

  • リソースの複製:オペレーターはワーカーK8に接続し、基本的に同じリソースを作成します。
  • サービス検出:特定のネットワーク シナリオに応じて、オーバーレイ ネットワークを使用する場合は、コミュニティでサポートされているヘッドレス サービスを使用できます。アンダーレイ ネットワークを使用する場合は、追加のサービス検出機能が必要になります。
  • ByteDoc クラスターの構築:インスタンスのクラスターを構築するコア ロジックは比較的複雑であり、タスクの形式で実装するのは簡単ではありません。

そのため、この Meta Operator ソリューションを選択し、ワーカー K8s を通じてリソースを作成し、Operator がクラスター構築作業を完了します。

望ましい状態を達成する

 仕様:
グローバル:
チャートバージョン: "1.0.0.0"
バイトドキュメントバージョン: "3.0"
画像「example_image」
モンゴス:
レプリカ数: 2
リソース
制限:
CPU : "4"
メモリ: 2Gi
リクエスト:
CPU : "1"
メモリ: 1 Gi
シャード:
破片数: 1
レプリカ数: 4
...
設定:
レプリカ数: 3
...
配置:
- 名前: vdc1
vdc : "vdc1"

では、ByteDoc 演算子は実際にどのようなロジックを実行するのでしょうか? Operator は実際に K8s コントローラーの設計コンセプトを満たしています。つまり、各リソース オブジェクトには予想される状態があり、Operator はリソース オブジェクトを予想される状態に調整する必要があります。この調整プロセスは「調整」と呼ばれます。

詳しく見てみると、ByteDoc クラスターは 3 つのコンポーネントに分かれていることがわかります。 Mongos、構成サーバー、およびシャード コンポーネントがすべて目的の状態に到達し、最終的にコンポーネントが「接続」されれば、クラスター全体も目的の状態に到達します。

したがって、クラスター全体の調整を複数のモジュールの調整に分解できます。それぞれの小さなモジュールが期待される状態に達すると、クラスター全体も期待される状態に達します。 bytedoc 演算子は、おおよそこの設計概念に基づいています。

したがって、当社のオペレーターの一般的なプロセスは次のとおりです。

ステータス管理

https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/kubernetes-objects/#object-spec-and-status

名前が示すように、Status はリソース オブジェクトの現在のステータスを保存するために使用されます。ステートマシンや小さなストレージとして使用できます。以下を達成するために使用できます:

  1. 1回限りの操作の完了ステータス: 初期化が完了したかどうかなど
  2. イメージ/サービスバージョン
  3. コンポーネントのステータス
  4. クラスタのアップグレード進行状況の制御
  5. バックアップ進捗管理
  6. リソースの変更は完了しましたか?
  • 通常、観察されたフィールドで記録される世代
  • クラスター CR に変更を加えると、メタデータの世代数は +1 になります。オペレーターは、この変更の予想される状態に達したときに、CR 変更が完了したかどうかを照会できるように、等しい observedGeneration カウントを設定する必要があります。
 状態
レプリカセット:
ll2022 - シャード- 0 :
列をなして
シャードとして追加: true
初期化済み: true
読み取り専用: true
準備完了: 3
サイズ: 3
ステータス: 準備完了
配置:
vdc1 :
準備完了: 3
サイズ: 3
ステータス: 準備完了
vdc : vdc1
...

リソース テンプレート管理 - Helm

前述のように、各 ByteDoc コンポーネントは実際には K8s 組み込みリソースによって管理されます。通常、CR yaml ファイル全体を最初から書き直す必要はありません。 mongos インスタンスの数、CPU、メモリ リソースの制限など、固定テンプレート内の動的パラメータを調整できます。

この時点から、エンジニアリング実装には 2 つの方向があります。

  • YAML テンプレートをコードにハードコードし、変数の置換を通じてターゲット リソース ファイルを生成します。
  • yaml テンプレートをファイルの形式で保存し、文字を置き換えることで対象のリソース ファイルを生成します。

テンプレートのレンダリングとリソースの公開

私たちは、Helm (コード) を使用して組み込みリソース ファイルのレンダリングを管理し、オペレーター イメージで公開するという、2 番目の方法のよりエレガントなバージョンを採用しました。私たちは、Helm 標準に従って一連のチャート ファイルを維持しました。

リソースを作成するときは、helm sdk を使用してパラメーターをチャート テンプレートにレンダリングし、実際のリソース yaml を生成して、ワーカー K8s クラスターに公開します。オペレーターは、変更の実行を続行する前に、リソースが完全に準備されるまで待つだけです。

テンプレートのバージョン管理

このソリューションのもう 1 つの優れた機能は、さまざまなバージョンのチャート テンプレートを、バージョンに応じて異なるディレクトリに分けて保存できることです。

チャート テンプレートの新しいバージョンをリリースする必要がある場合でも、サービスの古いバージョンは影響を受けません。新しく作成されたサービスでは、新しいバージョンのチャート テンプレートを使用できます。

誤操作の防止

K8s の導入により、多くの利便性を備えたクラスターの提供/管理が可能になりますが、実際には諸刃の剣でもあります。ほとんどのクラスターは不注意により誤操作される可能性があり、その結果、データベース サービスの可用性が低下します。

考えられるシナリオは次のとおりです。

  • クラスター リソース オブジェクトを誤って削除すると、サービスのダウンタイムが発生します。
  • インスタンスが誤って 0 にスケールダウンされる -> サービスを提供できるインスタンスがない
  • 誤って CRD を削除すると、対応するすべてのリソース オブジェクトが削除され、すべてのサービスがオフラインになります。

ファイナライザー

https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/finalizers/

これは、誤って削除されるのを防ぐための K8s のネイティブ ソリューションです。それはマーカーです。削除を伴うすべての操作では、ファイナライザーがあるかどうかを確認する必要があります。

  • ファイナライザーが存在する場合、API サーバー経由のすべてのリソース削除リクエストは、ファイナライザーがクリアされるまでブロックされます。
  • 通常、ファイナライザ タグは対応するオペレータによって管理され、変更が発生するたびにファイナライザ タグがチェックされ、追加されます。
  • 削除要求を受信すると、削除条件が満たされているかどうかが判断されます。私たちのシナリオでは、通常、7 日間の削除クーリングオフ期間を待つ必要があるため、誤って削除操作を行った場合は、7 日以内に復元する必要があります。

スケールダウンするインスタンスの最小数

これは非常に簡単な解決策です。 CR スケーリングの変更を受け取ったら、その数量が 0 より大きいかどうかを確認し、利用可能なインスタンスがない極端なケースを回避するために、スケーリング = 0 を受け入れないでください。

災害復旧能力

実用的な効果

<<:  エッジコンピューティングは単なる誇大宣伝でしょうか?

>>:  2022年のクラウド大手の「エコ革命」第一歩:リベートの削減、転売の抑制、発言権の競争

推薦する

最新の広告連合ランキング

フォーラムで良い広告アライアンスを見つけるのに苦労しているウェブマスターをたくさん見てきました。ここ...

Amazon Web Services は、Gartner Magic Quadrant に 12 年連続でランクインしています。クラウド市場をどのようにリードするのでしょうか?

彼はここにいます。そして、「2022 クラウド インフラストラクチャおよびプラットフォーム サービス...

ClusterTech GroupとHuawei Cloudが共同でハイブリッドクラウドHPCソリューションを発表

3月22日、ファーウェイとClusterTech Groupは2019年ファーウェイ中国エコシステム...

王通: SEO戦略を共有しましょう

SEOの敷居は非常に低いため、SEOに取り組む人は増えています。しかし、本当にSEOが上手な人はごく...

優れた SEO 担当者になりたいなら、これらをお持ちですか?

SEO スキルや SEO 知識についてはよく話題になりますが、これらは人気があるように思われるかもし...

BurstNet-Cloud VPS 40% オフ プロモーション/3 つのデータセンター

BurstNet では、誰もが自分の VPS が本当に平均的だと思っています。ネットワークが非常に悪...

4.25 Baidu 外部リンク判定アップデート SEOer 最新対応戦略

Baidu がまたアップデートされ、また別のウェブマスターグループが落ちました! 前回のアップデート...

greencloudvps-$9/KVM/512M メモリ/250G ハードディスク/10G ポート/無制限トラフィック/DDOS 保護

マイニングをする人はたくさんいますし、大容量のハードドライブを備えた VPS を必要とする人もたくさ...

富への道を築く

人が善人と悪人に分かれるのと同じように、データベース マーケティングも、正確なデータベース マーケテ...

SEOにおけるキーワードクリック原則の簡単な分析

検索エンジンはクリック課金制で、オンライン広告の収益は異常に大きいことは誰もが知っています。しかし、...

クラウドコンピューティングの成功はITの変革にかかっている

CIO の Neil Holden 氏が Halfords グループをさらにクラウドに移行したとき、...

電子商取引は価格検索エンジンを生み出した

価格検索エンジンは、オンラインショッピングをする消費者層にサービスを提供するウェブサイトです。10年...

マイクロイノベーションの事例を読んで思うこと

マイクロイノベーションの事例を読んで思うこと昨日、Jin Cuodao 氏のマイクロイノベーション事...

Baidu 5.2より

すべての SEO 担当者は、「Baidu 11 位」という言葉を多かれ少なかれ知っていると思います。...

Admin5フォーラムのチャット活動から学んだウェブサイト構築の経験について話します

A5 チャット アクティビティは、毎週木曜日の午後 2 時 30 分から 4 時まで、admin5 ...