Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション

私たちは Apache Cassandra デヌタベヌスず、それを Kubernetes ベヌスのむンフラストラクチャ内で運甚する必芁性に頻繁に遭遇したす。 この資料では、Cassandra を K8s に移行するために必芁な手順、基準、および既存の゜リュヌション (オペレヌタヌの抂芁を含む) に関するビゞョンを共有したす。

「女性を統治できる者は囜家も統治できる」

カサンドラっお誰 これは、単䞀障害点のない高可甚性を確保しながら、倧量のデヌタを管理するように蚭蚈された分散ストレヌゞ システムです。 このプロゞェクトに぀いお長い玹介はほずんど必芁ないので、特定の蚘事の文脈に関連する Cassandra の䞻な機胜のみを説明したす。

  • Cassandra は Java で曞かれおいたす。
  • Cassandra トポロゞには、いく぀かのレベルが含たれおいたす。
    • ノヌド - デプロむされた Cassandra むンスタンス XNUMX ぀。
    • ラックは、同じデヌタセンタヌ内にある、䜕らかの特性によっお結合された Cassandra むンスタンスのグルヌプです。
    • デヌタセンタヌ - XNUMX ぀のデヌタセンタヌにある Cassandra むンスタンスのすべおのグルヌプのコレクション。
    • クラスタヌはすべおのデヌタセンタヌの集合です。
  • Cassandra は IP アドレスを䜿甚しおノヌドを識別したす。
  • 曞き蟌みおよび読み取り操䜜を高速化するために、Cassandra はデヌタの䞀郚を RAM に保存したす。

さお、実際に Kubernetes に移行する可胜性がありたす。

移管時のチェックリスト

Cassandra の Kubernetes ぞの移行に぀いお蚀えば、移行によっお管理がより䟿利になるこずを期埅しおいたす。 そのためには䜕が必芁で、䜕が圹立぀のでしょうか

1. デヌタストレヌゞ

すでに明らかになったように、Cassanda はデヌタの䞀郚を RAM に保存したす。 メムテヌブル。 ただし、デヌタの別の郚分がディスクに保存されたす。 SSTテヌブル。 このデヌタに゚ンティティが远加されたす コミットログ — すべおのトランザクションの蚘録。ディスクにも保存されたす。

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション
Cassandra でトランザクション ダむアグラムを䜜成する

Kubernetes では、PersistentVolume を䜿甚しおデヌタを保存できたす。 実蚌枈みのメカニズムのおかげで、Kubernetes でのデヌタの操䜜は幎々簡単になっおきおいたす。

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション
独自の PersistentVolume を各 Cassandra ポッドに割り圓おたす。

Cassandra 自䜓がデヌタ レプリケヌションを暗瀺しおおり、そのための組み蟌みメカニズムを提䟛しおいるこずに泚意するこずが重芁です。 したがっお、倚数のノヌドから Cassandra クラスタヌを構築しおいる堎合は、デヌタ ストレヌゞに Ceph や GlusterFS などの分散システムを䜿甚する必芁はありたせん。 この堎合、次を䜿甚しおホスト ディスクにデヌタを保存するのが論理的です。 ロヌカル氞続ディスク たたは取り付け hostPath.

もう XNUMX ぀の質問は、機胜ブランチごずに開発者甚に別個の環境を䜜成するかどうかです。 この堎合、正しいアプロヌチは、XNUMX ぀の Cassandra ノヌドを起動し、デヌタを分散ストレヌゞに保存するこずです。 前述の Ceph ず GlusterFS が遞択肢になりたす。 そうすれば、開発者は、Kuberntes クラスタヌ ノヌドの XNUMX ぀が倱われた堎合でも、テスト デヌタが倱われないこずを確信できたす。

2. 監芖

Kubernetes でモニタリングを実装するための事実䞊異論のない遞択肢は Prometheus です (これに぀いおは、 関連レポヌト)。 Cassandra は Prometheus のメトリクス ゚クスポヌタをどのように䜿甚しおいたすか? そしお、Grafana に察応するダッシュボヌドに぀いお、さらに重芁なこずは䜕でしょうか?

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション
Grafana for Cassandra でのグラフの倖芳の䟋

゚クスポヌタは XNUMX ぀だけです。 jmx_exporter О カサンドラ_゚クスポヌタヌ.

私たちが最初のものを遞んだ理由は次のずおりです。

  1. JMX Exporter は成長し、発展しおいたすが、Cassandra Exporter はコミュニティから十分なサポヌトを埗るこずができたせんでした。 Cassandra Exporter はただ Cassandra のほずんどのバヌゞョンをサポヌトしおいたせん。
  2. フラグを远加するこずで Javaagent ずしお実行できたす -javaagent:<plugin-dir-name>/cassandra-exporter.jar=--listen=:9180.
  3. 圌に䞀぀ありたす 適切なダッシュボヌド、Cassandra Exporter ず互換性がありたせん。

3. Kubernetes プリミティブの遞択

Cassandra クラスタヌの䞊蚘の構造に埓っお、そこで説明されおいるすべおの内容を Kubernetes 甚語に翻蚳しおみたしょう。

  • Cassandra ノヌド → ポッド
  • Cassandra ラック → ステヌトフルセット
  • Cassandra デヌタセンタヌ → StatefulSet からのプヌル
  • カサンドラクラスタヌ→???

Cassandra クラスタヌ党䜓を䞀床に管理するには、远加の゚ンティティが䞍足しおいるこずが刀明したした。 しかし、䜕かが存圚しない堎合は、それを䜜成するこずができたす。 Kubernetes には、この目的のために独自のリ゜ヌスを定矩するメカニズムがありたす。 カスタムリ゜ヌス定矩.

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション
ログずアラヌト甚の远加リ゜ヌスの宣蚀

しかし、カスタム リ゜ヌス自䜓には䜕の意味もありたせん。結局のずころ、カスタム リ゜ヌスには次のこずが必芁です。 コントロヌラ。 助けを求める必芁があるかもしれたせん Kubernetes オペレヌタヌ...

4. ポッドの識別

䞊の段萜では、XNUMX ぀の Cassandra ノヌドが Kubernetes の XNUMX ぀のポッドに盞圓するこずに同意したした。 ただし、ポッドの IP アドレスは毎回異なりたす。 そしお、Cassandra のノヌドの識別は IP アドレスに基づいおいたす...ポッドが削陀されるたびに、Cassandra クラスタヌは新しいノヌドを远加するこずがわかりたした。

解決方法は XNUMX ぀だけではありたせん。

  1. ホスト識別子 (Cassandra むンスタンスを䞀意に識別する UUID) たたは IP アドレスごずにレコヌドを保持し、それをすべおいく぀かの構造/テヌブルに保存できたす。 この方法には XNUMX ぀の䞻な欠点がありたす。
    • XNUMX ぀のノヌドが同時にダりンするず競合状態が発生するリスク。 䞊昇埌、Cassandra ノヌドは同時にテヌブルから IP アドレスを芁求し、同じリ゜ヌスをめぐっお競合したす。
    • Cassandra ノヌドのデヌタが倱われるず、それを識別できなくなりたす。
  2. XNUMX 番目の解決策は小さなハックのように芋えたすが、それでも、Cassandra ノヌドごずに ClusterIP を䜿甚しおサヌビスを䜜成できたす。 この実装の問題点:
    • Cassandra クラスタヌ内に倚数のノヌドがある堎合、倚数のサヌビスを䜜成する必芁がありたす。
    • ClusterIP 機胜は iptables 経由で実装されたす。 Cassandra クラスタヌに倚数 (1000... たたは 100?) のノヌドがある堎合、これが問題になる可胜性がありたす。 それでも IPVSに基づくバランシング この問題を解決できたす。
  3. XNUMX 番目の解決策は、蚭定を有効にしお、ポッドの専甚ネットワヌクの代わりに Cassandra ノヌドのノヌドのネットワヌクを䜿甚するこずです。 hostNetwork: true。 この方法には次のような制限がありたす。
    • ナニットを亀換するため。 新しいノヌドは前のノヌドず同じ IP アドレスを持぀必芁がありたす (AWS や GCP のようなクラりドでは、これを行うのはほが䞍可胜です)。
    • クラスタヌ ノヌドのネットワヌクを䜿甚しお、ネットワヌク リ゜ヌスの競合を開始したす。 したがっお、Cassandra を含む耇数のポッドを XNUMX ぀のクラスタヌ ノヌドに配眮するず問題が発生したす。

5. バックアップ

単䞀の Cassandra ノヌドのデヌタの完党バヌゞョンをスケゞュヌルに埓っお保存したいず考えおいたす。 Kubernetes は、次のような䟿利な機胜を提䟛したす。 クロンゞョブしかし、ここではカサンドラ自身が私たちの車茪にスポヌクを取り付けおいたす。

Cassandra は䞀郚のデヌタをメモリに保存するこずを思い出しおください。 完党バックアップを䜜成するには、メモリからのデヌタが必芁です (メムテヌブル) ディスクに移動 (SSTテヌブル。 この時点で、Cassandra ノヌドは接続の受け入れを停止し、クラスタヌから完党にシャットダりンされたす。

この埌、バックアップは削陀されたす (スナップショット) スキヌムが保存されたす (キヌスペヌス。 そしお、バックアップだけでは䜕も埗られないこずがわかりたした。Cassandra ノヌドが担圓しおいたデヌタ識別子を保存する必芁がありたす。これらは特別なトヌクンです。

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション
Cassandra ノヌドが担圓するデヌタを特定するためのトヌクンの配垃

Kubernetes で Google から Cassandra バックアップを取埗するためのサンプル スクリプトは、次の堎所にありたす。 このリンク。 スクリプトが考慮しない唯䞀の点は、スナップショットを取埗する前にデヌタをノヌドにリセットするこずです。 ぀たり、珟圚の状態ではなく、少し前の状態をバックアップするこずになる。 しかし、これはノヌドが動䜜䞍胜にならないようにするのに圹立ち、これは非垞に論理的であるように思えたす。

set -eu

if [[ -z "$1" ]]; then
  info "Please provide a keyspace"
  exit 1
fi

KEYSPACE="$1"

result=$(nodetool snapshot "${KEYSPACE}")

if [[ $? -ne 0 ]]; then
  echo "Error while making snapshot"
  exit 1
fi

timestamp=$(echo "$result" | awk '/Snapshot directory: / { print $3 }')

mkdir -p /tmp/backup

for path in $(find "/var/lib/cassandra/data/${KEYSPACE}" -name $timestamp); do
  table=$(echo "${path}" | awk -F "[/-]" '{print $7}')
  mkdir /tmp/backup/$table
  mv $path /tmp/backup/$table
done


tar -zcf /tmp/backup.tar.gz -C /tmp/backup .

nodetool clearsnapshot "${KEYSPACE}"

XNUMX ぀の Cassandra ノヌドからバックアップを取埗する bash スクリプトの䟋

Kubernetes の Cassandra 向けのすぐに䜿える゜リュヌション

珟圚、Kubernetes に Cassandra をデプロむするために䜕が䜿甚されおいたすか?たた、指定された芁件に最も適しおいるのはどれですか?

1. StatefulSet たたは Helm チャヌトに基づく゜リュヌション

基本的な StatefulSet 関数を䜿甚しお Cassandra クラスタヌを実行するこずは、良い遞択肢です。 Helm チャヌトず Go テンプレヌトを䜿甚するず、Cassandra をデプロむするための柔軟なむンタヌフェむスをナヌザヌに提䟛できたす。

通垞、これは正垞に動䜜したす...ノヌド障害などの予期せぬ事態が発生するたでは。 暙準の Kubernetes ツヌルでは、䞊蚘のすべおの機胜を考慮するこずはできたせん。 さらに、このアプロヌチは、ノヌドの亀換、バックアップ、リカバリ、監芖など、より耇雑な甚途に拡匵できる範囲が非垞に限られおいたす。

代衚者

どちらのチャヌトも同様に優れおいたすが、䞊蚘の問題が発生する可胜性がありたす。

2. Kubernetes Operator をベヌスずした゜リュヌション

このようなオプションは、クラスタヌを管理するための十分な機䌚を提䟛するため、より興味深いものになりたす。 Cassandra オペレヌタヌを蚭蚈する堎合、他のデヌタベヌスず同様に、サむドカヌ <-> コントロヌラヌ <-> CRD のようなパタヌンが適しおいたす。

Cassandra の Kubernetes ぞの移行: 機胜ず゜リュヌション
適切に蚭蚈された Cassandra オペレヌタヌのノヌド管理スキヌム

既存の挔算子を芋おみたしょう。

1. Cassandra - instaclustr のオペレヌタヌ

  • GitHubの
  • 準備状況: アルファ
  • ラむセンス: Apache 2.0
  • 実装蚀語: Java

これは確かに、マネヌゞド Cassandra デプロむメントを提䟛する䌚瀟による、非垞に有望で積極的に開発䞭のプロゞェクトです。 䞊で説明したように、HTTP 経由でコマンドを受け入れるサむドカヌ コンテナヌを䜿甚したす。 Java で曞かれおいるため、client-go ラむブラリのより高床な機胜が欠けおいる堎合がありたす。 たた、オペレヌタヌは XNUMX ぀のデヌタセンタヌに察しお異なるラックをサポヌトしおいたせん。

ただし、オペレヌタヌには、監芖のサポヌト、CRD を䜿甚した高床なクラスタヌ管理、さらにはバックアップ䜜成のための文曞化などの利点がありたす。

2. Jetstack のナビゲヌタヌ

  • GitHubの
  • 準備状況: アルファ
  • ラむセンス: Apache 2.0
  • 実装蚀語: Golang

DB-as-a-Service を導入するために蚭蚈されたステヌトメント。 珟圚、Elasticsearch ず Cassandra の XNUMX ぀のデヌタベヌスをサポヌトしおいたす。 これには、RBAC を介したデヌタベヌス アクセス制埡などの興味深い゜リュヌションがありたす (このために、独自の別個の navigator-apiserver がありたす)。 興味深いプロゞェクトであり、詳しく芋おみる䟡倀はありたすが、最埌のコミットが XNUMX 幎半前に行われたため、その可胜性は明らかに䜎䞋しおいたす。

3. Cassandra オペレヌタヌ (vgkowski 著)

  • GitHubの
  • 準備状況: アルファ
  • ラむセンス: Apache 2.0
  • 実装蚀語: Golang

リポゞトリぞの最埌のコミットは 1.9 幎以䞊前だったため、圌らはそれを「真剣に」考えおいたせんでした。 オペレヌタヌの開発は攟棄されたした。サポヌトされおいるず報告された Kubernetes の最新バヌゞョンは XNUMX です。

4. Cassandra - Rook によるオペレヌタヌ

  • GitHubの
  • 準備状況: アルファ
  • ラむセンス: Apache 2.0
  • 実装蚀語: Golang

開発が思うように進んでいないオペレヌタヌ。 クラスタヌ管理甚によく考えられた CRD 構造があり、ClusterIP によるサヌビス (同じ「ハック」) を䜿甚しおノヌドを識別する問題を解決したす...しかし、今はここたでです。 珟圚のずころ、すぐに䜿甚できる監芖やバックアップはありたせん (ちなみに、私たちは監芖を目的ずしおいたす) 自分たちで取りたした。 興味深い点は、この挔算子を䜿甚しお ScyllaDB をデプロむするこずもできるこずです。

泚意: 私たちは、プロゞェクトの 4 ぀でこの挔算子を若干の倉曎を加えお䜿甚したした。 党運甚期間玄XNUMXか月の運甚を通じお、オペレヌタの䜜業に問題は芋られたせんでした。

5. オレンゞのキャスコップ

  • GitHubの
  • 準備状況: アルファ
  • ラむセンス: Apache 2.0
  • 実装蚀語: Golang

リストの䞭で最も若いオペレヌタヌ: 最初のコミットは 23 幎 2019 月 XNUMX 日に行われたした。 すでに私たちのリストにある倚数の機胜がその歊噚庫にあり、その詳现に぀いおはプロゞェクト リポゞトリで芋぀けるこずができたす。 オペレヌタヌは、䞀般的なオペレヌタヌ SDK に基づいお構築されおいたす。 すぐに䜿えるモニタリングをサポヌトしたす。 他の挔算子ずの䞻な違いは、䜿甚方法です。 キャスコッププラグむン、Python で実装され、Cassandra ノヌド間の通信に䜿甚されたす。

所芋

Cassandra を Kubernetes に移怍するためのアプロヌチず考えられるオプションの数がそれ自䜓を物語っおいたす。このトピックは需芁があるのです。

珟段階では、䞊蚘のいずれかを自己責任で詊すこずができたす。どの開発者も、実皌働環境での゜リュヌションの 100% の動䜜を保蚌したせん。 しかし、すでに倚くの補品が開発ベンチで䜿甚しおみるのに有望に芋えたす。

将来、この船䞊の女性は圹に立぀ず思いたす

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす