etcd는 분산 key-value store다. CoreOS에서 coreos 인스턴스의 클러스터를 관리하기 위해서 사용했으며, 구글의 클러스터 컨테이너 관리 소프트웨어인 Kubernetes의 백엔드 시스템으로 사용하면서 더 유명해 졌다. 오픈소스로 GitHub에서 다운로드 해서 사용 할 수 있다. etcd는 네트워크로 연결된 노드들 중 리더를 선정해서 클러스터를 관리한다. 데이터는 분산 저장되기 때문에 리더를 포함한 시스템의 오류에 대한 내성을가진다.
응용 프로그램은 etcd에 데이터를 읽고 쓸 수 있다. 간단한 예제는 데이터베이스 연결 정보와 플래그 값을 etcd에 저장하는 것이다. etcd는 값 변경에 대한 감시 기능을 제공하므로 설정이 변경될 경우 앱을 재구성할 수있다. 좀 더 나아가면 데이터에 대한 일관성을 보장하는 점을 활용해서 리더를 선출하고, 작업 클러스터 전체에 대한 분산 잠금을 수행 할 수 있다.
etcd는 하나의 마스터(master)와 하나 이상의 팔로워(follower)로 구성된다.
테스트를 위한 etcd cluster 구성 환경
VirtualBox를 이용해서 etcd-01, etcd-02, etcd-03 3개의 테스트 운영체제를 실행 했다. 게스트 운영체제로는 우분투리눅스 18.04를 사용했다.
노드 이름
주소
호스트 이름
etcd-01
192.168.56.101
etcd-01.example.com
etcd-02
192.168.56.102
etcd-02.example.com
etcd-03
192.168.56.103
etcd-03.example.com
etcd 설치
Coreos Github에서 tar.gz을 다운로드 받아서 설치했다. 2018년 7월 30일 현재 최신버전은 v3.3.9다. 압축을 푼 다음 etcd와 etcdctl을 /usr/local/bin에 복사한다. /usr/local/bin을 환경변수 PATH에 등록했다.
initial-cluster에 클러스터를 구성하는 peer 노드의 URL을 설정한다. 이 값은 initial-advertise-peer-urls와 서로 일치해야 한다.
테스트등의 목적으로 여러 개의 클러스터가 구서오딜 수 있으므로, 각 클러스터를 구분하기 위해서 유일한 initial-cluster-token을 설정하자. 이렇게 하면 etcd가 동일한 구성을 가지더라도 고유한 클러스터 ID와 peer 노드들로 구성된 클러스터를 만들 수 있다.
listen-client-urls는 클라이언트가 연결할 URL이다. etcd의 각 구성노드들은 advertise-client-urls에 지정된 URL을 다른 노드, 클라이언트, 프록시에 알린다.
실행하고 나면 실행 디렉토리 밑에 {name}.etcd파일이 만들어진다. 이 디렉토리 밑에 etcd의 데이터파일들이 저장된다.
클러스터 관리
etcd는 HTTP 기반의 REST API를 제공한다. 이 API를 이용해서 클러스터를 관리 할 수 있다.
# etcdctl cluster-health
member 11796896800e7f4d is healthy: got healthy result from http://192.168.56.101:2379
member 4a84c8889f5d7a35 is healthy: got healthy result from http://192.168.56.103:2379
member b3a64181bea306fb is healthy: got healthy result from http://192.168.56.102:2379
cluster is healthy
etcd 클러스터의 멤버리스트를 확인해 보자.
root@etcd-01:~# etcdctl member list
11796896800e7f4d: name=etcd-01 peerURLs=http://192.168.56.101:2380 clientURLs=http://192.168.56.101:2379 isLeader=true
4a84c8889f5d7a35: name=etcd-03 peerURLs=http://192.168.56.103:2380 clientURLs=http://192.168.56.103:2379 isLeader=false
b3a64181bea306fb: name=etcd-02 peerURLs=http://192.168.56.102:2380 clientURLs=http://192.168.56.102:2379 isLeader=false
멤버의 이름 peer URL, client URL, 리더를 확인 할 수 있다. etcd-01이 리더인데, 이녀석을 죽이면 어떻게 될까 ? 테스트해봤다.
$ etcdctl cluster-health
member 11796896800e7f4d is unreachable: [http://192.168.56.101:2379] are all unreachable
member 4a84c8889f5d7a35 is healthy: got healthy result from http://192.168.56.103:2379
member b3a64181bea306fb is healthy: got healthy result from http://192.168.56.102:2379
리더가 바뀐걸 확인 할 수 있다.
$ etcdctl member list
11796896800e7f4d: name=etcd-01 peerURLs=http://192.168.56.101:2380 clientURLs=http://192.168.56.101:2379 isLeader=false
4a84c8889f5d7a35: name=etcd-03 peerURLs=http://192.168.56.103:2380 clientURLs=http://192.168.56.103:2379 isLeader=false
b3a64181bea306fb: name=etcd-02 peerURLs=http://192.168.56.102:2380 clientURLs=http://192.168.56.102:2379 isLeader=true
etcd는 raft알고리즘으로 리더를 설정한다. 언젠가 이쪽도 한번 살펴봐야 겠다.
적절한 클러스터 사이즈
권장되는 클러스터 크기는 3, 5, 7이며, 내결함성 요구 사항에 따라서 크기가 결정된다. 크기가 7인 경우 거의 완전한 내결함성을 제공 할 수 있다. 클러스터가 클 수록 내결함성이 향상되지만 데이터 복제가 많아지기 대문에 쓰기 성능이 저하된다. 아래표는 클러스터 크기에 따른 결함 허용을 나타내고 있다.
In-Order 키는 선입선출(FIFO) 방식의 작업큐를 만들 때 유용하게 사용 할 수 있다.
Atomic Compare-and-Swap
분산 시스템에서 어떤 Key의 값을 제대로 업데이트하는게 쉬운일이 아니다. 특정 Key에 두 개 이상의 클라이언트가 값을 읽어서 업데이트를 할 수 있기 때문이다. etcd는 분산 잠금 기능을 이용한 compareAndSwap(CAS)를 제공한다. 이 명령을 이용하면 key의 값이 현재 조건과 동일 할 때만 key 값을 변경 할 수 있다.
CAS는 디렉토리에 대해서는 작동하지 않는다.
3가지 비교 조건을 사용 할 수 있다.
prevExist : key 가 존재하는지 확인한다. true인 경우 key가 존재하면 값을 변경하고 false인 경우 key가 존재하지 않을 때 값을 변경한다.
Contents
etcd
테스트를 위한 etcd cluster 구성 환경
etcd 설치
Static cluster 구성
클러스터 관리
모니터링
적절한 클러스터 사이즈
클러스터 크기 변경
etcd REST API
version
Key & Value 설정
key에 대한 값 가져오기
Key 삭제하기
TTL 설정
TTL 재 설정
데이터 변경 이벤트를 기다리기
Automically Creating In-Order Keys
Atomic Compare-and-Swap
Atomic Compare-and-Delete
디렉토리 만들기
디렉토리 삭제
통계 및 모니터링
리더 통계
자신의 통계 정보 화인
앞으로 할 것
Recent Posts
Archive Posts
Tags