Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî

Em bi rêkûpêk bi databasa Apache Cassandra û hewcedariya xebitandina wê di nav binesaziyek Kubernetes-ê de rû bi rû dimînin. Di vê materyalê de, em ê nêrîna xwe ya gavên pêwîst, pîvan û çareseriyên heyî (tevî nihêrînek operatoran) ji bo koçkirina Cassandra bo K8s parve bikin.

"Yê ku karibe jinê bi rê ve bibe, dikare dewletê jî bi rê ve bibe"

Cassandra kî ye? Ew pergalek hilanînê ya belavkirî ye ku ji bo birêvebirina cildên mezin ên daneyê hatî çêkirin dema ku hebûna bilind bêyî yek xalek têkçûn peyda dike. Proje ne hewce ye ku pêşgotinek dirêj dirêj bike, ji ber vê yekê ez ê tenê taybetmendiyên sereke yên Cassandra ku dê di çarçoveya gotarek taybetî de têkildar be bidim:

  • Cassandra di Java de tê nivîsandin.
  • Topolojiya Cassandra çend astan pêk tîne:
    • Node - yek mînakek Cassandra ya hatî saz kirin;
    • Rack komek mînakên Cassandra ye, ku ji hêla hin taybetmendiyan ve têne yek kirin, di heman navenda daneyê de cih digirin;
    • Datacenter - berhevokek ji hemî komên bûyerên Cassandra yên ku di yek navendek daneyê de cih digirin;
    • Cluster berhevoka hemî navendên daneyê ye.
  • Cassandra navnîşanek IP-ê bikar tîne da ku nodek nas bike.
  • Ji bo lezkirina operasyonên nivîsandin û xwendinê, Cassandra hin daneyan di RAM-ê de hilîne.

Naha - berbi tevgera potansiyela rastîn a Kubernetes.

Check-list ji bo veguhestinê

Di derbarê koçberiya Cassandra ya Kubernetes de diaxivin, em hêvî dikin ku bi tevgerê re ew ê rêvebirinê hêsantir bibe. Ji bo vê dê çi hewce bike, dê çi bi vê yekê re bibe alîkar?

1. Depokirina daneyan

Wekî ku berê jî hate zelal kirin, Cassanda beşek ji daneyan di RAM-ê de hilîne Memtable. Lê beşek din a daneyê heye ku li dîskê tê hilanîn - di formê de SSTable. Heyetek li vê daneyê tê zêdekirin Commit Log - tomarên hemî danûstendinan, ku di dîskê de jî têne tomar kirin.

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî
Di Cassandra de diyagrama danûstendinê binivîsin

Li Kubernetes, em dikarin PersistentVolume bikar bînin da ku daneyan hilînin. Bi saya mekanîzmayên îsbatkirî, xebata bi daneyan li Kubernetes her sal hêsantir dibe.

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî
Em ê SersistentVoluma xwe ji her pod Cassandra re veqetînin

Girîng e ku meriv bala xwe bide ku Cassandra bixwe dubarekirina daneyê vedibêje, ji bo vê mekanîzmayên çêkirî pêşkêşî dike. Ji ber vê yekê, heke hûn komek Cassandra ji hejmareke mezin girêk ava dikin, wê hingê ne hewce ye ku pergalên belavkirî yên wekî Ceph an GlusterFS ji bo hilanîna daneyê bikar bînin. Di vê rewşê de, ew ê mentiqî be ku daneyên li ser dîska mêvandar bikar bînin hilînin dîskên domdar ên herêmî an çekirin hostPath.

Pirsek din ev e ku hûn dixwazin ji bo her şaxek taybetmendiyê ji bo pêşdebiran jîngehek cihêreng biafirînin. Di vê rewşê de, nêzîkatiya rast dê ev be ku meriv yek girêka Cassandra bilind bike û daneyan di hilanînek belavkirî de hilîne, yanî. Ceph û GlusterFS-ya navborî dê vebijarkên we bin. Dûv re pêşdebir dê pê ewle be ku ew ê daneyên ceribandinê winda neke jî heke yek ji girêkên koma Kuberntes winda bibe.

2. Şopandin

Hilbijartina bi rastî bêkêmasî ya ji bo pêkanîna çavdêriyê li Kubernetes Prometheus e (me li ser vê yekê bi berfirehî diaxivî rapora têkildar). Cassandra ji bo Prometheus bi hinardekarên metrîkan re çawa dike? Û, çi hê girîngtir e, bi dashboardên lihevhatî ji bo Grafana?

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî
Mînakek xuyangkirina grafikên li Grafana ji bo Cassandra

Tenê du hinardekar hene: jmx_exporter и cassandra_exporter.

Me ya yekem ji bo xwe hilbijart ji ber ku:

  1. JMX Exporter mezin dibe û pêş dikeve, dema ku Cassandra Exporter nekariye têra xwe piştgirîya civakê bigire. Cassandra Exporter hîn jî piraniya guhertoyên Cassandra piştgirî nake.
  2. Hûn dikarin wê wekî javaagent bi lêzêdekirina alayekê bimeşînin -javaagent:<plugin-dir-name>/cassandra-exporter.jar=--listen=:9180.
  3. Ji bo wî yek heye dashboad têr, ku bi Cassandra Exporter re hevaheng e.

3. Hilbijartina primitives Kubernetes

Li gorî avahiya jorîn a koma Cassandra, em hewl bidin ku her tiştê ku li wir tê vegotin bi termînolojiya Kubernetes wergerînin:

  • Cassandra Node → Pod
  • Cassandra Rack → StatefulSet
  • Cassandra Datacenter → hewza ji StatefulSets
  • Cluster Cassandra → ???

Derket holê ku hin sazûmanek din winda ye ku meriv bi yekcarî tevahiya koma Cassandra bi rê ve bibe. Lê eger tiştek tunebe, em dikarin wê biafirînin! Kubernetes ji bo vê armancê mekanîzmayek heye ku çavkaniyên xwe diyar bike - Pênaseyên Çavkaniya Xweser.

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî
Daxuyaniya çavkaniyên zêde ji bo têketin û hişyariyan

Lê Çavkaniya Xweser bixwe tiştek nayê wateya: her tiştî, ew hewce dike kontirolker. Dibe ku hûn hewce ne ku hûn alîkariyê bigerin Operatorê Kubernetes...

4. Nasnameya Pod

Di paragrafa li jor de, me li hev kir ku yek nodek Cassandra dê di Kubernetes de bi yek podek wekhev be. Lê navnîşanên IP-ê yên podan dê her carê cûda bin. Û naskirina girêkekê li Cassandra li ser bingeha navnîşana IP-yê ye... Derket holê ku piştî her rakirina podek, koma Cassandra dê girêkek nû lê zêde bike.

Rêyek heye, ne tenê yek:

  1. Em dikarin ji hêla nasnameyên mêvandar ve (UUID-yên ku nimûneyên Cassandra-ê yekta nas dikin) an jî bi navnîşanên IP-yê tomar bikin û hemî di hin avahî/tabloyan de hilînin. Rêbaz du kêmasiyên sereke hene:
    • Rîska ku rewşek nijadê çêbibe heke du girê bi carekê de bikevin. Piştî rabûnê, girêkên Cassandra dê di heman demê de navnîşek IP-yê ji tabloyê bixwazin û ji bo heman çavkaniyê pêşbaziyê bikin.
    • Ger nodek Cassandra daneyên xwe winda kiribe, em ê êdî nikaribin wê nas bikin.
  2. Çareseriya duyemîn wekî hackek piçûk xuya dike, lê di heman demê de: em dikarin ji bo her nodek Cassandra Karûbarek bi ClusterIP-ê biafirînin. Pirsgirêkên vê pêkanînê:
    • Ger di komek Cassandra de gelek girêk hebin, em neçar in ku gelek Karûbaran biafirînin.
    • Taybetmendiya ClusterIP bi rêya iptables ve tête bicîh kirin. Ger koma Cassandra gelek (1000... an jî 100?) girêk hebin ev dikare bibe pirsgirêk. Herçi hevsengiya li ser bingeha IPVS dikare vê pirsgirêkê çareser bike.
  3. Çareseriya sêyem ev e ku bi çalakkirina mîhengê li şûna torgilokek taybetî ya podan, ji bo girêkên Cassandra torgilokek girêk bikar bîne. hostNetwork: true. Ev rêbaz hin sînoran ferz dike:
    • Li şûna yekîneyên. Pêdivî ye ku girêka nû bi heman navnîşana IP-ya berê hebe (di ewrên mîna AWS, GCP de ev hema hema ne mumkun e ku were kirin);
    • Bi karanîna torgilokek girêkên komê, em dest bi pêşbaziya çavkaniyên torê dikin. Ji ber vê yekê, danîna zêdetirî yek pod bi Cassandra re li ser yek girêkek komê dê pirsgirêk be.

5. Backups

Em dixwazin guhertoyek tevahî ya daneyên yek girêka Cassandra li ser bernameyek hilînin. Kubernetes bi karanîna taybetmendiyek hêsan peyda dike CronJob, lê li vir Kasandra bi xwe qijekê dixe nav çerxên me.

Bila ez ji we re bi bîr bînim ku Cassandra hin daneyan di bîranînê de hilîne. Ji bo ku hûn paşgirek tevahî çêbikin, hûn hewceyê daneyên ji bîranînê (Memtables) biçe ser dîskê (SSTables). Di vê nuqteyê de, girêka Cassandra pejirandina girêdanan rawestîne, bi tevahî ji komê qut dibe.

Piştî vê yekê, paşgir tê rakirin (snapshot) û nexşe xilas dibe (keyspace). Û dûv re derket holê ku tenê hilanînê tiştek nade me: pêdivî ye ku em nasnameyên daneyê yên ku girêka Cassandra berpirsiyar e hilînin - ev nîşanek taybetî ne.

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî
Belavkirina nîşanan ji bo destnîşankirina kîjan daneyan girêkên Cassandra berpirsiyar in

Mînakek skrîpta ji bo girtina paşgirek Cassandra ji Google li Kubernetes dikare li vir were dîtin vê girêdanê. Yekane xala ku skrîptê nahesibîne ev e ku berî kişandina wêneyê daneyan li girêkê vegerîne. Ango paşgir ne ji bo rewşa heyî, lê ji bo dewletek hindik berê tê kirin. Lê ev dibe alîkar ku girêk ji operasyonê dernekevin, ku pir mentiqî xuya dike.

set -eu

if [[ -z "$1" ]]; then
  info "Please provide a keyspace"
  exit 1
fi

KEYSPACE="$1"

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

if [[ $? -ne 0 ]]; then
  echo "Error while making snapshot"
  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}"

Mînakek skrîptek bash ji bo hilanînê ji yek girêka Cassandra

Ji bo Cassandra li Kubernetes çareseriyên amade ne

Naha ji bo bicîhkirina Cassandra li Kubernetes çi tê bikar anîn û kîjan ji van çêtirîn li gorî hewcedariyên hatine dayîn?

1. Çareseriyên li ser bingeha nexşeyên StatefulSet an Helm

Bikaranîna fonksiyonên bingehîn ên StatefulSets ji bo meşandina komek Cassandra vebijarkek baş e. Bi karanîna şablonên Helm chart û Go, hûn dikarin ji bo bicîhkirina Cassandra navgînek maqûl peyda bikin.

Ev bi gelemperî baş dixebite ... heya ku tiştek nediyar çêbibe, wekî têkçûna nodê. Amûrên standard Kubernetes bi hêsanî nikarin hemî taybetmendiyên ku li jor hatine destnîşan kirin hesab bikin. Digel vê yekê, ev nêzîkatî di qasê ku dikare ji bo karanîna tevlihevtir were dirêj kirin de pir sînordar e: guheztina nodê, paşvekişandin, başkirin, çavdêrîkirin, hwd.

Nûner:

Her du nexşe bi heman rengî baş in, lê bi pirsgirêkên ku li jor hatine destnîşan kirin ve girêdayî ne.

2. Çareseriyên li ser Kubernetes Operator

Vebijarkên weha balkêştir in ji ber ku ew ji bo birêvebirina komê fersend peyda dikin. Ji bo sêwirana operatorek Cassandra, mîna her databasek din, nimûneyek baş mîna Sidecar <-> Kontrolker <-> CRD xuya dike:

Koçberiya Cassandra bo Kubernetes: taybetmendî û çareserî
Pîlana rêveberiya nodê di operatorek Cassandra-ya xweş-sêwirandî de

Ka em li operatorên heyî binêrin.

1. Cassandra-operator ji instaclustr

  • GitHub
  • Amadebûn: Alpha
  • Lîsans: Apache 2.0
  • Pêkanîna li: Java

Ev bi rastî projeyek pir hêvîdar û bi aktîvî pêşkeftî ye ji pargîdaniyek ku bicîhkirina Cassandra-ya birêvebir pêşkêşî dike. Ew, wekî ku li jor hatî destnîşan kirin, konteynirek kêlek bikar tîne ku bi HTTP-ê fermanan qebûl dike. Di Java-yê de hatî nivîsandin, carinan ew fonksiyona pêşkeftî ya pirtûkxaneya xerîdar-go tune ye. Di heman demê de, operator ji bo yek Datacenter Racks cûda piştgirî nake.

Lê operator xwedan avantajên wekî piştgirî ji bo şopandinê, rêveberiya komê ya asta bilind bi karanîna CRD-ê, û tewra belgekirina çêkirina paşvekişandinê heye.

2. Navîgator ji Jetstack

  • GitHub
  • Amadebûn: Alpha
  • Lîsans: Apache 2.0
  • Li: Golangê pêk hatiye

Daxuyaniyek ku ji bo bicîhkirina DB-as-a-Service hatî çêkirin. Niha du databasan piştgirî dike: Elasticsearch û Cassandra. Ew çareseriyên balkêş ên wekî kontrola gihîştina databasê bi riya RBAC-ê heye (ji bo vê yekê ew navîgator-apiserver-a xweya veqetandî heye). Projeyek balkêş e ku dê hêja be ku meriv ji nêz ve lê binihêre, lê peywira paşîn sal û nîv berê hate çêkirin, ku eşkere potansiyela wê kêm dike.

3. Cassandra-operatorê vgkowski

  • GitHub
  • Amadebûn: Alpha
  • Lîsans: Apache 2.0
  • Li: Golangê pêk hatiye

Wan ew "cidî" nehesiband, ji ber ku paşîn paşîn ji depoyê re bêtirî salek berê bû. Pêşveçûna operatorê hate terikandin: guhertoya herî dawî ya Kubernetes ku wekî piştgirî hatî ragihandin 1.9 e.

4. Cassandra-operator ji aliyê Rook

  • GitHub
  • Amadebûn: Alpha
  • Lîsans: Apache 2.0
  • Li: Golangê pêk hatiye

Operatorek ku pêşkeftina wê bi qasî ku em dixwazin bi lez pêş nakeve. Ew ji bo rêveberiya komê xwedan avahiyek CRD-ya baş-fikirkirî ye, pirsgirêka nasîna girêkan bi karanîna Karûbarê bi ClusterIP (eynî "hack") çareser dike... lê ew ji bo niha ye. Heya nuha tu çavdêrî û paşvekêşek ji qutiyê tune (bi awayê, em ji bo çavdêriyê ne xwe girt). Xalek balkêş ev e ku hûn dikarin ScyllaDB jî bi karanîna vê operatorê bicîh bikin.

NB: Me di yek ji projeyên xwe de ev operator bi guhertinên piçûk bikar anî. Di tevahiya heyama xebatê de (~ 4 mehên xebatê) di xebata operatorê de ti pirsgirêk nehatin dîtin.

5. CassKop ji Orange

  • GitHub
  • Amadebûn: Alpha
  • Lîsans: Apache 2.0
  • Li: Golangê pêk hatiye

Operatorê herî ciwan ê di navnîşê de: Yekem peywira di 23-ê Gulana 2019-an de hate çêkirin. Jixwe naha ew di arsenala xwe de hejmareke mezin ji taybetmendiyên ji navnîşa me heye, ku bêtir hûrguliyên wan di depoya projeyê de têne dîtin. Operator li ser bingeha operator-sdk-ya populer hatî çêkirin. Piştgiriya çavdêriya ji qutiyê dike. Cûdahiya sereke ji operatorên din karanîn e Pêveka CassKop, di Python de hatî bicîh kirin û ji bo danûstendina di navbera girêkên Cassandra de tê bikar anîn.

vebiguherin

Hejmara nêzîkatî û vebijarkên gengaz ên ji bo veguheztina Cassandra ji Kubernetes re bi xwe diaxive: mijar daxwaz e.

Di vê qonaxê de, hûn dikarin yek ji jor bi xeter û xetera xwe biceribînin: yek ji pêşdebiran 100% operasyona çareseriya xwe di hawîrdorek hilberînê de garantî nake. Lê jixwe, gelek hilber sozdar xuya dikin ku hewl bidin ku di beşên pêşkeftinê de bikar bînin.

Ez difikirim ku di pêşerojê de ev jina li ser keştiyê dê bi kêrî were!

PS

Li ser bloga me jî bixwînin:

Source: www.habr.com

Add a comment