ETCD入门学习

时间:2024-05-23 10:31:48

etcd的概念

etcd的目标是构建一个高可用的分布式键值( key-value )数据库,可以用在分布式系统中的各种配置信息管理,服务发现等,这里就不详细讨论了。

etcd的安装

我们介绍etcd的两种安装方式:
1.下载编译好的二进制文件
2.docker安装

下载编译好二进制文件

$ curl -L https://github.com/coreos/etcd/releases/download/v3.2.10/etcd-v3.2.10-linux-amd64.tar.gz -o etcd-v3.2.10-linux-amd64.tar.gz
$ tar xzvf etcd-v3.2.10-linux-amd64.tar.gz
$ cd etcd-v3.2.10-linux-amd64

解压后的文件夹目录结构:
ETCD入门学习
其中etcd为服务主文件,etcdctl为客户端工具用于用户操作etcd。
运行etcd文件:
ETCD入门学习
这时就可以使用etcdctl与服务通信了。
ETCD入门学习

docker安装
由于我拉不下来官方的etcd,所以我选择自己制作etcd镜像
Dockerfile:

FROM alpine:latest
MAINTAINER YBC

RUN apk update && \
    apk add --no-cache bash

COPY etcd /bin/
COPY etcdctl /bin/

EXPOSE 2379
EXPOSE 2380

CMD ["etcd"]

然后运动构建命令

docker build -t etcd:v1 .

这里镜像就构建好了,接下来就是运行容器了。
我最初是这样运行的:

docker run -d -p 2379:2379 -p 2380:2380 --name etcd etcd:v1

然后运行成功了
ETCD入门学习
但是我发现在容器外用etcdctl并不能连接到容器中的etcd服务,即使是暴露了端口也不行,会报如下错误
ETCD入门学习
然后用官方的启动方法

$ export NODE1=192.168.1.21
$ docker run --name etcd \
-p 2379:2379 \
-p 2380:2380 \
--volume=etcd-data:/etcd-data \
etcd:v1 \
etcd \
--data-dir=/etcd-data --name node1 \
--initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \
--advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \
--initial-cluster node1=http://${NODE1}:2380

启动成功,并且可以连接
ETCD入门学习
好了现在我们来分析一下原因,我们看到之前的启动日志
ETCD入门学习
我们可以看到etcd服务默认是向localhost的同伴进行通信的,向localhost的客户端提供服务的,所以我们从主机连接容器中的etcd服务时由于不是本地连接,所以连接被拒绝了。

etcd常用参配置参数解释
–name:方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname
–data-dir:服务运行数据保存的路径,默认为 ${name}.etcd
–snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
–heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms
–eletion-timeout:重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
–listen-peer-urls:和同伴通信的地址(该结点监听通过该端口的来自该IP地址集的同伴的通信),比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost!
–listen-client-urls:对外提供服务的地址(该结点通过该端口向来自该IP地址集的客户端提供服务):比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互
–advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
–initial-advertise-peer-urls:该节点提供给同伴的监听地址,这个值会告诉集群中其他节点
–initial-cluster:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
–initial-cluster-state:新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing
–initial-cluster-token:创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

etcd数据库基本操作

put

$ etcdctl put /testdir/testkey "Hello world"
OK

get

获取指定键的值。例如
$ etcdctl put testkey hello
OK
$ etcdctl get testkey
testkey
hello
支持的选项为
--sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性

del

删除某个键值。例如
$ etcdctl del testkey
1

非数据库操作

watch

使用 etcdctl
298
监测一个键值的变化,一旦键值发生更新,就会输出最新的值。
例如,用户更新 testkey 键值为 Hello world 。
$ etcdctl watch testkey
PUT
testkey
2

member

通过 list 、 add 、 update 、 remove 命令列出、添加、更新、删除 etcd 实
例到 etcd 集群中。
例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。
$ etcdctl member list
422a74f03b622fef, started, node1, http://172.16.238.100:2380, ht
tp://172.16.238.100:23

docker搭建etcd集群

docker-compose.yml内容如下:

version: "3.6"
services:
    node1:
        image: etcd:v1
        volumes:
            - node1-data:/etcd-data
        expose:
            - 2379
            - 2380
        ports:
            - "2379:2379"
            - "2380:2380"
        networks:
            cluster_net:
                ipv4_address: 172.16.238.100
        environment:
            - ETCDCTL_API=3
        command:
            - etcd
            - --data-dir=/etcd-data
            - --name
            - node1
            - --initial-advertise-peer-urls
            - http://172.16.238.100:2380
            - --listen-peer-urls
            - http://0.0.0.0:2380
            - --advertise-client-urls
            - http://172.16.238.100:2379
            - --listen-client-urls
            - http://0.0.0.0:2379
            - --initial-cluster
            - node1=http://172.16.238.100:2380,node2=http://172.16.238.101:2380,node3=http://172.16.238.102:2380
            - --initial-cluster-state
            - new
            - --initial-cluster-token
            - docker-etcd
    node2:
        image: etcd:v1
        volumes:
            - node2-data:/etcd-data
        expose:
            - 2379
            - 2380
        networks:
            cluster_net:
                ipv4_address: 172.16.238.101
        environment:
            - ETCDCTL_API=3
        command:
            - etcd
            - --data-dir=/etcd-data
            - --name
            - node2
            - --initial-advertise-peer-urls
            - http://172.16.238.101:2380
            - --listen-peer-urls
            - http://0.0.0.0:2380
            - --advertise-client-urls
            - http://172.16.238.101:2379
            - --listen-client-urls
            - http://0.0.0.0:2379
            - --initial-cluster
            - node1=http://172.16.238.100:2380,node2=http://172.16.238.101:2380,node3=http://172.16.238.102:2380
            - --initial-cluster-state
            - new
            - --initial-cluster-token
            - docker-etcd
    node3:
        image: etcd:v1
        volumes:
            - node3-data:/etcd-data
        expose:
            - 2379
            - 2380
        networks:
            cluster_net:
                ipv4_address: 172.16.238.102
        environment:
            - ETCDCTL_API=3
        command:
            - etcd
            - --data-dir=/etcd-data
            - --name
            - node3
            - --initial-advertise-peer-urls
            - http://172.16.238.102:2380
            - --listen-peer-urls
            - http://0.0.0.0:2380
            - --advertise-client-urls
            - http://172.16.238.102:2379
            - --listen-client-urls
            - http://0.0.0.0:2379
            - --initial-cluster
            - node1=http://172.16.238.100:2380,node2=http://172.16.238.101:2380,node3=http://172.16.238.102:2380
            - --initial-cluster-state
            - new
            - --initial-cluster-token
            - docker-etcd
volumes:
    node1-data:
    node2-data:
    node3-data:
networks:
    cluster_net:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 172.16.238.0/24

然后运行docker-compose up集群就启动了,用之前的方法去验证。