
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.

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.

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 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 ). Kuidas on Cassandra-l asjadega, mis puudutavad Prometheusele mÔeldud meetrika eksportijaid? Ja, mis on isegi tÀhtsam, sobivate dashboard'idega Grafana jaoks?

Grafana Cassandra jaoks graafikute vÀljanÀgemise nÀide
Eksportijaid on kokku kaks: ja .
Oleme valinud enda jaoks esimese, kuna:
- JMX Exporter kasvab ja areneb, samas kui Cassandra Exporter ei ole suutnud saada vajalikku kogukonna toetust. Cassandra Exporter ei toeta siiani enamiku Cassandra versioone.
- Seda saab kÀivitada kui javaagent, lisades lipu
-javaagent:<plugin-dir-name>\/cassandra-exporter.jar=--listen=:9180. - Selle jaoks on olemas , 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 - .

Lisareursside kuulutamine logide ja teavituste jaoks
Kuid iseenesest ei tĂ€henda Custom Resource midagi: vajalik on kontroller. VĂ”ib-olla tuleb kaasata âŠ
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:
- 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.
- 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 suudab selle probleemi lahendada.
- 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 , 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.

Tokenite jaotamine andmete identifitseerimiseks, mille eest vastutavad Cassandra sÔlmed
NÀidis skriptist, mis teeb Cassandra varukoopia Google'i poolt Kuberneteses, leiate siit . 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 Ôigesti kavandatud operaatori sÔlmede haldamise skeem
Uurime olemasolevaid operaatorite lahendusi.
1. Cassandra-operator Instaclustr'i poolt
- 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
- 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
- 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
- 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 ). 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
- 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. , 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
