2021년 06월 30일 작성
distributed reliable key-value store
: /etc
+ d
istributed system (“엣-시디”로 읽음)
CNCF(Cloud Native Computing Foundation) Graduated 프로젝트.
CoreOS Container Linux를 관리하기 위해 개발되었다.
Simple Interface : Read, Write는 JSON 포맷으로 HTTP를 통해 이루어졌다.
Key-value storage : 파일시스템처럼 계층화된 디렉토리에 데이터를 저장할 수 있다.
Watch for Changes : 특정 키나 디렉토리의 변경을 감시하다 변경에 react 할 수 있다.
외 AWS, Google, IBM, Alibaba 등 회사들의 다수 상용 프로덕션들.
(kubernetes, ROOK, CoreDNS는 CNCF 프로젝트이므로 M3만 간단히 소개함)
M3 (by Uber)
: a Large-scale Time Series Metrics Platform for Prometheus
Components
etcd의 사용
다른 분산 시스템에서 시스템을 관리하는 용도로 주로 사용하는 듯.
(https://alibaba-cloud.medium.com/getting-started-with-kubernetes-etcd-a26cba0b4258)
etcd의 백엔드 DB는 BoltDB로 구성되어 있다. Go로 작성되었으며, 빠르고 가벼운 Key-Value Store이다.
etcd는 주로 3개의 노드나 5개의 홀수 개 노드로 구성되며, 노드들은 Raft 합의 알고리즘을 이용해 협력한다.
클러스터에서 노드들은 leader와 follower로 구분되고, leader는 알고리즘에 따라 선출된다.
복잡한 Lamport의 Paxos 알고리즘보다 더 이해하기 쉽게 설계된 consensus 알고리즘이다.
Raft consensus 과정 간단히 알아보기
그림
그림
그림 은 클러스터의 초기 상태를 나타냄. 모든 노드는 Follower이고, 타이머를 가지고 있다.
현재 Leader 노드가 없으므로, 먼저 timeout이 발생한 S2 노드가 Candidate로 전환되고 투표를 시작한다.
그림
그림
S2에 대한 투표를 다른 노드들이 찬성하고, 나중에 온 S4의 투표 메세지는 반대(마이너스 표시)한다.
etcd RPC의 서비스 기능에 따른 분류
etcd 클러스터를 관리하기 위한 서비스
https://alibaba-cloud.medium.com/getting-started-with-kubernetes-etcd-a26cba0b4258
Data Model - Logical View
etcd는 데이터를 multi-version으로 저장한다.
Data Model - Physical View
etcd는 키 밸류 쌍을 B+ Tree로 저장한다.
또한 etcd는 키에 대한 Range Query를 빠르게 하기 위해 인 메모리 B Tree를 하나 더 둔다.
쿠버네티스에서는 etcd를 클러스터의 데이터(설정 데이터, 클러스터 상태, 메타데이터 등)를 관리하는 용도로 사용한다.
Watch
기능은 키의 수정에 대한 모니터링을 제공하므로, 클러스터를 선언한 상태(Desired State)로 계속해서 유지하려 하는 쿠버네티스에 적합하다.kubectl 명령 등으로 쿠버네티스 클러스터의 데이터를 읽는 명령은 모두 etcd에 저장된 데이터를 읽어 제공된다.
(예시로 kube-system 네임스페이스로 구동되고 있는 파드의 이름들을 출력해봤다.)
$ kubectl get pods -n kube-system -o name
pod/coredns-74ff55c5b-ksmcb
pod/coredns-74ff55c5b-wjxnx
pod/dragon-tf-operator
pod/etcd-dnclab1-master
pod/kube-apiserver-dnclab1-master
pod/kube-controller-manager-dnclab1-master
pod/kube-flannel-ds-22cdr
pod/kube-flannel-ds-5lqc4
pod/kube-flannel-ds-js4jq
pod/kube-flannel-ds-ld9bs
pod/kube-proxy-9nvqm
pod/kube-proxy-ft77b
pod/kube-proxy-hxlhd
pod/kube-proxy-s6nbd
pod/kube-scheduler-dnclab1-master
pod/kube-state-metrics-5c544bc55-ffzpd
pod/metrics-server-5f8ff9b957-bpdm5
pod/nvidia-device-plugin-daemonset-1.12-9xcpn
pod/nvidia-device-plugin-daemonset-1.12-pptfm
pod/nvidia-device-plugin-daemonset-1.12-qnhxm
$ ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key \
get /registry/pods/kube-system \
--prefix --keys-only
/registry/pods/kube-system/coredns-74ff55c5b-ksmcb
/registry/pods/kube-system/coredns-74ff55c5b-wjxnx
/registry/pods/kube-system/dragon-tf-operator
/registry/pods/kube-system/etcd-dnclab1-master
/registry/pods/kube-system/kube-apiserver-dnclab1-master
/registry/pods/kube-system/kube-controller-manager-dnclab1-master
/registry/pods/kube-system/kube-flannel-ds-22cdr
/registry/pods/kube-system/kube-flannel-ds-5lqc4
/registry/pods/kube-system/kube-flannel-ds-js4jq
/registry/pods/kube-system/kube-flannel-ds-ld9bs
/registry/pods/kube-system/kube-proxy-9nvqm
/registry/pods/kube-system/kube-proxy-ft77b
/registry/pods/kube-system/kube-proxy-hxlhd
/registry/pods/kube-system/kube-proxy-s6nbd
/registry/pods/kube-system/kube-scheduler-dnclab1-master
/registry/pods/kube-system/kube-state-metrics-5c544bc55-ffzpd
/registry/pods/kube-system/metrics-server-5f8ff9b957-bpdm5
/registry/pods/kube-system/nvidia-device-plugin-daemonset-1.12-9xcpn
/registry/pods/kube-system/nvidia-device-plugin-daemonset-1.12-pptfm
/registry/pods/kube-system/nvidia-device-plugin-daemonset-1.12-qnhxm
글 초반에 서술했듯이 키는 계층적으로 저장되고 있으며, kube-system 네임스페이스를 나타내는 키 밑에 파드들의 키 또한 생성되어 있다. 조회하고 싶은 파드에 대한 키로 조회하면 해당 파드에 대한 설정을 얻을 수 있다.
/registry/pods/{namespace}/{pod_name}
키에 존재한다./registry/namespaces/{namespace}
키에 존재한다.etcd는 key-value store이고 성능도 좋아보이는데, 다른 NoSQL 데이터베이스들을 아예 대체해서 사용할 수는 없을까?
etcd는 메인 데이터베이스로 주로 쓰이는 MongoDB 등의 DBMS와 달리, 분산 시스템의 네트워크 장애 등 상황에서 한정된 양의 데이터를 보다 더 신뢰성 있게(reliable) 관리하는 것에 중점을 두고 개발되었다.
M3
etcd
vs NoSQL