Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen

Mir begéinen regelméisseg d'Apache Cassandra Datebank an d'Noutwendegkeet et an enger Kubernetes-baséierter Infrastruktur ze bedreiwen. An dësem Material wäerte mir eis Visioun vun der néideg Schrëtt deelen, Critèren an bestehend Léisungen (dorënner en Iwwerbléck vun Opérateuren) fir Migratioun Cassandra zu K8s.

"Wien eng Fra regéiere kann, kann och de Staat regéieren"

Wien ass Cassandra? Et ass e verdeelt Späichersystem entwéckelt fir grouss Bänn vun Daten ze managen, wärend héich Disponibilitéit garantéiert ouni een eenzege Punkt vum Versoen. De Projet brauch kaum eng laang Aféierung, also wäert ech nëmmen d'Haaptmerkmale vu Cassandra ginn, déi am Kontext vun engem spezifeschen Artikel relevant sinn:

  • Cassandra ass op Java geschriwwen.
  • D'Cassandra Topologie enthält verschidde Niveauen:
    • Node - eng agesat Cassandra Instanz;
    • Rack ass eng Grupp vu Cassandra Instanzen, vereenegt duerch e puer Charakteristik, am selwechte Rechenzentrum;
    • Datacenter - eng Sammlung vun alle Gruppe vu Cassandra Instanzen an engem Datenzenter;
    • Cluster ass eng Sammlung vun allen Datenzenteren.
  • Cassandra benotzt eng IP Adress fir e Node z'identifizéieren.
  • Fir Schreif- a Liesoperatiounen ze beschleunegen, späichert Cassandra e puer vun den Daten am RAM.

Elo - zum aktuellen Potenzial op Kubernetes.

Check-Lëscht fir Transfert

Mir schwätzen iwwer d'Migratioun vu Cassandra op Kubernetes, mir hoffen, datt mat der Beweegung et méi bequem gëtt ze managen. Wat gëtt dofir verlaangt, wat hëlleft domat?

1. Daten Stockage

Wéi scho gekläert ass, späichert Cassanda en Deel vun den Donnéeën am RAM - in Memable. Awer et gëtt en aneren Deel vun den Donnéeën déi op der Disk gespäichert sinn - a Form SSTable. Eng Entitéit gëtt op dës Donnéeën bäigefüügt Engagement Log - Opzeechnunge vun all Transaktiounen, déi och op Disk gespäichert ginn.

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen
Schreift Transaktiounsdiagramm an Cassandra

A Kubernetes kënne mir PersistentVolume benotze fir Daten ze späicheren. Dank bewährte Mechanismen gëtt d'Aarbecht mat Daten a Kubernetes all Joer méi einfach.

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen
Mir verdeelen all Pod mat Cassandra säin eegene PersistentVolume

Et ass wichteg ze bemierken datt Cassandra selwer Datereplikatioun implizéiert, agebaute Mechanismen fir dëst ubitt. Dofir, wann Dir e Cassandra-Cluster aus enger grousser Zuel vu Wirbelen baut, da brauch Dir net verdeelt Systemer wéi Ceph oder GlusterFS fir Datelagerung ze benotzen. An dësem Fall wier et logesch Daten op der Hostdiskussioun ze späicheren lokal persistent Disken oder Montéierung hostPath.

Eng aner Fro ass ob Dir e separat Ëmfeld fir Entwéckler fir all Feature Branche wëllt erstellen. An dësem Fall wier déi richteg Approche fir ee Cassandra Node z'erhiewen an d'Donnéeën an enger verdeelerter Späichere ze späicheren, d.h. déi ernimmt Ceph a GlusterFS wäerten Är Optiounen sinn. Da wäert den Entwéckler sécher sinn datt hien Testdaten net verléiert och wann ee vun de Kuberntes Cluster Node verluer ass.

2. Iwwerwachung

Déi quasi onbestridden Wiel fir Iwwerwaachung an Kubernetes ëmzesetzen ass Prometheus (mir hunn iwwer dëst am Detail geschwat an Zesummenhang Rapport). Wéi geet et mat Cassandra mat Metrikexporter fir Prometheus? An, wat ass nach méi wichteg, mat passenden Dashboards fir Grafana?

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen
E Beispill vun der Erscheinung vu Grafiken am Grafana fir Cassandra

Et ginn nëmmen zwee Exporter: jmx_exporter и cassandra_exporter.

Mir hunn déi éischt fir eis gewielt well:

  1. JMX Exporter wiisst an entwéckelt, während Cassandra Exporter net genuch Gemeinschaftssupport konnt kréien. Cassandra Exporter ënnerstëtzt nach ëmmer net déi meescht Versioune vu Cassandra.
  2. Dir kënnt et als Javaagent lafen andeems Dir e Fändel bäidréit -javaagent:<plugin-dir-name>/cassandra-exporter.jar=--listen=:9180.
  3. Et gëtt eng fir hien adäquate Dashboard, wat mat Cassandra Exporter inkompatibel ass.

3. Kubernetes Primitiv auswielen

No der uewe genannter Struktur vum Cassandra-Cluster, loosst eis probéieren alles wat do beschriwwe gëtt an d'Kubernetes Terminologie ze iwwersetzen:

  • Cassandra Node → Pod
  • Cassandra Rack → StatefulSet
  • Cassandra Datacenter → Pool vu StatefulSets
  • Cassandra Cluster → ???

Et stellt sech eraus datt eng zousätzlech Entitéit fehlt fir de ganze Cassandra Cluster op eemol ze managen. Awer wann eppes net gëtt, kënne mir et kreéieren! Kubernetes huet e Mechanismus fir seng eege Ressourcen fir dësen Zweck ze definéieren - Benotzerdefinéiert Ressource Definitiounen.

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen
Zousätzlech Ressourcen deklaréieren fir Logbicher an Alarmer

Awer Benotzerdefinéiert Ressource selwer heescht näischt: schliisslech erfuerdert et Controller. Dir musst vläicht Hëllef sichen Kubernetes Bedreiwer...

4. Pod Identifikatioun

Am Paragraf hei uewen hu mir eis eens datt ee Cassandra Node gläich ass wéi ee Pod a Kubernetes. Awer d'IP Adresse vun de Pods wäerten all Kéier anescht sinn. An d'Identifikatioun vun engem Node an Cassandra baséiert op der IP Adress ... Et stellt sech eraus datt no all Entfernung vun engem Pod de Cassandra Cluster en neie Node addéiere wäert.

Et gëtt e Wee eraus, an net nëmmen een:

  1. Mir kënnen records duerch Hostidentifizéierer halen (UUIDs déi Cassandra Instanzen eenzegaarteg identifizéieren) oder duerch IP Adressen an alles an e puer Strukturen / Dëscher späicheren. D'Method huet zwee Haapt Nodeeler:
    • De Risiko vun enger Course Conditioun geschitt wann zwee Wirbelen op eemol falen. Nom Opstieg wäerte Cassandra Node gläichzäiteg eng IP Adress vum Dësch ufroen a fir déiselwecht Ressource konkurréiere.
    • Wann e Cassandra Node seng Donnéeën verluer huet, kënne mir se net méi identifizéieren.
  2. Déi zweet Léisung schéngt wéi e klengen Hack, awer trotzdem: mir kënnen e Service mat ClusterIP fir all Cassandra Node erstellen. Probleemer mat dëser Ëmsetzung:
    • Wann et vill Wirbelen an engem Cassandra Cluster sinn, musse mir vill Servicer erstellen.
    • D'ClusterIP Feature gëtt iwwer iptables implementéiert. Dëst kann e Problem ginn wann de Cassandra Stärekoup vill (1000 ... oder souguer 100?) Wirbelen huet. Obwuel Balance baséiert op IPVS kann dëse Problem léisen.
  3. Déi drëtt Léisung ass en Netz vun Noden fir Cassandra Noden ze benotzen amplaz vun engem dedizéierten Netz vu Pods andeems Dir d'Astellung aktivéiert hostNetwork: true. Dës Method setzt verschidde Restriktiounen op:
    • Unitéiten ze ersetzen. Et ass néideg datt den neien Node déi selwecht IP Adress wéi déi virdrun hunn (a Wolleken wéi AWS, GCP ass dëst bal onméiglech ze maachen);
    • Mat engem Netzwierk vu Clusternoden fänken mir un fir Netzwierkressourcen ze konkurréieren. Dofir, méi wéi ee Pod mat Cassandra op engem Cluster Node ze placéieren wäert problematesch sinn.

5. Backups

Mir wëllen eng voll Versioun vun engem eenzege Cassandra Node Daten op engem Zäitplang späicheren. Kubernetes bitt eng praktesch Feature benotzt CronJob, mee hei stellt d'Cassandra selwer eng Speech an eis Rieder.

Loosst mech Iech drun erënneren datt Cassandra e puer vun den Donnéeën an der Erënnerung späichert. Fir e komplette Backup ze maachen, braucht Dir Daten aus der Erënnerung (Memtables) op Disk réckelen (SSTables). Zu dësem Zäitpunkt stoppt de Cassandra Node Verbindungen unzehuelen, komplett aus dem Stärekoup auszeschalten.

Duerno gëtt de Backup geläscht (Snapshot) an de Schema gëtt gespäichert (Schlësselraum). An da stellt sech eraus datt just e Backup eis näischt gëtt: mir mussen d'Datenidentifizéierer späicheren, fir déi de Cassandra Node verantwortlech war - dat si speziell Tokens.

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen
Verdeelung vun Tokens fir z'identifizéieren fir wéi eng Donnéeën Cassandra Node verantwortlech sinn

E Beispill Skript fir e Cassandra Backup vu Google op Kubernetes ze fannen ass op dëse Link. Deen eenzege Punkt deen de Skript net berücksichtegt ass d'Daten op den Node zrécksetzen ier Dir de Snapshot hëlt. Dat ass, de Backup gëtt net fir den aktuellen Zoustand gemaach, mee fir e Staat e bësse méi fréi. Awer dëst hëlleft den Node net aus der Operatioun ze huelen, wat ganz logesch schéngt.

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}"

E Beispill vun engem Bash Skript fir e Backup vun engem Cassandra Node ze huelen

Prett Léisunge fir Cassandra zu Kubernetes

Wat gëtt de Moment benotzt fir Cassandra a Kubernetes z'installéieren a wéi eng vun dësen passt am Beschten un déi gegebene Ufuerderungen?

1. Léisunge baséiert op StatefulSet oder Helm Charts

D'Basis StatefulSets Funktiounen ze benotzen fir e Cassandra Cluster ze lafen ass eng gutt Optioun. Mat Hëllef vun der Helm Chart a Go Templates kënnt Dir de Benotzer e flexibelen Interface ubidden fir Cassandra z'installéieren.

Dëst funktionnéiert normalerweis gutt ... bis eppes onerwaart geschitt, wéi zum Beispill e Nodefehler. Standard Kubernetes Tools kënnen einfach net all déi uewe beschriwwe Feature berücksichtegen. Zousätzlech ass dës Approche ganz limitéiert a wéi vill et ka fir méi komplex Benotzung verlängert ginn: Node Ersatz, Backup, Erhuelung, Iwwerwaachung, etc.

Vertrieder:

Béid Charts si gläich gutt, awer ënnerleien d'Problemer uewen beschriwwen.

2. Léisunge baséiert op Kubernetes Bedreiwer

Esou Optiounen si méi interessant well se vill Méiglechkeeten ubidden fir de Cluster ze managen. Fir e Cassandra Bedreiwer ze designen, wéi all aner Datebank, gesäit e gutt Muster aus wéi Sidecar <-> Controller <-> CRD:

Migratioun vun Cassandra zu Kubernetes: Fonctiounen a Léisungen
Node Management Schema an engem gutt entworf Cassandra Bedreiwer

Loosst d'op bestehend Opérateuren kucken.

1. Cassandra-Bedreiwer vun instaclustr

  • GitHub
  • Bereetschaft: Alpha
  • Lizenz: Apache 2.0
  • Ëmgesat an: Java

Dëst ass wierklech e ganz villverspriechend an aktiv Entwécklungsprojet vun enger Firma déi verwaltete Cassandra Deployementer ubitt. Et, wéi uewen beschriwwen, benotzt e Sidecar Container deen Kommandoen iwwer HTTP akzeptéiert. Geschriwwen op Java, et feelt heiansdo déi méi fortgeschratt Funktionalitéit vun der Client-go Bibliothéik. Och de Bedreiwer ënnerstëtzt net verschidde Racks fir een Datacenter.

Awer de Bedreiwer huet sou Virdeeler wéi Ënnerstëtzung fir Iwwerwaachung, Héichniveau Clustermanagement mat CRD, a souguer Dokumentatioun fir Backups ze maachen.

2. Navigator vun Jetstack

  • GitHub
  • Bereetschaft: Alpha
  • Lizenz: Apache 2.0
  • Ëmgesat an: Golang

Eng Ausso entwéckelt fir DB-as-a-Service z'installéieren. De Moment ënnerstëtzt zwou Datenbanken: Elasticsearch a Cassandra. Et huet esou interessant Léisungen wéi Datebank Zougang Kontroll iwwer RBAC (fir dëst huet en eegene separaten Navigator-Apiserver). En interessanten Projet, deen et derwäert wier, méi genee ze kucken, mä dee leschte Commit gouf virun annerhallwem Joer gemaach, wat säi Potenzial däitlech reduzéiert.

3. Cassandra-Bedreiwer vun vgkowski

  • GitHub
  • Bereetschaft: Alpha
  • Lizenz: Apache 2.0
  • Ëmgesat an: Golang

Si hunn et net "eescht" ugesinn, well de leschte Verpflichtung zum Repository méi wéi engem Joer war. Bedreiwer Entwécklung ass opginn: déi lescht Versioun vu Kubernetes gemellt als ënnerstëtzt ass 1.9.

4. Cassandra-Bedreiwer vun Rook

  • GitHub
  • Bereetschaft: Alpha
  • Lizenz: Apache 2.0
  • Ëmgesat an: Golang

En Bedreiwer deem seng Entwécklung net esou séier viru geet wéi mir wëllen. Et huet eng gutt duerchduecht CRD Struktur fir Cluster Gestioun, léist de Problem vun Identifikatioun Noden benotzt Service mat ClusterIP (déi selwecht "Hack") ... mee dat ass alles fir elo. Et gëtt de Moment keng Iwwerwaachung oder Backups aus der Këscht (iwwregens, mir si fir Iwwerwaachung huet et selwer geholl). En interessante Punkt ass datt Dir och ScyllaDB benotze kënnt mat dësem Bedreiwer.

NB: Mir hunn dësen Bedreiwer mat klengen Ännerungen an engem vun eise Projete benotzt. Keng Probleemer goufen an der Aarbecht vum Bedreiwer während der ganzer Operatiounszäit gemierkt (~ 4 Méint Operatioun).

5. CassKop vun Orange

  • GitHub
  • Bereetschaft: Alpha
  • Lizenz: Apache 2.0
  • Ëmgesat an: Golang

De jéngste Bedreiwer op der Lëscht: den éischten Engagement gouf den 23. Mee 2019 gemaach. Schonn elo huet et a sengem Arsenal eng grouss Zuel vu Funktiounen aus eiser Lëscht, méi Detailer vun deenen am Projet Repository fonnt ginn. De Bedreiwer ass op der Basis vum populäre Bedreiwer-sdk gebaut. Ënnerstëtzt Iwwerwaachung aus der Këscht. Den Haaptunterschied vun anere Betreiber ass d'Benotzung CassKop Plugin, implementéiert am Python a benotzt fir Kommunikatioun tëscht Cassandra Noden.

Conclusiounen

D'Zuel vun den Approchen a méiglech Optiounen fir Cassandra op Kubernetes ze portéieren schwätzt fir sech selwer: d'Thema ass gefrot.

Op dëser Etapp kënnt Dir all vun den uewe op Ärem eegene Risiko a Risiko probéieren: Keen vun den Entwéckler garantéiert 100% Operatioun vun hirer Léisung an engem Produktiounsëmfeld. Awer scho si vill Produkter villverspriechend ze probéieren an Entwécklungsbänken ze benotzen.

Ech mengen an Zukunft wäert dës Fra um Schëff praktesch kommen!

PS

Liest och op eisem Blog:

Source: will.com

Setzt e Commentaire