Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Remak. trad.: Nan atik sa a, Banzai Cloud pataje yon egzanp sou fason zouti koutim li yo ka itilize pou fè Kafka pi fasil pou itilize nan Kubernetes. Enstriksyon sa yo montre kijan ou ka detèmine gwosè pi bon nan enfrastrikti ou a epi konfigirasyon Kafka tèt li pou reyalize debi ki nesesè yo.

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Apache Kafka se yon platfòm difizyon distribye pou kreye sistèm difizyon an tan reyèl serye, évolutive ak pèfòmans segondè. Kapasite enpresyonan li yo ka pwolonje lè l sèvi avèk Kubernetes. Pou sa nou devlope Operatè Open Source Kafka ak yon zouti ki rele Supertubes. Yo pèmèt ou kouri Kafka sou Kubernetes epi sèvi ak divès kalite karakteristik li yo, tankou amann konfigirasyon koutye a, dekale ki baze sou metrik ak reekilib, konsyantizasyon etajè, "mou" (grasyeu) woule mizajou, elatriye.

Eseye Supertubes nan gwoup ou a:

curl https://getsupertubes.sh | sh и supertubes install -a --no-democluster --kubeconfig <path-to-eks-cluster-kubeconfig-file>

Oswa kontakte dokiman. Ou ka li tou sou kèk nan kapasite yo nan Kafka, travay la ak ki se otomatize lè l sèvi avèk Supertubes ak operatè Kafka. Nou te deja ekri sou yo sou blog la:

Lè w deside deplwaye yon gwoup Kafka sou Kubernetes, ou pral gen chans pou w fè fas ak defi pou w detèmine gwosè optimal enfrastrikti ki kache a ak bezwen pou afine konfigirasyon Kafka ou a pou satisfè kondisyon debi. Pèfòmans maksimòm chak koutye detèmine pa pèfòmans eleman enfrastrikti ki kache yo, tankou memwa, processeur, vitès disk, Pleasant rezo, elatriye.

Idealman, konfigirasyon koutye a ta dwe tankou tout eleman enfrastrikti yo itilize nan kapasite maksimòm yo. Sepandan, nan lavi reyèl konfigirasyon sa a se byen konplèks. Li gen plis chans ke itilizatè yo pral konfigirasyon koutye yo maksimize itilizasyon youn oswa de eleman (disk, memwa, oswa processeur). Anjeneral pale, yon koutye montre pèfòmans maksimòm lè konfigirasyon li pèmèt eleman ki pi dousman yo dwe itilize nan limit li yo. Nan fason sa a nou ka jwenn yon lide ki graj sou chaj la ke yon koutye ka okipe.

Teyorikman, nou ka tou estime kantite koutye ki nesesè pou okipe yon chaj bay yo. Sepandan, nan pratik, gen anpil opsyon konfigirasyon nan diferan nivo ke li trè difisil (si se pa enposib) evalye pèfòmans potansyèl de yon konfigirasyon an patikilye. Nan lòt mo, li trè difisil pou planifye yon konfigirasyon ki baze sou kèk pèfòmans bay yo.

Pou itilizatè Supertubes, anjeneral nou pran apwòch sa a: nou kòmanse ak kèk konfigirasyon (enfrastrikti + anviwònman), Lè sa a, mezire pèfòmans li yo, ajiste anviwònman koutye yo epi repete pwosesis la ankò. Sa rive jiskaske eleman ki pi dousman nan enfrastrikti a konplètman itilize.

Nan fason sa a, nou jwenn yon lide pi klè sou konbyen koutye yon gwoup bezwen okipe yon sèten chaj (kantite koutye tou depann de lòt faktè, tankou kantite minimòm kopi mesaj asire rezistans, kantite patisyon. lidè, elatriye). Anplis de sa, nou jwenn insight sou ki konpozan enfrastrikti ki mande dechèl vètikal.

Atik sa a pral pale sou etap sa yo nou pran pou jwenn pi plis nan eleman ki pi dousman nan konfigirasyon inisyal yo ak mezire debi a nan yon gwoup Kafka. Yon konfigirasyon trè fleksib mande pou omwen twa koutye k ap kouri (min.insync.replicas=3), distribye atravè twa diferan zòn aksè. Pou konfigirasyon, echèl ak kontwole enfrastrikti Kubernetes la, nou itilize pwòp platfòm jesyon veso nou an pou nwaj ibrid - Tiyo. Li sipòte sou lokal (fè metal, VMware) ak senk kalite nwaj (Alibaba, AWS, Azure, Google, Oracle), osi byen ke nenpòt konbinezon de yo.

Panse sou enfrastrikti ak konfigirasyon gwoup Kafka

Pou egzanp ki anba yo, nou te chwazi AWS kòm founisè nwaj la ak EKS kòm distribisyon Kubernetes. Yon konfigirasyon menm jan an ka aplike lè l sèvi avèk P.K.E. - Distribisyon Kubernetes soti nan Banzai Cloud, sètifye pa CNCF.

ki gen kapasite

Amazon ofri divès kalite Kalite volim EBS. Nan nwayo a gp2 и io1 gen kondui SSD, sepandan, asire gwo debi gp2 konsome kredi akimile (I/O kredi), Se konsa, nou pi pito kalite a io1, ki ofri debi segondè konsistan.

Kalite egzanp

Pèfòmans Kafka a depann anpil de kachèt paj sistèm operasyon an, kidonk nou bezwen kach ki gen ase memwa pou koutye yo (JVM) ak kachèt paj la. Enstans c5.2xlarge - yon bon kòmansman, depi li gen 16 GB memwa ak optimize pou travay avèk EBS. Dezavantaj li se ke li se sèlman kapab bay pèfòmans maksimòm pou pa plis pase 30 minit chak 24 èdtan. Si kantite travay ou mande pou pi gwo pèfòmans sou yon peryòd tan ki pi long, ou ka vle konsidere lòt kalite egzanp. Se egzakteman sa nou te fè, kanpe nan c5.4xlarge. Li bay maksimòm debi nan 593,75 Mb/s. Debi maksimòm nan yon volim EBS io1 pi wo pase egzanp lan c5.4xlarge, Se konsa, eleman ki pi dousman nan enfrastrikti a gen anpil chans yo dwe debi I/O nan kalite egzanp sa a (ki tès chaj nou yo ta dwe konfime tou).

Сеть

Debi rezo a dwe gwo ase konpare ak pèfòmans nan egzanp VM ak disk la, otreman rezo a vin tounen yon bouche. Nan ka nou an, koòdone rezo a c5.4xlarge sipòte vitès ki rive jiska 10 Gb/s, ki se siyifikativman pi wo pase debi I/O nan yon egzanp VM.

Deplwaman koutye

Koutye yo ta dwe deplwaye (pwograme nan Kubernetes) nan nœuds devwe pou evite konpetisyon ak lòt pwosesis pou CPU, memwa, rezo, ak resous disk.

Java vèsyon

Chwa ki lojik la se Java 11 paske li konpatib ak Docker nan sans ke JVM detèmine kòrèkteman processeurs ak memwa ki disponib nan veso kote koutye a ap kouri. Konnen ke limit CPU yo enpòtan, JVM a entèn ak transparan fikse kantite fil GC ak fil JIT. Nou itilize imaj Kafka a banzaicloud/kafka:2.13-2.4.0, ki gen ladan Kafka vèsyon 2.4.0 (Scala 2.13) sou Java 11.

Si ou ta renmen aprann plis sou Java/JVM sou Kubernetes, tcheke pòs sa yo:

Anviwònman memwa koutye

Gen de aspè kle nan konfigirasyon memwa koutye: anviwònman pou JVM a ak pou gous Kubernetes la. Limit memwa fikse pou yon gous dwe pi gran pase gwosè pil maksimòm pou JVM a gen plas pou metaspas Java ki abite nan memwa pwòp li a ak pou kachèt paj sistèm operasyon ke Kafka itilize aktivman. Nan tès nou yo nou te lanse koutye Kafka ak paramèt -Xmx4G -Xms2G, ak limit memwa pou gous la te 10 Gi. Tanpri sonje ke anviwònman memwa pou JVM a ka jwenn otomatikman lè l sèvi avèk -XX:MaxRAMPercentage и -X:MinRAMPercentage, ki baze sou limit memwa pou gous la.

Anviwònman processeur koutye

Anjeneral pale, ou ka amelyore pèfòmans lè w ogmante paralelis lè w ogmante kantite fil Kafka itilize. Plis processeurs ki disponib pou Kafka, pi bon an. Nan tès nou an, nou te kòmanse ak yon limit nan 6 processeurs ak piti piti (atravè iterasyon) ogmante nimewo yo a 15. Anplis de sa, nou mete num.network.threads=12 nan anviwònman yo koutye ogmante kantite fil ki resevwa done ki soti nan rezo a epi voye li. Imedyatman dekouvri ke koutye disip yo pa t 'kapab resevwa kopi byen vit ase, yo leve soti vivan num.replica.fetchers a 4 pou ogmante vitès koutye disip yo repwodui mesaj lidè yo.

Zouti jenerasyon chaj

Ou ta dwe asire ke dèlko chaj yo chwazi a pa fini nan kapasite anvan gwoup Kafka a (ki se ke yo te referans) rive nan chaj maksimòm li yo. Nan lòt mo, li nesesè pou fè yon evalyasyon preliminè sou kapasite zouti jenerasyon chaj la, epi tou chwazi kalite egzanp pou li ak yon kantite ase processeur ak memwa. Nan ka sa a, zouti nou an pral pwodwi plis chaj pase gwoup Kafka a ka okipe. Apre anpil eksperyans, nou rezoud sou twa kopi c5.4xlarge, chak nan yo te gen yon dèlko kouri.

Benchmarking

Mezi pèfòmans se yon pwosesis iteratif ki gen ladan etap sa yo:

  • mete kanpe enfrastrikti (eks gwoup, gwoup Kafka, zouti jenerasyon chaj, osi byen ke Prometheus ak Grafana);
  • jenere yon chaj pou yon sèten peryòd pou filtre devyasyon o aza nan endikatè pèfòmans yo kolekte;
  • ajiste enfrastrikti koutye a ak konfigirasyon ki baze sou endikatè pèfòmans yo obsève;
  • repete pwosesis la jiskaske nivo ki nesesè nan debi gwoup Kafka reyalize. An menm tan an, li dwe toujou repwodiktif ak demontre varyasyon minim nan debi.

Pwochen seksyon an dekri etap sa yo ki te fèt pandan pwosesis benchmarking gwoup tès la.

Zouti

Zouti sa yo te itilize pou byen vit deplwaye yon konfigirasyon debaz, jenere chaj, ak mezire pèfòmans:

  • Banzai Cloud Pipeline pou òganize yon gwoup EKS soti nan Amazon c Prometheus (pou kolekte Kafka ak mezi enfrastrikti) ak grafana (pou vizyalize mezi sa yo). Nou te pwofite entegre в Tiyo sèvis ki bay siveyans federasyon, koleksyon jounal santralize, analiz vilnerabilite, rekiperasyon dezas, sekirite nan klas antrepriz ak plis ankò.
  • Sangrenèl — yon zouti pou tès chaj yon gwoup Kafka.
  • Dashboard Grafana pou vizyalize mezi Kafka ak enfrastrikti: Kubernetes Kafka, Nœud ekspòtatè.
  • Supertubes CLI pou fason ki pi fasil yo mete kanpe yon gwoup Kafka sou Kubernetes. Zookeeper, operatè Kafka, Envoy ak anpil lòt konpozan yo enstale ak byen konfigirasyon pou kouri yon gwoup Kafka ki pare pou pwodiksyon sou Kubernetes.
    • Pou enstalasyon supertubes CLI sèvi ak enstriksyon yo bay yo isit la.

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

EKS gwoup

Prepare yon gwoup EKS ak nœuds travayè devwe yo c5.4xlarge nan diferan zòn disponiblite pou gous ak koutye Kafka, osi byen ke nœuds dedye pou dèlko chaj la ak enfrastrikti siveyans.

banzai cluster create -f https://raw.githubusercontent.com/banzaicloud/kafka-operator/master/docs/benchmarks/infrastructure/cluster_eks_202001.json

Yon fwa gwoup EKS la kanpe ak fonksyone, pèmèt entegre li yo sèvis siveyans - li pral deplwaye Prometheus ak Grafana nan yon gwoup.

Konpozan sistèm Kafka

Enstale eleman sistèm Kafka (Zookeeper, kafka-operator) nan EKS lè l sèvi avèk supertubes CLI:

supertubes install -a --no-democluster --kubeconfig <path-to-eks-cluster-kubeconfig-file>

Kafka gwoup

Pa default, EKS itilize volim EBS nan kalite gp2, kidonk ou bezwen kreye yon klas depo separe ki baze sou komèsan io1 pou gwoup Kafka:

kubectl create -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "50"
  fsType: ext4
volumeBindingMode: WaitForFirstConsumer
EOF

Mete paramèt pou koutye yo min.insync.replicas=3 epi deplwaye gous koutye sou nœuds nan twa zòn disponiblite diferan:

supertubes cluster create -n kafka --kubeconfig <path-to-eks-cluster-kubeconfig-file> -f https://raw.githubusercontent.com/banzaicloud/kafka-operator/master/docs/benchmarks/infrastructure/kafka_202001_3brokers.yaml --wait --timeout 600

Sijè

Nou te kouri twa ka dèlko chaj an paralèl. Chak nan yo ekri pwòp sijè yo, se sa ki, nou bezwen twa sijè nan total:

supertubes cluster topic create -n kafka --kubeconfig <path-to-eks-cluster-kubeconfig-file> -f -<<EOF
apiVersion: kafka.banzaicloud.io/v1alpha1
kind: KafkaTopic
metadata:
  name: perftest1
spec:
  name: perftest1
  partitions: 12
  replicationFactor: 3
  retention.ms: '28800000'
  cleanup.policy: delete
EOF

supertubes cluster topic create -n kafka --kubeconfig <path-to-eks-cluster-kubeconfig-file> -f -<<EOF
apiVersion: kafka.banzaicloud.io/v1alpha1
kind: KafkaTopic
metadata:
    name: perftest2
spec:
  name: perftest2
  partitions: 12
  replicationFactor: 3
  retention.ms: '28800000'
  cleanup.policy: delete
EOF

supertubes cluster topic create -n kafka --kubeconfig <path-to-eks-cluster-kubeconfig-file> -f -<<EOF
apiVersion: kafka.banzaicloud.io/v1alpha1
kind: KafkaTopic
metadata:
  name: perftest3
spec:
  name: perftest3
  partitions: 12
  replicationFactor: 3
  retention.ms: '28800000'
  cleanup.policy: delete
EOF

Pou chak sijè, faktè replikasyon an se 3—valè minimòm rekòmande pou sistèm pwodiksyon ki trè disponib.

Zouti jenerasyon chaj

Nou te lanse twa kopi dèlko chaj la (yo chak te ekri nan yon sijè separe). Pou gous dèlko chaj, ou bezwen mete afinite ne pou yo pwograme yo sèlman sou nœuds yo atribye ba yo:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: loadtest
  name: perf-load1
  namespace: kafka
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: loadtest
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: loadtest
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: nodepool.banzaicloud.io/name
                operator: In
                values:
                - loadgen
      containers:
      - args:
        - -brokers=kafka-0:29092,kafka-1:29092,kafka-2:29092,kafka-3:29092
        - -topic=perftest1
        - -required-acks=all
        - -message-size=512
        - -workers=20
        image: banzaicloud/perfload:0.1.0-blog
        imagePullPolicy: Always
        name: sangrenel
        resources:
          limits:
            cpu: 2
            memory: 1Gi
          requests:
            cpu: 2
            memory: 1Gi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

Kèk pwen sonje:

  • Dèlko chaj la jenere mesaj ki gen 512 octets nan longè epi li pibliye yo bay Kafka an pakèt 500 mesaj.
  • Sèvi ak yon agiman -required-acks=all Piblikasyon an konsidere kòm siksè lè tout kopi senkronize mesaj la resevwa epi konfime pa koutye Kafka. Sa vle di ke nan referans a nou mezire non sèlman vitès lidè yo resevwa mesaj, men tou, disip yo repwodui mesaj yo. Objektif tès sa a se pa pou evalye vitès lekti konsomatè yo (konsomatè) dènyèman te resevwa mesaj ki toujou rete nan kachèt paj OS, ak konparezon li yo ak vitès lekti mesaj ki estoke sou disk.
  • Dèlko chaj la kouri 20 travayè an paralèl (-workers=20). Chak travayè gen 5 pwodiktè ki pataje koneksyon travayè a ak gwoup Kafka a. Kòm rezilta, chak jeneratè gen 100 pwodiktè, epi yo tout voye mesaj bay gwoup Kafka a.

Siveyans sante gwoup la

Pandan tès chajman Kafka gwoup la, nou te kontwole sante li tou pou asire ke pa te gen okenn rekòmanse pod, pa gen okenn kopi ki pa senkronize, ak debi maksimòm ak fluctuations minim:

  • Dèlko chaj la ekri estatistik estanda sou kantite mesaj pibliye ak pousantaj erè a. To erè a ta dwe rete menm jan an 0,00%.
  • Kontwòl Cruise, deplwaye pa kafka-operator, bay yon tablodbò kote nou ka tou kontwole eta a nan gwoup la. Pou wè panèl sa a fè:
    supertubes cluster cruisecontrol show -n kafka --kubeconfig <path-to-eks-cluster-kubeconfig-file>
  • Nivo ISR (kantite kopi "an-sync") retresi ak ekspansyon egal a 0.

Rezilta mezi

3 koutye, gwosè mesaj - 512 bytes

Avèk patisyon yo menm distribye atravè twa koutye, nou te kapab reyalize pèfòmans ~500 Mb/s (apeprè 990 mil mesaj pou chak segonn):

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Konsomasyon memwa machin vityèl JVM la pa depase 2 GB:

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Debi disk te rive nan maksimòm debi I/O ne sou tout twa ka kote koutye yo te kouri:

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Soti nan done yo sou itilizasyon memwa pa nœuds, li swiv ke sistèm tanpon ak kachèt te pran ~ 10-15 GB:

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

3 koutye, gwosè mesaj - 100 bytes

Kòm gwosè mesaj la diminye, debi desann apeprè 15-20%: tan ki pase nan trete chak mesaj afekte li. Anplis de sa, chaj processeur a prèske double.

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Depi nœuds koutye toujou gen nwayo ki pa itilize yo, pèfòmans yo ka amelyore lè w chanje konfigirasyon Kafka la. Sa a se pa yon travay fasil, kidonk ogmante debi li pi bon pou travay ak pi gwo mesaj.

4 koutye, gwosè mesaj - 512 bytes

Ou ka fasilman ogmante pèfòmans yon gwoup Kafka lè w tou senpleman ajoute nouvo koutye epi kenbe yon balans patisyon (sa asire ke chaj la distribye respire ant koutye). Nan ka nou an, apre yo fin ajoute yon koutye, debi nan gwoup ogmante a ~580 Mb/s (~1,1 milyon mesaj pa segonn). Kwasans la te vin mwens pase espere: sa a se sitou eksplike pa move balans nan patisyon (se pa tout koutye travay nan pikwa kapasite yo).

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Konsomasyon memwa nan machin JVM la rete anba a 2 GB:

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Travay koutye ak kondui te afekte pa move balans nan patisyon:

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Detèmine gwosè apwopriye pou yon gwoup Kafka nan Kubernetes

Jwenn

Apwòch iteratif prezante pi wo a ka elaji pou kouvri senaryo ki pi konplèks ki enplike dè santèn de konsomatè, repartisyon, mizajou woule, rekòmanse pod, elatriye. Tout bagay sa yo pèmèt nou evalye limit kapasite gwoup Kafka a nan divès kondisyon, idantifye blokaj nan operasyon li yo ak jwenn fason pou konbat yo.

Nou fèt Supertubes pou deplwaye yon gwoup byen vit ak fasil, konfigirasyon li, ajoute/retire koutye ak sijè, reponn a alèt, epi asire ke Kafka an jeneral travay byen sou Kubernetes. Objektif nou se ede w konsantre sou travay prensipal la ("jenere" ak "konsome" mesaj Kafka), epi kite tout travay di nan Supertubes ak operatè a Kafka.

Si w enterese nan teknoloji Banzai Cloud ak pwojè Open Source, abònman nan konpayi an nan GitHub, LinkedIn oswa Twitter.

PS soti nan tradiktè

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè