
Me mendojme se shpesh hasim në përdorimin e bazës së të dhënave Apache Cassandra në infrastrukturën e bazuar në Kubernetes. Në këtë material do të ndajmë vizionin tonë mbi hapat e nevojshëm, kriteret dhe zgjidhjet ekzistuese (përfshirë një përmbledhje të operatorëve) për migrimin e Cassandra në K8s.
«Kush mund të menaxhojë një grua, do të përballojë edhe me një shtet»
Kush është Cassandra? Ajo është një sistem të dhënash të shpërndara, e krijuar për menaxhimin e volumieve të mëdha të të dhënave, duke ofruar disponibilitet të lartë pa një pikë të vetme dështimi. Projekti, ndoshta, nuk ka nevojë për një prezantim të gjatë, prandaj do të përmend vetëm karakteristikat kryesore të Cassandra, që do të jenë të rëndësishme në kontekstin e këtij artikulli:
- Cassandra është shkruar në Java.
- Topologjia e Cassandra përfshin disa nivele:
- Node â njĂ« instancĂ« e deployuar e Cassandra;
- Rack â njĂ« grup instancash tĂ« Cassandra, tĂ« grupuara sipas njĂ« kritereje, duke u gjetur nĂ« tĂ« njĂ«jtin qendĂ«r tĂ« tĂ« dhĂ«nave;
- Datacenter â njĂ« pĂ«rbĂ«rje e tĂ« gjitha grupeve tĂ« instancave tĂ« Cassandra, qĂ« ndodhen nĂ« njĂ« qendĂ«r tĂ« dhĂ«nash;
- Cluster â njĂ« pĂ«rbĂ«rje e tĂ« gjitha qendrave tĂ« tĂ« dhĂ«nave.
- Për identifikimin e nyjës, Cassandra përdor adresën IP.
- Për të saktësuar operacionet e regjistrimit dhe leximit, një pjesë e të dhënave Cassandra ruhet në memorien operative.
Tani â pĂ«r migrimin e mundshĂ«m nĂ« Kubernetes.
Liste kontrolli për transferimin
Duke folur pĂ«r migrimin e Cassandra nĂ« Kubernetes, shpresojmĂ« qĂ« me kĂ«tĂ« transferim tĂ« menaxhohet mĂ« lehtĂ«. ĂfarĂ« do tĂ« nevojitet pĂ«r kĂ«tĂ«, çfarĂ« do tĂ« ndihmojĂ«?
1. Ruajtja e të dhënave
Siç Ă«shtĂ« saktĂ«suar mĂ« parĂ«, njĂ« pjesĂ« e tĂ« dhĂ«nave tĂ« Cassandra ruhet nĂ« memorien operative â nĂ« Memtable. Por ka edhe njĂ« pjesĂ« tjetĂ«r tĂ« dhĂ«nash, e cila ruhet nĂ« disk, â nĂ« formĂ«n e SSTable. NĂ« kĂ«to tĂ« dhĂ«na shtohet entiteti Commit Log â regjistrimet e tĂ« gjitha transaksioneve, tĂ« cilat gjithashtu ruhen nĂ« disk.

Schema e transaksioneve të regjistrimit në Cassandra
Në Kubernetes, ne mund të përdorim për ruajtjen e të dhënave PersistentVolume. Falë mekanizmave të zhvilluara, puna me të dhënat në Kubernetes bëhet gjithnjë e më e lehtë me kalimin e viteve.

Ădo pod me Cassandra do t'i alokohet njĂ« PersistentVolume i tij
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se Cassandra, vetvetiu, nĂ«nkupton replikimin e tĂ« dhĂ«nave, duke ofruar mekanizma tĂ« integruar pĂ«r kĂ«tĂ«. Prandaj, nĂ«se po ngrini njĂ« grumbull Cassandra nga njĂ« numĂ«r i madh nodash, nuk ka nevojĂ« tĂ« pĂ«rdorni sisteme tĂ« shpĂ«rndara pĂ«r ruajtjen e tĂ« dhĂ«nave si Ceph ose GlusterFS. NĂ« kĂ«tĂ« rast, do tĂ« ishte logjike tĂ« ruani tĂ« dhĂ«nat nĂ« diskun e nodit nĂ«pĂ«rmjet ose montimit hostPath.
Një çështje tjetër është nëse dëshironi të krijoni një ambient të veçantë për zhvilluesit për çdo degë funksionaliteti. Në këtë rast, qasja e duhur do të ishte të ngrihet një nod Cassandra dhe të ruhen të dhënat në një ruajtje të shpërndarë, dmth, Ceph dhe GlusterFS të përmendura do të bëhen opsioni juaj. Kështu, zhvilluesi do të jetë i sigurt se nuk do të humbasë të dhënat testuese edhe në rastin e humbjes së një prej nodave të grumbullit Kubernetes.
2. Monitorimi
Zgjedhja pothuajse e paalternuar për realizimin e monitorimit në Kubernetes është Prometheus (ne e kemi përshkruar këtë në ). Si qëndron Cassandra me eksportuesit e metrikave për Prometheus? Dhe, çka është ndoshta më e rëndësishme, me dashboard-et e përshtatshme për to për Grafana?

shembuj i pamjes së grafikëve në Grafana për Cassandra
Ka vetëm dy eksportues: dhe .
Ne zgjodhëm të parin, sepse:
- JMX Exporter po rritet dhe zhvillohet, ndërsa Cassandra Exporter nuk ka arritur të marrë mbështetje të duhur nga komuniteti. Cassandra Exporter ende nuk mbështet shumicën e versioneve të Cassandra.
- Mund ta nisni si javaagent duke shtuar këtë flamur
-javaagent:/cassandra-exporter.jar=--listen=:9180. - Për të ka , i cili nuk është i përputhshëm me Cassandra Exporter.
3. Zgjedhja e primitiveve të Kubernetes
Sipas strukturës së mësipërme të klasterit Cassandra, do të mundohemi të përkthejmë gjithçka që është përshkruar aty në terminologjinë e Kubernetes:
- Cassandra Node â Pod
- Cassandra Rack â StatefulSet
- Cassandra Datacenter â njĂ« grup StatefulSets
- Cassandra Cluster â ???
Kjo nĂ«nkupton se mungon njĂ« entitet shtesĂ« pĂ«r tĂ« menaxhuar tĂ« gjithĂ« klasterin Cassandra njĂ«herĂ«sh. Por nĂ«se diçka mungon, mund ta krijojmĂ« atĂ«! NĂ« Kubernetes, pĂ«r kĂ«tĂ« qĂ«llim ekziston mekanizmi i pĂ«rcaktimit tĂ« burimeve tĂ« personalizuara â .

Deklarimi i burimeve të tjera për logje dhe njoftime
Por vetĂ« Burimi i Personalizuar nuk ka kuptim: pasi pĂ«r tĂ« nevojitet kontrolleri. Ndoshta do tĂ« duhet tĂ« kĂ«rkojmĂ« ndihmĂ«n e âŠ
4. Identifikimi i pod'ave
Në pikën e mësipërme u pajtuam se një nyje Cassandra do të barazohet me një pod në Kubernetes. Por adresat IP të pod'ave do të jenë gjithmonë të ndryshme. Identifikimi i nyjes në Cassandra bëhet pikërisht mbi bazën e adresës IP... Kjo do të thotë se, pas çdo fshirjeje të pod'it, klasteri Cassandra do të shtojë një nyje të re.
Ka zgjidhje, madje jo vetëm një:
- Mund të mbajmë shënim në bazë të identifikatorëve të hosteve (UUID, që identifikojnë në mënyrë unike instancat e Cassandra) ose sipas adresave IP dhe ta ruajmë këtë informacion në struktura/tabela të caktuara. Ky metodë ka dy disavantazhe kryesore:
- Rreziku i krijimit të një kushti garues në rastin e rënies së dy nyjeve menjëherë. Pas rikthimit, nyjet Cassandra do të kërkojnë një adresë IP nga tabela dhe do të konkurrojnë për të njëjtën burim.
- Nëse nyja Cassandra ka humbur të dhënat e saj, ne nuk do të mund ta identifikojmë më.
- Zgjidhja e dytë duket si një hack i vogël, por megjithatë: mund të krijojmë një Shërbim me ClusterIP për çdo nyje Cassandra. Problemet e kësaj zbatimi:
- Nëse klasteri Cassandra ka shumë nyje, do të na duhet të krijojmë shumë Shërbime.
- Mundësia e ClusterIP realizohet përmes iptables. Kjo mund të bëhet një problem nëse në klasterin Cassandra ka shumë (1000⊠apo madje 100?) node. është në gjendje ta zgjidhë këtë problem.
- Zgjidhja e tretĂ« Ă«shtĂ« tĂ« pĂ«rdorim pĂ«r node Cassandra rrjetin e nodeve nĂ« vend tĂ« njĂ« rrjeti tĂ« dedikuar podâesh duke aktivizuar cilĂ«simin
hostNetwork: true. Ky metod ka disa kufizime:- Për zëvendësimin e nodeve. Duhet që nodi i ri të ketë domosdoshmërisht të njëjtin adresë IP si ai paraardhës (në nube si AWS, GCP, kjo është praktikisht e pamundur);
- Duke përdorur rrjetin e nodeve të klasterit, fillojmë të garojmë për burimet rrjetë. Prandaj, të vendosim më shumë se një pod në një node të klasterit me Cassandra do të jetë problematik.
5. Backup-et
Dëshirojmë të ruajmë një version të plotë të të dhënave nga një node Cassandra në një orar të rregullt. Kubernetes ofron një mundësi të përshtatshme duke përdorur , por këtu na pengon vetë Cassandra.
Më kujtohet se një pjesë e të dhënave Cassandra ruhet në memorie. Për të bërë një backup të plotë, duhet të transferojmë të dhënat nga memoria (Memtables) në disk (SSTables). Në këtë moment, nodi Cassandra ndalon pranimin e lidhjeve, duke u çaktivizuar plotësisht nga puna e klasterit.
Pas kësaj, merret një backup (snapshot) dhe ruhet një skemë (keyspace). Dhe këtu del në pah se thjesht backup-i nuk na jep asgjë: duhet të ruajmë identifikatorët e të dhënave për të cilat ishte përgjegjës nodi Cassandra - këta janë tokene speciale.

Distribuimi i tokeneve për identifikimin e të dhënave për të cilat janë përgjegjës nodet Cassandra
Shembulli i skriptit për marrjen e backup-it të Cassandra nga Google në Kubernetes mund të gjendet në . Momenti i vetëm që skripti nuk e merr parasysh është shlyerja e të dhënave në nod para se të merret snapshot-i. Kjo do të thotë se backup-i kryhet jo për gjendjen aktuale, por për një gjendje pak më parë. Por kjo ndihmon që nodi të mos dalë nga puna, gjë që duket shumë logjike.
set -eu
if [[ -z "$1" ]]; then
info "Ju lutem jepni një keyspace"
exit 1
fi
KEYSPACE="$1"
result=$(nodetool snapshot "${KEYSPACE}")
if [[ $? -ne 0 ]]; then
echo "Gabim gjatë krijimit të snapshot-it"
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}"Shembulli i skriptit bash për marrjen e backup-it nga një nod Cassandra
Zgjidhje të gatshme për Cassandra në Kubernetes
ĂfarĂ« pĂ«rdoret aktualisht pĂ«r tĂ« shpĂ«rndarĂ« Cassandra nĂ« Kubernetes dhe cila prej tyre pĂ«rmbush mĂ« sĂ« miri kĂ«rkesat e caktuara?
1. Zgjidhje të bazuara në StatefulSet ose Helm-charts
Përdorimi i funksioneve bazë të StatefulSets për të nisur një klaster Cassandra është një opsion i mirë. Me ndihmën e Helm-chart dhe template-ve Go, mund t'i ofrohet përdoruesit një ndërfaqe e përshtatshme për shpërndarjen e Cassandra.
Zakonisht kjo funksionon mirë... deri sa ndodh diçka e papritur - për shembull, dështimi i një nodi. Mjetet standarde të Kubernetes vetëm kafe nuk mund të bëjnë llogaritë për të gjitha veçoritë e përshkruara më sipër. Për më tepër, ky qasje është shumë e kufizuar në mënyrën se si mund të zgjerohet për përdorim më të ndërlikuar: zëvendësimi i node-ve, kopjimi, rikuperimi, monitorimi, etj.
Përfaqësuesit:
- ;
- .
Të dy chart-et janë njëlloj të mira, por janë të ndjeshëm ndaj problemeve të përshkruara më sipër.
2. Zgjidhje të bazuara në Kubernetes Operator
Këto opsione janë më tërheqëse, sepse ofrojnë mundësi të gjera për menaxhimin e klasterit. Për projektimin e operatorit Cassandra, siç është çdo bazë të dhënash tjetër, një model i mirë duket si Sidecar Controller CRD:

Skema e menaxhimit të nyjeve në një operator Cassandra të dizajnuar mirë
Le ta shqyrtojmë operatorët ekzistues.
1. Cassandra-operator nga instaclustr
- Gatishmëria: Alpha
- Licenca: Apache 2.0
- Implementuar në: Java
Ky Ă«shtĂ« vĂ«rtet njĂ« projekt shumĂ« premtues dhe nĂ« zhvillim e sipĂ«r nga njĂ« kompani qĂ« ofron shpĂ«rndarje tĂ« menaxhuara tĂ« Cassandra. Ai, ashtu siç pĂ«rshkruhet mĂ« lart, pĂ«rdor njĂ« kontejner sidecar qĂ« pranon komanda pĂ«rmes HTTP. ĂshtĂ« shkruar nĂ« Java, prandaj ndonjĂ«herĂ« i mungon funksionaliteti mĂ« i avancuar i bibliotekĂ«s client-go. Po ashtu, operatori nuk mbĂ«shtet Racks tĂ« ndryshme pĂ«r njĂ« Datacenter.
Megjithatë, operatori ka disa përparësi, si mbështetje për monitorimin, menaxhimin e nivelit të lartë të klasterit përmes CRD-së dhe madje dokumentacion për krijimin e kopjeve rezervë.
2. Navigator nga Jetstack
- Gatishmëria: Alpha
- Licenca: Apache 2.0
- Implementuar në: Golang
Operator i destinuar për shpërndarjen e DB-as-a-Service. Aktualisht mbështet dy baza të dhënash: Elasticsearch dhe Cassandra. Ka disa zgjidhje interesante, si kontrolli i aksesit në bazën e të dhënave përmes RBAC (për këtë ngrihet një navigator-apiserver i veçantë). Një projekt interesant që meriton vëmendje, megjithatë komiti i fundit u bë një ndihmë një vit e gjysmë më parë, gjë që e ul potencialin e tij.
3. Cassandra-operator nga vgkowski
- Gatishmëria: Alpha
- Licenca: Apache 2.0
- Implementuar në: Golang
Nuk e morëm seriozisht, pasi komiti i fundit në depo ishte më shumë se një vit më parë. Zhvillimi i operatorit është braktisur: versioni më i fundit i Kubernetes, i shpallur si i mbështetur, është 1.9.
4. Cassandra-operator nga Rook
- Gatishmëria: Alpha
- Licenca: Apache 2.0
- Implementuar në: Golang
Operatori, zhvillimi i të cilit po ecën më ngadalë se sa do të dëshironim. Ka një strukturë të menduar mirë për CRD për menaxhimin e klasterit, zgjidh problemin e identifikimit të nyjeve me anë të Shërbimit me ClusterIP (ai 'hack' që përmendëm)... por deri tani, kjo është gjithçka. Nuk ka monitorim dhe backup nga kutia (për shembull, ne ). Një detaj interesant është se me anë të këtij operatori mund të ngrihet gjithashtu ScyllaDB.
NB: Ky ky operator me disa përmirësime e kemi përdorur në një prej projekteve tona. Nuk ka pasur probleme në funksionimin e operatorit gjatë gjithë kohës së përdorimit (~4 muaj punë).
5. CassKop nga Orange
- Gatishmëria: Alpha
- Licenca: Apache 2.0
- Implementuar në: Golang
Operatori më i ri në listë: komenti i parë u bë më 23 maj 2019. Tani për tani, ai ka në arsenalin e tij një numër të madh karakteristikash nga lista jonë, të cilat mund të shqyrtohen më në detaje në repo-n e projektit. Operatorët janë ndërtuar mbi bazën e operator-sdk të njohur. Mbështet monitorimin "nga kutia". Diferenca kryesore nga operatorët e tjerë është përdorimi i , i zbatuar në Python dhe përdorur për komunikimin midis nyjeve Cassandra.
Përfundimet
Numri i qasjeve dhe mundësive të mundshme për migrimin e Cassandra në Kubernetes flet vetë: tema është e kërkuar.
Në këtë fazë, provoni ndonjë gjë nga ato të përshkruara më lart në rrezikun tuaj: asnjë nga zhvilluesit nuk garanton funksionimin 100% të zgjidhjes së tij në ambientin e prodhimit. Por tashmë shumë produkte duken premtuese për t'u përdorur në stendat për zhvillim.
Mendoj se në të ardhmen kjo grua në anije do të vijë në vend!
P.S.
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «»;
- «».
Burimi: habr.com
