Cassandra migreerimine Kubernetesesse: eripÀrad ja lahendused

Cassandra migreerimine 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 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 migreerimine Kubernetesesse: eripÀrad ja lahendused
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.

Cassandra migreerimine Kubernetesesse: eripÀrad ja lahendused
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 kohalikku pĂŒsivalt ketast 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 sobivas ettekandes). Kuidas on Cassandra olukord metrikate eksportijatega Prometheusele? Ja mis on veelgi olulisem, kuidas on sobivate dashboard'idega Grafanal?

Cassandra migreerimine Kubernetesesse: eripÀrad ja lahendused
Grafana graafikute vÀlimuse nÀide Cassandra jaoks

Ekspordereid on kokku kaks: jmx_exporter ja cassandra_exporter.

Valisime esmase, kuna:

  1. JMX Exporter kasvab ja areneb, samas kui Cassandra Exporter ei suutnud saada piisavat tuge kogukonnalt. Cassandra Exporter ei toeta endiselt enamikku Cassandra versioonidest.
  2. Seda saab kÀivitada javaagentina, lisades lipu -javaagent:/cassandra-exporter.jar=--listen=:9180.
  3. Selle jaoks on olemas sobiv dashboard, 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 — Custom Resource Definitions.

Cassandra migreerimine Kubernetesesse: eripÀrad ja lahendused
Lisaressursside deklareerimine logide ja teavituste jaoks

Aga iseenesest ei tÀhenda Custom Resource midagi: selleks on vajalik kontroller. VÔib-olla tuleb appi kutsuda Kubernetes-operaator


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:

  1. 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.
  2. 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 IPVS-l pĂ”hinev koormuse tasakaalustamine suudab selle probleemi lahendada.
  3. 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 CronJob, 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.

Cassandra migreerimine Kubernetesesse: eripÀrad ja lahendused
Tokenite jaotamine, et mÀÀrata, milliste andmete eest Cassandra sÔlmed vastutavad

NÀidis Google'i Cassandra varukoopia skriptist Kubernetesis on saadaval aadressil . Seal on kirjeldatud arhitektuuri. 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:

Cassandra migreerimine Kubernetesesse: eripÀrad ja lahendused
SÔlmede haldamise skeem Ôigesti projekteeritud Cassandra operaatoris

Vaatame olemasolevaid operaatorite.

1. Instaclustri Cassandra operaator

  • GitHub
  • 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

  • GitHub
  • 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

  • GitHub
  • 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

  • GitHub
  • 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 ise). 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

  • GitHub
  • 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 CassKop pistikprogramm, 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

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster