ํ”„๋กœ๋•์…˜์šฉ Cassandra ๊ตฌ์„ฑ

์ด ์ฃผ์ œ์—์„œ๋Š” Apigee Hybrid ํ”„๋กœ๋•์…˜ ์„ค์น˜๋ฅผ ์œ„ํ•ด Cassandra ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹จ๊ณ„์™€ ๊ถŒ์žฅ ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๊ตฌ์„ฑ

๋‹ค์Œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ฐ€์šฉ์„ฑ ๋ณด์žฅ

Cassandra ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด 3๊ฐœ์˜ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์˜์—ญ์ด ๋‹ค์šด๋˜๋ฉด ์˜์—ญ์ด ์˜จ๋ผ์ธ ์ƒํƒœ๋กœ ์ „ํ™˜๋˜๋Š” ๋™์•ˆ ๋‚˜๋จธ์ง€ ์˜์—ญ์ด ์š”์ฒญ์— ๊ณ„์† ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์˜์—ญ 2๊ฐœ ์ด์ƒ์ด ์ž‘๋™ ์ค‘๋‹จ๋˜๋ฉด Cassandra๋Š” ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ์˜์—ญ์ด ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Apigee์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด 3์‹œ๊ฐ„ ์ด๋‚ด์— ์˜์—ญ์„ ๋‹ค์‹œ ์˜จ๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

Cassandra ์Šคํ† ๋ฆฌ์ง€ ์„ค์ • ๊ตฌ์„ฑ

Apigee Hybrid ํ”„๋กœ๋•์…˜์˜ ๊ฒฝ์šฐ Google์—์„œ๋Š” ์žฌ์ •์˜ ํŒŒ์ผ์— ๋‹ค์Œ ์Šคํ† ๋ฆฌ์ง€ ๋ฐ ํž™ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

cassandra:
  ...
  replicaCount: 3
  storage:
    storageclass: your-preferred-ssd-storage #If not using default storage for your cluster
    capacity: 500Gi
  resources:
    requests:
      cpu: 7
      memory: 15Gi
  maxHeapSize: 8192M
  heapNewSize: 1200M

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cassandra์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

helm upgrade datastore apigee-datastore/ \
--namespace apigee \
--atomic \
-f OVERRIDES_FILE.yaml

replicaCount

replicaCount ๊ฐ’์€ 3์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” replicaCount ๊ฐ’์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

  • ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ ์ˆ˜์š”๋ฅผ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  CPU ์‚ฌ์šฉ๋ฅ ์„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์ „๋งˆ๋‹ค ๋‹ค๋ฅธ replicaCount ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ ์žฌ์ •์˜ ํŒŒ์ผ์—์„œ replicaCount๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

storageclass

ํ”„๋กœ๋•์…˜์˜ ๊ฒฝ์šฐ Cassandra ์Šคํ† ๋ฆฌ์ง€๋Š” SSD StorageClass์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์— ๊ธฐ๋ณธ Kubernetes StorageClass๋ฅผ ์‚ฌ์šฉ ์ค‘์ด ์•„๋‹ˆ๋ฉด storageclass์˜ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ StorageClass๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl get storageclass

๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

NAME                     PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
premium-rwo              pd.csi.storage.gke.io   Delete          WaitForFirstConsumer   true                   6d23h
standard                 kubernetes.io/gce-pd    Delete          Immediate              true                   6d23h
standard-rwo (default)   pd.csi.storage.gke.io   Delete          WaitForFirstConsumer   true                   6d23h

๊ธฐ๋ณธ Kubernetes StorageClass๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด StorageClass ๊ตฌ์„ฑ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

ํ˜„์žฌ storageclass ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get pvc -n NAMESPACE cassandra-data-apigee-cassandra-default-0 -o=jsonpath="{['.spec.storageClassName', '.metadata.annotations.volume\.beta\.kubernetes\.io/storage-class']}"
  

storageSize

ํ”„๋กœ๋•์…˜ ์„ค์น˜์˜ ๊ฒฝ์šฐ Google์—์„œ๋Š” 500Gi(๊ธฐ๋น„๋ฐ”์ดํŠธ) ์ด์ƒ์˜ ์Šคํ† ๋ฆฌ์ง€ ํฌ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์Šคํ† ๋ฆฌ์ง€ ์š”๊ตฌ์— ๋งž๊ฒŒ ์Šคํ† ๋ฆฌ์ง€ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด Cassandra ์˜๊ตฌ ๋ณผ๋ฅจ ํ™•์žฅ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ˜„์žฌ ์šฉ๋Ÿ‰ ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get pvc -n NAMESPACE cassandra-data-apigee-cassandra-default-0 -o=jsonpath='{.spec.resources.requests.storage}'
  

cpu ๋ฐ memory

ํ”„๋กœ๋•์…˜ ์„ค์น˜์˜ ๊ฒฝ์šฐ Google์—์„œ๋Š” ํฌ๋“œ๋‹น ์ตœ์†Œ 7๊ฐœ์˜ CPU์™€ ์ตœ์†Œ 15Gi(๊ธฐ๋น„๋ฐ”์ดํŠธ)๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. cassandra.resources.requests.cpu ๋ฐ cassandra.resources.requests.memory๋ฅผ ์ง€์ •ํ•  ๋•Œ๋Š” ํŠธ๋ž˜ํ”ฝ ๋ณผ๋ฅจ ๋ฐ ํ”„๋ก์‹œ์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ CPU ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get pods -n NAMESPACE apigee-cassandra-default-0 -o=jsonpath='{.spec.containers[].resources.requests.cpu}'
  

ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get pods -n NAMESPACE apigee-cassandra-default-0 -o=jsonpath='{.spec.containers[].resources.requests.memory}'
  

maxHeapSize, heapNewSize

์ด๋Ÿฌํ•œ ์†์„ฑ์€ cassandra ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋œ ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ํž™๊ณผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์–‘์„ ๊ฐ๊ฐ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค(ํž™ ํฌ๊ธฐ๋Š” ๋ฉ”๋น„๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ๋กœ ์ง€์ •). ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ Google์€ ๋‹ค์Œ ๊ฐ’์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • maxHeapSize: 8192M
  • heapNewSize: 1200M

์ตœ์  ํž™ ํฌ๊ธฐ ๊ฐ’์€ Kubernetes ํ”Œ๋žซํผ ๊ณต๊ธ‰์—…์ฒด์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ˜„์žฌ maxHeapSize ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get sts -n NAMESPACE apigee-cassandra-default -o=jsonpath='{.spec.template.spec.containers[].env[?(@.name=="MAX_HEAP_SIZE")]}'
  

ํ˜„์žฌ heapNewSize ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get sts -n NAMESPACE apigee-cassandra-default -o=jsonpath='{.spec.template.spec.containers[].env[?(@.name=="HEAP_NEWSIZE")]}'
  

์ด๋Ÿฌํ•œ ์†์„ฑ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์†์„ฑ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ SSD ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ

Cassandra ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋Ÿฐํƒ€์ž„์€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์˜๊ตฌ ๋ณผ๋ฅจ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์†”๋ฆฌ๋“œ ์Šคํ…Œ์ดํŠธ ๋””์Šคํฌ(SSD) ๋“œ๋ผ์ด๋ธŒ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ Cassandra์šฉ์œผ๋กœ SSD๋ฅผ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ์†”๋ฆฌ๋“œ ์Šคํ…Œ์ดํŠธ ๋“œ๋ผ์ด๋ธŒ(SSD)๋กœ ์ง€์›๋˜๋Š” StorageClass ์ •์˜๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‹จ๊ณ„๋Š” StorageClass ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ๋ณธ Kubernetes StorageClass๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด StorageClass ๊ตฌ์„ฑ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ด ์„น์…˜์—์„œ๋Š” Cassandra์˜ ๊ถŒ์žฅ ๊ตฌ์„ฑ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ผ์ผ ๋ฐฑ์—… ์ผ์ • ๊ตฌ์„ฑ

์ž˜๋ชป๋œ ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ Cassandra ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ Google์—์„œ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ผ์ผ ๋ฐฑ์—… ์ผ์ •์„ ๊ตฌ์„ฑํ•˜์„ธ์š”. ๋ฐฑ์—… ํฌ๊ธฐ์™€ ๋นˆ๋„๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ฐฑ์—… ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํŒจํ•  ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Cassandra ์ตœ์†Œ ํด๋Ÿฌ์Šคํ„ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ค€์ˆ˜

Cassandra์˜ ๊ฒฝ์šฐ ์ตœ์†Œ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ๋”ฐ๋ฅด์„ธ์š”.

๋ชจ๋“  ๊ณ ๊ฐ ๋Œ€์ƒ ํ™˜๊ฒฝ์„ ํ”„๋กœ๋•์…˜์œผ๋กœ ์ทจ๊ธ‰

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์„ค์น˜๊ฐ€ '๋น„ํ”„๋กœ๋•์…˜'์œผ๋กœ ๊ฐ„์ฃผ๋˜๋”๋ผ๋„ ํ”„๋กœ๋•์…˜ ๋ ˆ๋”” ์„ค์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ˆ˜๋ฝ ํ…Œ์ŠคํŠธ(UAT) ์„ค์น˜์˜ ์„œ๋น„์Šค ์ค‘๋‹จ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์‚ฌ๊ณ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

'๋น„ํ”„๋กœ๋•์…˜' ๊ณ ๊ฐ ๋Œ€์ƒ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์„ค์น˜์—๋„ ํ”„๋กœ๋•์…˜ ๋ ˆ๋”” ์„ค์ •์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ๋„์›€๋ง์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ๊ณ ๊ฐ ๋Œ€์ƒ ํ™˜๊ฒฝ์— ๋™์ผํ•œ ์›์น™์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŠนํžˆ replicaCount ๋ฐ ๋ฆฌ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌํ•ด ๋ณต๊ตฌ ์›์น™์„ ๋”ฐ๋ฅด์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cassandra ์Šคํ† ๋ฆฌ์ง€ ์„ค์ • ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.