Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused

Apache Cassandra and the need to operate it within a Kubernetes-based infrastructure is something we encounter regularly. In this article, we will share our vision of the necessary steps, criteria, and existing solutions (including an overview of operators) for migrating Cassandra to K8s.

“Who can manage a woman can also manage a state”

So, who is Cassandra? It is a distributed storage system designed to manage large volumes of data while providing high availability without a single point of failure. The project hardly needs a lengthy introduction, so I will only highlight the main features of Cassandra that will be relevant for this article:

  • Cassandra is written in Java.
  • The topology of Cassandra includes several levels:
    • Node — a single deployed instance of Cassandra;
    • Rack — a group of Cassandra instances unified by a criterion, located in the same data center;
    • Datacenter — a collection of all groups of Cassandra instances within a single data center;
    • Cluster — a collection of all data centers.
  • To identify a node, Cassandra uses the IP address.
  • For the speed of write and read operations, Cassandra stores part of the data in memory.

Now — to the actual potential move to Kubernetes.

Check-list for migration

When it comes to migrating Cassandra to Kubernetes, we hope that managing it will become easier with the move. What will be required for this, and what will assist in it?

1. Storage for data

As previously mentioned, part of the Cassandra data is stored in memory — in the Memtable. But there is also another part of the data that is saved to disk — in the form of SSTable. To this data, we add an entity called Commit Log — records of all transactions, which are also saved to disk.

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused
Transaction schema for writing in Cassandra

In Kubernetes, we can use PersistentVolume for data storage. Thanks to well-established mechanisms, working with data in Kubernetes is becoming easier each year.

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused
We will allocate a separate PersistentVolume for each pod with Cassandra.

Oluline on mĂ€rkida, et Cassandra hĂ”lmab iseenesest andmete replikatsiooni, pakkudes selleks sisseehitatud mehhanisme. Seega, kui kogute Cassandra klastrit suurest arvust sĂ”lmedest, ei ole andmete salvestamiseks vaja kasutada jaotatud sĂŒsteeme nagu Ceph vĂ”i GlusterFS. Sel juhul oleks mĂ”istlik salvestada andmed sĂ”lme kettale, kasutades kohalikke pĂŒsikettaid vĂ”i mountimist hostPath.

Teine kĂŒsimus on, kui soovite luua igale feature-haru jaoks eraldi arendajate keskkonna. Sel juhul oleks Ă”ige lĂ€henemine tĂ”sta ĂŒles ĂŒks Cassandra sĂ”lm ja hoida andmed jaotatud salves, st mainitud Ceph ja GlusterFS saavad teie valikuks. Siis on arendaja kindel, et ei kaota testandmeid isegi siis, kui ĂŒks Kuberntese klastri sĂ”lm kaob.

2. JĂ€lgimine

Peaaegu alternatiivideta valik Kuberneteses jÀlgimise elluviimiseks on Prometheus (oleme sellest pÔhjalikult rÀÀkinud vastavas ettekandes). Kuidas on Cassandra-l asjadega, mis puudutavad Prometheusele mÔeldud meetrika eksportijaid? Ja, mis on isegi tÀhtsam, sobivate dashboard'idega Grafana jaoks?

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused
Grafana Cassandra jaoks graafikute vÀljanÀgemise nÀide

Eksportijaid on kokku kaks: jmx_exporter ja cassandra_exporter.

Oleme valinud enda jaoks esimese, kuna:

  1. JMX Exporter kasvab ja areneb, samas kui Cassandra Exporter ei ole suutnud saada vajalikku kogukonna toetust. Cassandra Exporter ei toeta siiani enamiku Cassandra versioone.
  2. Seda saab kÀivitada kui javaagent, lisades lipu -javaagent:<plugin-dir-name>\/cassandra-exporter.jar=--listen=:9180.
  3. Selle jaoks on olemas adequate dashboard, mis ei ĂŒhildu Cassandra Exporter'iga.

3. Kubernetes'e primitiivide valik

Arvestades eeltoodud Cassandra klastristruktuuri, proovime tÔlkida kÔik, mis seal on, Kubernetes'e terminoloogiasse:

  • Cassandra Node → Pod
  • Cassandra Rack → StatefulSet
  • Cassandra Datacenter → StatefulSets kogum
  • Cassandra Cluster → ???

Tundub, et Cassandra klastrit juhtimiseks vajalik tĂ€iendav ĂŒksus on puudu. Kuid kui midagi puudub, saame selle luua! Kubernetes'es on selleks ette nĂ€htud oma ressursside mÀÀratlemise mehhanism - Kohandatud Ressursi MÀÀratlused.

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused
Lisareursside kuulutamine logide ja teavituste jaoks

Kuid iseenesest ei tÀhenda Custom Resource midagi: vajalik on kontroller. VÔib-olla tuleb kaasata Kubernetes'i operaator


4. pod'ide identifitseerimine

Ülaltoodud punktis leppisime kokku, et ĂŒks Cassandra sĂ”lm vastab ĂŒhele pod'ile Kubernetesis. Kuid pod'ide IP-aadressid on iga kord erinevad. Ja Cassandra sĂ”lme tuvastamine toimub just IP-aadressi pĂ”hjal... Seega, pĂ€rast iga pod'i kustutamist lisab Cassandra klaster endasse uue sĂ”lme.

VĂ€ljapÀÀs on olemas, ja isegi mitte ĂŒks:

  1. Saame arvestada hosti identifikaatorite (UUID-de, mis tuvastavad Cassandra eksemplare) vÔi IP-aadresside jÀrgi ja salvestada kÔik see mingitesse struktuuridesse/tabelitesse. Meetodil on kaks peamist puudust:
    • Oht, et kahe sĂ”lme allakukkumisel tekib konkurentsitingimus. PĂ€rast taastumist hakkavad Cassandra sĂ”lmed samaaegselt enda jaoks tabelist IP-aadressi kĂŒsima ja konkureerima sama ressursi ĂŒle.
    • Kui Cassandra sĂ”lm on oma andmed kaotanud, ei saa me seda enam tuvastada.
  2. Teine lahendus tundub olevat vÀike nipp, kuid siiski: saame luua iga Cassandra sÔlme jaoks Service, millel on ClusterIP. Selle rakenduse probleemid:
    • Kui Cassandra klastris on palju sĂ”lmi, peame looma vĂ€ga palju Service'e.
    • ClusterIP funktsionaalsus on rakendatud iptables'i kaudu. See vĂ”ib probleemiks saada, kui Cassandra klastris on palju (1000... vĂ”i isegi 100?) sĂ”lme. Kuigi IPVS-pĂ”hine tasakaalustamine suudab selle probleemi lahendada.
  3. Kolmas lahendus on kasutada Cassandra sÔlmede jaoks sÔlmede vÔrku, mitte eraldiseisvat pod'ide vÔrku, lubades seadistuse hostNetwork: true. See meetod seab mÔned piirangud:
    • SĂ”lmide asendamiseks. Uus sĂ”lm peab kindlasti omama sama IP-aadressi, mis eelmine (pilvedes nagu AWS, GCP on seda peaaegu vĂ”imatu teha);
    • Klastri sĂ”lmede vĂ”rgu kasutamisel hakkame konkurentsi pidama vĂ”rguressursside ĂŒle. Seega on ĂŒhe Cassandra klastris oleva sĂ”lme jaoks rohkem kui ĂŒhe pod'i paigutamine problemaatiline.

5. Varundused

Tahame aeg-ajalt salvestada ĂŒhe Cassandra sĂ”lme tĂ€isandmete versiooni. Kubernetes pakub mugavat vĂ”imalust, kasutades CronJob, kuid siin takistab meid ise Cassandra.

MĂ€letan, et osa andmeid salvestab Cassandra mĂ€llu. TĂ€ieliku varukoopia tegemiseks tuleb andmed mĂ€lust (Memtables) viia kettale (SSTables). Sel hetkel lakab Cassandra sĂ”lm ĂŒhenduste vastu vĂ”tmast, sulgedes end tĂ€ielikult klastri tööst.

PĂ€rast seda tehakse varukoopia (snapshot) ja salvestatakse skeem (keyspace). Ja selgub, et lihtsalt varukoopia meile midagi ei anna: tuleb salvestada andmete identifikaatorid, mille eest vastutas Cassandra sĂ”lm – need on spetsiaalsed tokenid.

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused
Tokenite jaotamine andmete identifitseerimiseks, mille eest vastutavad Cassandra sÔlmed

NÀidis skriptist, mis teeb Cassandra varukoopia Google'i poolt Kuberneteses, leiate siit sellel lingil. Ainus moment, mida skript ei arvesta, on andmete lÀhtestamine sÔlmes enne snapshot'i tegemist. See tÀhendab, et varukoopia tehakse mitte praegusest seisundist, vaid veidi varasemast. Kuid see aitab mitte viia sÔlme vÀlja tegevusest, mis tundub vÀga loogiline.

set -eu

if [[ -z "$1" ]]; then
  info "Palun esitage keyspace"
  exit 1
fi

KEYSPACE="$1"

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

if [[ $? -ne 0 ]]; then
  echo "Viga snapshot'i tegemisel"
  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}"

NĂ€idis bash-skript, mis teeb varukoopia ĂŒhe Cassandra sĂ”lme kohta

Valmis lahendused Cassandra jaoks Kuberneteses

Mida praegu ĂŒldse kasutatakse Cassandra kĂ€ivitamiseks Kuberneteses ja mis neist sobib kĂ”ige paremini antud nĂ”uete tĂ€itmiseks?

1. Lahendused StatefulSetide vÔi Helm-kartide alusel

Kasutada StatefulSetide pĂ”hifunktsioone Cassandra klastrite kĂ€ivitamiseks – hea variant. Helm-kardi ja Go mallide abil saab pakkuda kasutajale paindlikku liidese Cassandra kĂ€ivitamiseks.

Tavaliselt töötab see normaalselt
 kuni juhtub midagi ootamatut – nĂ€iteks sĂ”lme rike. Kubernetes'e standardvahendid ei suuda lihtsalt arvestada kĂ”iki ĂŒlaltoodud omadusi. Lisaks on see lĂ€henemine vĂ€ga piiratud, kui tuleb arvestada keerulisemate kasutusjuhtumitega: sĂ”lmede asendamine, varukoopiad, taastamine, jĂ€lgimine jne.

Esindajad:

MĂ”lemad chart'id on sama head, kuid nad on siiski vastuvĂ”tlikud ĂŒlaltoodud probleemidele.

2. Kubernetes Operator'i alusel pÔhinevad lahendused

Sellised valikud on huvitavamad, kuna nad pakuvad laia valikut vÔimalusi klastriga haldamiseks. Cassandra operaatori kujundamisel, nagu iga teise andmebaasi puhul, nÀeb hea mustrina vÀlja Sidecar Controller CRD:

Cassandra migratsioon Kubernetesesse: eripÀrad ja lahendused
Cassandra Ôigesti kavandatud operaatori sÔlmede haldamise skeem

Uurime olemasolevaid operaatorite lahendusi.

1. Cassandra-operator Instaclustr'i poolt

  • GitHub
  • Valmidus: Alfa
  • Litsents: Apache 2.0
  • Rakendatud: Java

See on tĂ”eliselt paljutĂ”otav ja aktiivselt arenev projekt ettevĂ”ttelt, mis pakub hallatavaid Cassandra juurutusi. Nagu eespool mainitud, kasutab see sidecar konteinerit, mis vĂ”tab kĂ€ske vastu HTTP kaudu. Kirjutatud Java's, seega mĂ”nikord jÀÀb tal puudu klient-go teegi tĂ€iendavast funktsionaalsusest. Samuti ei toeta operaator erinevaid racks'e ĂŒhe datakeskuse jaoks.

Kuid operaatoril on sellised eelised nagu toetatud monitooring, kÔrgetasemeline klastrihaldus CRD abil ja isegi dokumentatsioon varukoopiate tegemiseks.

2. Navigator Jetstack'i poolt

  • GitHub
  • Valmidus: Alfa
  • Litsents: Apache 2.0
  • Rakendatud: Golang

Operaatore, mis on mÔeldud DB-as-a-Service'i juurutamiseks. Praegu toetab see kahte andmebaasi: Elasticsearch ja Cassandra. Sellel on sellised huvitavad lahendused nagu juurdepÀÀsu kontroll andmebaasile RBAC kaudu (selleks tÔuseb omaette navigator-apiserver). Huvitav projekt, millele tasuks tÀhelepanu pöörata, kuigi viimane commit tehti poolteist aastat tagasi, mis vÀhendab selgelt selle potentsiaali.

3. Cassandra-operator vgkowski poolt

  • GitHub
  • Valmidus: Alfa
  • Litsents: Apache 2.0
  • Rakendatud: Golang

Ei hakanud seda 'tÔsiselt' vÔtma, kuna viimane commit reposse oli rohkem kui aasta tagasi. Operaatori arendamine on unarusse jÀetud: viimane Kubernetes'i versioon, mida vÀidetakse toetavat, on 1.9.

4. Cassandra-operator Rook'i poolt

  • GitHub
  • Valmidus: Alfa
  • Litsents: Apache 2.0
  • Rakendatud: Golang

Operaator, mille areng ei edene nii kiiresti, kui sooviksime. Tal on lĂ€bi mĂ”eldud CRD struktuur klastrihalduseks, lahendab sĂ”lmede tuvastamise probleemi ClusterIP teenuse kaudu (see sama 'nipp')... kuid hetkel on see kĂ”ik. Monitooringut ja varukoopiaid pole lahti keeratud (ĂŒhe sĂ”naga, monitooringuga vĂ”tsime meie ise kĂ€sile). Huvitav punkt on see, et selle operaatori abil on vĂ”imalik ĂŒles seada ka ScyllaDB.

NB: Seda operaatorit oleme me vĂ€ikeste muudatustega kasutanud ĂŒhes meie projektis. Operaatori kasutamise ajal (~4 kuud) ei ole probleeme tĂ€heldatud.

5. CassKop Orange'i poolt

  • GitHub
  • Valmidus: Alfa
  • Litsents: Apache 2.0
  • Rakendatud: Golang

Noorim operaator nimekirjas: esimene commit tehti 23. mai 2019. Praeguseks on tal juba suur hulk omadusi meie nimekirjast, millega saab lÀhemalt tutvuda projekti repozitooriumis. Operaator on loodud populaarse operator-sdk baasil. Toetab 'vÀlja kastist' monitooringut. Peamine erinevus teiste operaatorite seas on selle kasutamine. CassKop plugina, mis on rakendatud Pythonis ja kasutatakse kommunikatsiooniks Cassandra sÔlmede vahel.

JĂ€reldused

Cassandra ĂŒleviimise lĂ€henemisviiside ja vĂ”imalike variantide arv Kubernetesesse rÀÀgib enda eest: teema on vĂ€ga nĂ”utud.

Praegusel hetkel vĂ”ib katsetada midagi ĂŒlaltoodust omal riskil: ĂŒkski arendaja ei garanteeri oma lahenduse 100%-list toimimist tootmiskeskkonnas. Siiski, paljud tooted nĂ€evad juba praegu lubavad vĂ€lja, et neid saab proovida arendustegevuse keskkondades.

Ma arvan, et tulevikus see naine laeva peal osutub vajalikuks!

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster