본문 바로가기!

K8S Operator

[K8S Operator] Percona Operator for MongoDB

728x90
반응형

1. NoSQL이란?

  • "Not only SQL"로 SQL만을 사용하지 않는 DBMS
  • 비관계형 데이터베이스로 여러 유형의 데이터베이스 사용하며 RDBMS처럼 고정된 스키마가 존재하지 않고 스키마변경, ALERT 등이 필요 없음
  • 쉽게 확장되는 유연한 스키마에 데이터를 저장하는 기술 
    • ex)
    • Key-Value Store(Redis), Wide Column Store(HBase, Cassandra), Document Store(mongoDB, CouchDB), Graph Store(Neo4j)

 

  • SQL과 NoSQL 특징
SQL (RDB) - 관계형DB NoSQL
데이터 중복 방지 데이터 가시성이 좋음
(json 형태로 Document 내부에 Document를 정의 가능)
복잡하고 다양한 질의 가능 join 없이 조회가 가능하여 속도 빠름
여러 테이블을 Join해서 질의하기 때문에 조회가 느림. 스키마가 유연
확장이 느림 Scale-out이 간편
스키마 변경에 대한 공수가 많이 듬 스키마 설계를 못하면 성능이 저하

 

  •  

2. MongoDB란?

    • "Not only SQL"로 SQL만을 사용하지 않는 DBMS
    • 비관계형 데이터베이스로 여러 유형의 데이터베이스 사용하며 쉽게 확장되는 유연한 스키마에 데이터를 저장하는 기술
    • 즉, NoSQL의 한종류로, Document라는 형식의 자료구조를 사용
    • RDBMS와의 용어 대비
      • RDBMS(Database) = MongoDB(Database)
      • RDBMS(Table) = MongoDB(Collection)
      • RDBMS(Row) = MongoDB(Document)
      • RDBMS(Column) = MongoDB(Field)

 

3. Percona Server for MongoDB(PSMDB)

 

Replica set cluster 구성

  • Replica set은 1개의 primary 서버와 여러개의 Secondary 서버로 구성
  • 클라이언트 애플리케이션은 드라이버를 통해 서버에 액세스
  • Sharding - 각 샤드(아래 그림의 공유된 pod1, pod3)는 원본데이터의 일부분을 가지고 있으며 mongo query router가 Entrypoint 역할

 

 

Shared Cluster 구성

  • 샤딩된 클러스터의 경우 각 샤드는 데이터베이스에 저장된 데이터의 하위 집합을 포함하는 복제본 세트이며 mongos 쿼리 라우터는 클라이언트 애플리케이션의 진입점 역할
  • HA 구성 - Operator NodeAffinity로 mongoDB 를 분리
  • Primary가 다운되면, Replicaset이 Primary로 선출됨
  • MongoDB 인스턴스를 실행하고 데이터베이스 클러스터는 최소 3개의 노드가 있는 단일 복제본 세트로 배포
  • 노드가 실패하면 mongod 프로세스가 있는 Pod가 다른 노드에서 자동으로 다시 생성되며 실패한 노드가 기본 서버를 호스팅하는 경우 복제본 세트는 새로운 기본 서버를 선택하기 위한 선택을 시작
  • 실패한 노드가 Operator를 실행 중인 경우 Kubernetes는 다른 노드에서 Operator를 다시 시작하므로 정상적인 작업이 중단되지 않음

 

 

4. Percona Server for MongoDB 설치

  • CRD 설치 및 확인
kubectl apply --server-side -f https://raw.githubusercontent.com/gasida/DOIK/main/psmdb/crd.yaml
kubectl get crd | grep psmdb

 

  • 원활한 작업을 위해 기본 namespace 변경
# 현재 적용되어 있는 context 확인
kubectl config current-context

# context 변경
kubectl config set-context --current --namespace=psmdb

 

  • RBAC & Operator 설치
# RBAC 설치
kubectl apply -f https://raw.githubusercontent.com/gasida/DOIK/main/psmdb/rbac.yaml
kubectl get-all -n psmdb

# 오퍼레이터 설치
curl -s -O https://raw.githubusercontent.com/gasida/DOIK/main/psmdb/operator.yaml
cat operator.yaml | yh
kubectl apply -f operator.yaml
kubectl get deploy,pod
kubectl get-all -n psmdb

 

  • 클러스터 이름으로 사용할 변수 지정
MYNICK=leejunho
echo "export MYNICK=leejunho" >> /etc/profile

 

  • 계정 정보를 위한 Secret 생성
curl -s -O https://raw.githubusercontent.com/gasida/DOIK/main/psmdb/secrets.yaml
cat secrets.yaml
cat secrets.yaml | sed -e "s/my-cluster-name/$MYNICK/" | kubectl apply -f -
cat secrets.yaml
kubectl get secret $MYNICK-secrets
kubectl get secret $MYNICK-secrets -o json | jq .data
kubectl get secret $MYNICK-secrets -o json | jq -r .data.MONGODB_DATABASE_ADMIN_USER | base64 -d ; echo
kubectl get secret $MYNICK-secrets -o json | jq -r .data.MONGODB_DATABASE_ADMIN_PASSWORD| base64 -d ; echo
kubectl get secret $MYNICK-secrets -o json | jq -r .data.MONGODB_CLUSTER_ADMIN_USER | base64 -d ; echo
kubectl get secret $MYNICK-secrets -o json | jq -r .data.MONGODB_CLUSTER_ADMIN_PASSWORD| base64 -d ; echo
kubectl get secret $MYNICK-secrets -o json | jq -r .data.MONGODB_USER_ADMIN_USER | base64 -d ; echo
kubectl get secret $MYNICK-secrets -o json | jq -r .data.MONGODB_USER_ADMIN_PASSWORD| base64 -d ; echo

 

 

  • 클러스터 생성 및 확인
# 클러스터를 띄우기 전 새로운 터미널을 띄워서 모니터링!!!!
watch kubectl get psmdb,sts,pod,svc,ep,pvc
# 클러스터 생성 : 복제 세트(3개 파드) replsets(rs0, size 3)
curl -s -O https://raw.githubusercontent.com/gasida/DOIK/main/psmdb/cr.yaml
cat cr.yaml
grep ^[^#] cr.yaml | yh

curl -s -O https://raw.githubusercontent.com/gasida/DOIK/main/psmdb/cluster1.yaml
cat cluster1.yaml | yh
cat cluster1.yaml | sed -e "s/my-cluster-name/$MYNICK/" | kubectl apply -f - && kubectl get psmdb -w



# 클러스터 생성 정보 확인 : 약자 psmdb
kubectl get perconaservermongodbs
kubectl get psmdb

## 클러스터 상세 정보 확인
kubectl get psmdb gasida -o yaml | kubectl neat | yh

# 클러스타 파드 정보 확인
kubectl get sts,pod -owide
kubectl get svc,ep
kubectl df-pv
kubectl get pvc,pv

# 노드 정보 확인 : affinity.antiAffinityTopologyKey: "kubernetes.io/hostname" 이해하기
# https://docs.percona.com/percona-operator-for-mongodb/constraints.html#affinity-and-anti-affinity
kubectl describe node | more
kubectl get node --label-columns=kubernetes.io/hostname,topology.kubernetes.io/zone

# mongodb 이미지 버전 확인
kubectl get perconaservermongodbs $MYNICK -o jsonpath={.spec.image} ; echo
percona/percona-server-mongodb:6.0.9-7

# (옵션) 설치 리소스 확인
kubectl get-all --namespace=psmdb
kubectl get-all --since 10m
kubectl get-all --only-scope=cluster

## (참고) psmdb 클러스터 삭제 시
cat cluster1.yaml | sed -e "s/my-cluster-name/$MYNICK/" | kubectl delete -f -

 

 

728x90
반응형