
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 handle large volumes of data while ensuring high availability without a single point of failure. The project hardly needs a lengthy introduction, so I will mention only the main features of Cassandra that will be relevant to 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 combined by some criterion, located in the same data center;
- Datacenter â a collection of all groups of Cassandra instances located in a single data center;
- Cluster â a collection of all data centers.
- To identify a node, Cassandra uses an IP address.
- Andmete salvestamise ja lugemise kiirusel hoiab Cassandra osa andmeid operatiivmÀlu.
NĂŒĂŒd â Kubernetes'i potentsiaalsele ĂŒleviimisele.
Ăleviimise kontrollnimekiri
RÀÀkides Cassandra migratsioonist Kubernetes'i, loodame, et ĂŒleviimisega muutub haldamine mugavamaks. Mis on selleks vajalik ja mis aitab?
1. Andmete salvestus
Kuidas juba mainitud, hoiab Cassandra osa andmeid operatiivmĂ€lu â Memtable. Kuid on ka teine osa andmeid, mis salvestatakse kettale - formaadis SSTable. Nendele andmetele lisandub ĂŒksus Commit Log â kĂ”ikide tehingute salvestused, mis samuti salvestatakse kettale.

Cassandra andmete salvestamise tehingute skeem
Kubernetesis saame andmete salvestamiseks kasutada PersistentVolume'i. TĂ€nu vĂ€lja töötatud mehhanismidele muutub andmetega töö tegemine Kubernetes'is iga aastaga ĂŒha lihtsamaks.

Iga Cassandra pod'i jaoks eraldame oma PersistentVolume'i
Oluline on mĂ€rkida, et Cassandra impliciteerib andmete replikeerimist, pakkudes selleks sisseehitatud mehhanisme. SeetĂ”ttu, kui koostate Cassandra klastri suure hulga sĂ”lmedega, ei ole vaja kasutada andmete salvestamiseks jaotatud sĂŒsteeme nagu Ceph vĂ”i GlusterFS. Sellisel juhul on mĂ”istlik salvestada andmed sĂ”lme kettale, kasutades vĂ”i mountimist hostPath.
Teine kĂŒsimus on, kui soovite iga feature haru jaoks arendajatele eraldi keskkonda luua. Sellisel juhul oleks Ă”ige lĂ€henemine tĂ”sta ĂŒles ĂŒks Cassandra sĂ”lm ja hoida andmed jaotatud salvestuses, st mainitud Ceph ja GlusterFS saavad teie valikuks. Siis on arendajal kindel tunne, et ta ei kaota testandmeid isegi siis, kui ĂŒks Kubernetes klastri sĂ”lm kaob.
2. JĂ€lgimine
Peaaegu alternatiivitu valik jĂ€lgimise rakendamiseks Kuberneteses on Prometheus (oleme sellest ĂŒksikasjalikult rÀÀkinud ). Kuidas on Cassandra olukord metrikate eksportijatega Prometheusele? Ja mis on veelgi olulisem, kuidas on sobivate dashboard'idega Grafanal?

Grafana graafikute vÀlimuse nÀide Cassandra jaoks
Ekspordereid on kokku kaks: ja .
Valisime esmase, kuna:
- JMX Exporter kasvab ja areneb, samas kui Cassandra Exporter ei suutnud saada piisavat tuge kogukonnalt. Cassandra Exporter ei toeta endiselt enamikku Cassandra versioonidest.
- Seda saab kÀivitada javaagentina, lisades lipu
-javaagent:/cassandra-exporter.jar=--listen=:9180. - Selle jaoks on olemas , mis ei ĂŒhildu Cassandra Exporteriga.
3. Kubernetes primitiivide valik
Vastavalt eeltoodud Cassandra klastri struktuurile proovime tÔlkida kÔik, mis seal on, Kubernetes terminoloogiaks:
- Cassandra Node â Pod
- Cassandra Rack â StatefulSet
- Cassandra Datacenter â StatefulSet'ide rĂŒhm
- Cassandra Cluster â ???
Tundub, et puudub mingi tĂ€iendav entiteet, et haldada kogu Cassandra klastrit korraga. Kuid kui midagi on puudu, saame selle luua! Kuberneteses on selleks ette nĂ€htud isiklike ressurside mÀÀramise mehhanism â .

Lisaressursside deklareerimine logide ja teavituste jaoks
Aga iseenesest ei tĂ€henda Custom Resource midagi: selleks on vajalik kontroller. VĂ”ib-olla tuleb appi kutsuda âŠ
4. Pod'ide identifitseerimine
Eelmises punktis leppisime kokku, et ĂŒks Cassandra sĂ”lm vastab ĂŒhele pod'ile Kuberneteses. Kuid pod'ide IP-aadressid erinevad iga kord. Ja Cassandra sĂ”lm on identifitseeritud just IP-aadressi alusel⊠See tĂ€hendab, et iga pod'i kustutamise jĂ€rel lisab Cassandra klaster endasse uue sĂ”lme.
VĂ€ljapÀÀs on olemas, ja isegi rohkem kui ĂŒks:
- Saame jĂ€lgida hostide identifikaatoreid (UUID-sid, mis ĂŒheselt tuvastavad Cassandra instantsid) vĂ”i IP-aadresse ning salvestada kĂ”ik need mingitesse struktuuridesse / tabelitesse. Sellel meetodil on kaks peamist puudust:
- Risk, et kahe sĂ”lme kokkuvarisemise korral tekib vĂ”istlusolukord. PĂ€rast taastumist lĂ€hevad Cassandra sĂ”lmed korraga IP-aadressi tabelist kĂŒsima ja konkureerivad sama ressursi pĂ€rast.
- Kui Cassandra sÔlm on oma andmed kaotanud, ei saa me seda enam tuvastada.
- Teine lahendus nÀib olevat vÀike hack, kuid siiski: saame luua iga Cassandra sÔlme jaoks Service'i ClusterIP-ga. Selle rakenduse probleemid:
- Kui Cassandra klastris on vÀga palju sÔlmi, peame looma vÀga palju Service'e.
- ClusterIP funktsionaalsus on ŃĐ”Đ°Đ»ĐžĐ·ĐŸĐČĐ°Đœ ŃĐ”ŃДз iptables. See vĂ”ib muutuda probleemiks, 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 eraldi pod'ide vÔrku, aktiveerides seadistuse
hostNetwork: true. See meetod seab teatud piirangud:- SÔlmede asendamine. Uuel sÔlmel peab tingimata olema sama IP-aadress kui eelmisel (pilvteenustes nagu AWS, GCP on see peaaegu vÔimatu);
- Kas kasutades klastrisĂ”lmede vĂ”rgustikku, hakkame konkureerima vĂ”rguresursside ĂŒle. Seega on ĂŒhe Cassandra klastrisĂ”lme peale rohkem kui ĂŒhte podâi paigutamine probleemne.
5. Varukoopiad
Tahame salvestada ĂŒhte Cassandra sĂ”lme tĂ€ielikku andmeversiooni graafikuga. Kubernetes pakub mugavat vĂ”imalust , kuid siin takistab meid Cassandra ise.
Kordan, et osa andmeid salvestab Cassandra mĂ€llu. TĂ€ieliku varukoopia tegemiseks tuleb andmed mĂ€lust (Memtables) viia kettale (SSTables). Sel hetkel lakkab Cassandra sĂ”lm vastuvĂ”tmast ĂŒhendusi, eemaldudes tĂ€ielikult klastrist.
PÀrast seda tehakse varukoopia (snapshot) ja salvestatakse skeem (keyspace). Siin selgub, et lihtsalt varukoopia ei aita: tuleb salvestada andmete identifikaatorid, mille eest Cassandra sÔlm vastutas - need on spetsiaalsed tokenid.

Tokenite jaotamine, et mÀÀrata, milliste andmete eest Cassandra sÔlmed vastutavad
NÀidis Google'i Cassandra varukoopia skriptist Kubernetesis on saadaval aadressil . Ainus moment, mida skript ei arvesse vÔta, on andmete nullimine sÔlmele enne snapshot'i tegemist. See tÀhendab, et varukoopia ei tehta hetkeolukorra jaoks, vaid natuke varem. Kuid see aitab mitte viia sÔlme vÀlja tööst, 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 varukoopia tegemiseks ĂŒhelt Cassandra sĂ”lmelt
Valmis lahendused Cassandra jaoks Kuberneteses
Mida ĂŒldse praegu kasutatakse Cassandra kĂ€ivitamiseks Kuberneteses ja mis neist sobib kĂ”ige paremini antud nĂ”uetele?
1. Lahendused StatefulSetide vÔi Helm-chartide pÔhjal
Kasutada StatefulSetide pÔhifunktsioone Cassandra klastri kÀitamiseks on hea valik. Helm-chartide ja Go mallide abil saab kasutajale pakkuda paindlikku liidest Cassandra kÀivitamiseks.
Tavaliselt töötab see normaalselt... kuni juhtub midagi ootamatut â nĂ€iteks sĂ”lme rike. Kubernetes'i pĂ”hivahendid ei suuda lihtsalt arvesse vĂ”tta kĂ”iki ĂŒlaltoodud eripĂ€ra. Lisaks on see lĂ€henemine vĂ€ga piiratud, kui tegemist on keerulisemate rakendustega: sĂ”lmede vahetus, varundamine, taastamine, monitooring jne.
Esindajad:
- ;
- .
MĂ”lemad chart'id on vĂ”rdselt head, kuid on siiski ĂŒlaltoodud probleemidele vastuvĂ”tlikud.
2. Lahendused Kubernetes Operator'i pÔhjal
Need rohkem huvitavaid valikuvÔimalusi, kuna need pakuvad laialdasi vÔimalusi klastrite haldamiseks. Cassandra operaatori kujundamine, nagu iga teise andmebaasi puhul, nÀeb hea mustrina vÀlja nagu Sidecar Controller CRD:

SÔlmede haldamise skeem Ôigesti projekteeritud Cassandra operaatoris
Vaatame olemasolevaid operaatorite.
1. Instaclustri Cassandra operaator
- Valmidus: Alpha
- Litsents: Apache 2.0
- Tehnoloogia: Java
See on tĂ”eliselt paljutĂ”otav ja aktiivselt arenev projekt ettevĂ”ttelt, mis pakub hallatavaid Cassandra juurutusi. Nagu eelpool kirjeldatud, kasutavad nad sidecar konteinerit, mis aktsepteerib kĂ€ske HTTP kaudu. Kirjutanud Java keeles, seega tal puudub mĂ”nikord keerukam funktsionaalsus client-go teegist. Samuti ei toeta operaator erinevaid Rack'e ĂŒhe Andmekeskuse jaoks.
Kuid operaatoril on sellised eelised nagu monitooringu tugi, klastrite kÔrgema taseme haldamine CRD abil ja isegi varukoopiate tegemise dokumentatsioon.
2. Jetstacki Navigator
- Valmidus: Alpha
- Litsents: Apache 2.0
- Tehnoloogia: Golang
DB-as-a-Service'i kasutamiseks mÔeldud operaator. Sellel hetkel toetab see kahte andmebaasi: Elasticsearch ja Cassandra. Sellel on mitmeid huvitavaid lahendusi, nagu andmebaasi juurdepÀÀsukontroll RBAC kaudu (selleks kÀivitub omaette navigator-apiserver). Huvitav projekt, millele tasub tÀhelepanu pöörata, kuigi viimane commit tehti poolteist aastat tagasi, mis vÀhendab selgelt selle potentsiaali.
3. Cassandra-operator vgkowski poolt
- Valmidus: Alpha
- Litsents: Apache 2.0
- Tehnoloogia: Golang
Seda ei hakata tĂ”siselt vĂ”tma, kuna viimane commit repositooriumisse oli ĂŒle aasta tagasi. Operaatori arendamine on hĂŒljatud: viimane vĂ€lja kuulutatud Kubernetes versioon, mida peetakse toetatud, on 1.9.
4. Cassandra-operator Rook'i poolt
- Valmidus: Alpha
- Litsents: Apache 2.0
- Tehnoloogia: Golang
Operaator, mille areng ei kĂ€i nii kiiresti, kui sooviks. Sellel on hĂ€sti lĂ€bi mĂ”eldud CRD struktuur klastri haldamiseks, lahendatakse sĂ”lmede tuvastamise probleem Service'i abil koos ClusterIP'ga (see sama 'hakk') ... aga see on selline hetkeline hetk. Vidinaid ja varukoopiaid ei ole praegu vĂ€ljakujunenud (muide, vidinate ĂŒlevaatamisega tegeleme me ). Huvitav fakt on see, et selle operaatori abil on vĂ”imalik kĂ€ivitada ka ScyllaDB.
NB: Selle operaatori vĂ€ikeste kohandustega oleme kasutanud ĂŒhes meie projektis. Probleeme operaatori tööga ei ole tĂ€heldatud kogu kasutusaja (~4 kuud).
5. CassKop Orange'ilt
- Valmidus: Alpha
- Litsents: Apache 2.0
- Tehnoloogia: Golang
Selle nimekirja noorim operaator: esimene kommit tehti 23. mail 2019. Juba praegu on tal arsenalis suur hulk funktsioone meie nimekirjast, millega saab tutvuda projekti repos. Operaator on loodud populaarse operator-sdk baasil. Toetab «karbist vÀljas» jÀlgimist. Peamine erinevus teistest operaatoritest on , mis on realiseeritud Pythonis ja mida kasutatakse Cassandra sÔlmede vaheliseks suhtlemiseks.
JĂ€reldused
Cassandra edasiviimise lÀhenemiste ja vÔimalike variantide arv Kubernetesesse rÀÀgib enda eest: teema on nÔutud.
Praegusel etapil vĂ”ib proovida midagi ĂŒlaltoodust oma riski ja vastutuse all: ĂŒkski arendaja ei garanteeri 100% töökindlust oma lahenduses tootmiskeskkonnas. Kuid juba nĂŒĂŒd nĂ€evad paljud tooted vĂ€lja lubavad, et neid tasub proovida arendusstandardites.
Arvan, et tulevikus tuleb see naine laeva peale Ôigel ajal!
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
