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)
- MongoDB용 Percona Server는 MongoDB Community Edition을 확장하여 MongoDB Enterprise Edition에서만 사용할 수 있는 기능을 포함
- https://docs.percona.com/percona-server-for-mongodb/6.0/comparison.html
- Percona Operator 는 PSMDB를 생성, 변경, 삭제 등 관리한느 역할을 하며 PSMDB의 replicaset 또한 담당
- Operator를 통해 PSMDB의 Replicaset 혹은 Shared Cluster를 구성 가능
- https://docs.percona.com/percona-operator-for-mongodb/architecture.html
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
반응형
'K8S Operator' 카테고리의 다른 글
[K8S Operator] Vault Secrets Operator(VSO) (1) | 2023.11.26 |
---|---|
[K8S Operator] Kafka & Strimzi Operator (1) | 2023.11.18 |
[K8S Operator] Cloud Native PostgreSQL 오퍼레이터 (0) | 2023.11.04 |
[K8S Operator] Operator& MySQL Operator (1) | 2023.10.29 |