什么是 ETCD
随着 CoreOS 和 Kubernetes 等项目在开源社区日益火热, 它们项目中都用到的 etcd 组件作为一个高可用, 强一致性的服务发现存储仓库, 渐渐为开发人员所关注.
在云计算时代, 如何让服务快速透明地接入到计算集群中, 如何让共享配置信息快速被集群中的所有机器发现,
更为重要的是, 如何构建这样一套高可用, 安全, 易于部署以及响应快速的服务集群, 已经成为了迫切需要解决的问题.
etcd 为解决这类问题带来了福音, 它是一个高可用的 Key/Value 存储系统, 内部采用 raft 协议作为一致性算法.
准备好了吗, 干货要来了, are you ok ?
本飞猪教程内容简介
1.etcd 的安装
2. 搭建单机版
3. 搭建集群版
4. 使用监听功能 watch(服务发现)
5. 使用 REST API
6. 搭建 web 界面并使用
一. 安装
下载地址: https://github.com/coreos/etcd/releases/
- mkdir -p /home/chenqionghe/test/etcd/
- cd !$
- # 下载
- wget https://github.com/etcd-io/etcd/releases/download/v3.3.12/etcd-v3.3.12-linux-amd64.tar.gz
- # 解压安装
- tar zxvf etcd-v3.3.12-Linux-amd64.tar.gz
- cd etcd-v3.3.12-Linux-amd64
- ## 将启动文件和命令管理文件拷贝到 PATH 找到的路径中
- cp etcd /usr/local/bin
- cp etcdctl /usr/local/bin
- cp -r etcd-v3.2.5-Linux-amd64 /usr/local/etcd #将软件放置到常用目录下
启动参数解释
--name
etcd 集群中的节点名, 这里可以随意, 可区分且不重复就行
--listen-peer-urls
监听的用于节点之间通信的 url, 可监听多个, 集群内部将通过这些 url 进行数据交互 (如选举, 数据同步等)
--initial-advertise-peer-urls
建议用于节点之间通信的 url, 节点间将以该值进行通信.
--listen-client-urls
监听的用于客户端通信的 url, 同样可以监听多个.
--advertise-client-urls
建议使用的客户端通信 url, 该值用于 etcd 代理或 etcd 成员与 etcd 节点通信.
--initial-cluster-token etcd-cluster-1
节点的 token 值, 设置该值后集群将生成唯一 id, 并为每个节点也生成唯一 id, 当使用相同配置文件再启动一个集群时, 只要该 token 值不一样, etcd 集群就不会相互影响.
--initial-cluster
也就是集群中所有的 initial-advertise-peer-urls 的合集
--initial-cluster-state new
新建集群的标志
二. 搭建单机版
直接启动
etcd
etcd 默认监听的是 localhost 的 2379 端口, 既只监听了 lo 设备, 这样会导致启动后集群中的其他机器无法访问
因此我们可以在启动的时候将默认的 localhost 改成 0.0.0.0, 确保 etcd 监听了所有网卡.
etcd -listen-client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://0.0.0.0:2379"
注意: etcd 有要求, 如果 --listen-client-urls 被设置了, 那么就必须同时设置 --advertise-client-urls, 所以即使设置和默认相同, 也必须显式设置
我们来使用 curl 来测试一下, 是否可以远程访问, 这里我的机器 IP 是 10.211.55.25
- ~ curl -L http://10.211.55.25:2379/version
- {
- "etcdserver":"3.3.12","etcdcluster":"3.3.0"
- }
当然, 我们也可以通过 docker 运行, 这里给出启动脚本
- #!/usr/bin/env bash
- ETCD_NAME="etcd"
- ETCD_VERSION="v3.3.1"
- ETCD_PORT_CLIENT=2379
- ETCD_PORT_NODE=2380
- docker run -d \
- -p ${ETCD_PORT_CLIENT}:2379 \
- -p ${ETCD_PORT_NODE}:2380 \
- --name ${ETCD_NAME} quay.io/coreos/etcd:${ETCD_VERSION} \
- /usr/local/bin/etcd \
- --data-dir=/etcd-data --name node1 \
- --initial-advertise-peer-urls http://0.0.0.0:2380 --listen-peer-urls http://0.0.0.0:2380 \
- --advertise-client-urls http://0.0.0.0:2379 --listen-client-urls http://0.0.0.0:2379 \
- --initial-cluster node1=http://0.0.0.0:2380
三. 搭建集群版
Etcd 构建自身高可用集群主要有三种形式:
静态发现: 预先已知 Etcd 集群中有哪些节点, 在启动时直接指定好 Etcd 的各个 node 节点地址
Etcd 动态发现: 通过已有的 Etcd 集群作为数据交互点, 然后在扩展新的集群时实现通过已有集群进行服务发现的机制
DNS 动态发现: 通过 DNS 查询方式获取其他节点地址信息
这里我们采用 Static 方式, 准备三台机器, ip 如下 (都已经安装 etcd)
- node1 10.211.55.2
- node2 10.211.55.25
- node3 10.211.55.26
进入 node1, 创建并运行 run.sh, 脚本内容如下
- #!/usr/bin/env bash
- # 节点名称
- ETCD_NAME=node-1
- # 本机 IP 地址
- LOCAL_IP=10.211.55.2
- #ETCD 存储目录
- ETCD_DATA_DIR=/usr/local/etcd/data
- # 初始化名称
- INITIAL_CLUSTER_TOKEN=cqh-test-cluster
- # 初始化群集列表
- INITIAL_CLUSTER="node-1=http://10.211.55.2:2380,node-2=http://10.211.55.25:2380,node-3=http://10.211.55.26:2380"
- # 初始化状态
- INITIAL_CLUSTER_STATE=new
- # 开始运行
- etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} \
- --initial-advertise-peer-urls http://${LOCAL_IP}:2380 \
- --listen-peer-urls http://${LOCAL_IP}:2380 \
- --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://${LOCAL_IP}:2379 \
- --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} \
- --initial-cluster ${INITIAL_CLUSTER} \
- --initial-cluster-state ${INITIAL_CLUSTER_STATE}
进入 node2, 创建并运行 run.sh, 脚本内容和 node1 差不多 (只修改了 ETCD_NAME 和 LOCAL_IP)
- #!/usr/bin/env bash
- # 节点名称
- ETCD_NAME=node-2
- # 本机 IP 地址
- LOCAL_IP=10.211.55.25
- #ETCD 存储目录
- ETCD_DATA_DIR=/usr/local/etcd/data
- # 初始化名称
- INITIAL_CLUSTER_TOKEN=cqh-test-cluster
- # 初始化群集列表
- INITIAL_CLUSTER="node-1=http://10.211.55.2:2380,node-2=http://10.211.55.25:2380,node-3=http://10.211.55.26:2380"
- # 初始化状态
- INITIAL_CLUSTER_STATE=new
- # 开始运行
- etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} \
- --initial-advertise-peer-urls http://${LOCAL_IP}:2380 \
- --listen-peer-urls http://${LOCAL_IP}:2380 \
- --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://${LOCAL_IP}:2379 \
- --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} \
- --initial-cluster ${INITIAL_CLUSTER} \
- --initial-cluster-state ${INITIAL_CLUSTER_STATE}
进入 node3, 创建并运行 run.sh
- #!/usr/bin/env bash
- # 节点名称
- ETCD_NAME=node-3
- # 本机 IP 地址
- LOCAL_IP=10.211.55.26
- #ETCD 存储目录
- ETCD_DATA_DIR=/usr/local/etcd/data
- # 初始化名称
- INITIAL_CLUSTER_TOKEN=cqh-test-cluster
- # 初始化群集列表
- INITIAL_CLUSTER="node-1=http://10.211.55.2:2380,node-2=http://10.211.55.25:2380,node-3=http://10.211.55.26:2380"
- # 初始化状态
- INITIAL_CLUSTER_STATE=new
- # 开始运行
- etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} \
- --initial-advertise-peer-urls http://${LOCAL_IP}:2380 \
- --listen-peer-urls http://${LOCAL_IP}:2380 \
- --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://${LOCAL_IP}:2379 \
- --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} \
- --initial-cluster ${INITIAL_CLUSTER} \
- --initial-cluster-state ${INITIAL_CLUSTER_STATE}
我们看到 3 台都启动成功了
然后我们在 node2 上面执行操作
- root@Ubuntu:~# etcdctl member list
- 2033c1336b929ca7: name=node-3 peerURLs=http://10.211.55.26:2380 clientURLs=http://10.211.55.26:2379 isLeader=true
- edc51d36208cfbcf: name=node-2 peerURLs=http://10.211.55.25:2380 clientURLs=http://10.211.55.25:2379 isLeader=false
- f09a9dba19a725e2: name=node-1 peerURLs=http://10.211.55.2:2380 clientURLs=http://10.211.55.2:2379 isLeader=false
可以看到集群已经生效了, 我们再来测试一下, 在 ndoe2 上执行操作
etcdctl set /cqh muscle
看看 node1 和 node3 是否能保持数据一致
可以看到在 node1 和 node3 中都能能够正确的获取 / cqh 的值
四. 监听功能 watch 演示
etcdctl watch key
观察一个值的变化, 观察到变化后, 打印值并 watch 退出
etcdctl watch key -f
永久观察值的变化, 观察到变化后, 打印直到 Ctrl+C 退出
etcdctl exec-watch key -- sh -c 'pwd'
监听到值有变化, 就执行指定的命令 (且不退出执行的可以是 shell 命令)
五. 使用 REST API
创建键值
- ~ curl http://10.211.55.25:2379/v2/keys/cqh -XPUT -d value="陈琼和 1"
- {
- "action":"set","node":{
- "key":"/cqh","value":"陈琼和","modifiedIndex":14,"createdIndex":14
- },"prevNode":{
- "key":"/cqh","value":"陈琼和","modifiedIndex":13,"createdIndex":13
- }
- }
创建目录
- ~ curl http://10.211.55.25:2379/v2/keys/gym -XPUT -d dir=true
- {
- "action":"set","node":{
- "key":"/gym","dir":true,"modifiedIndex":12,"createdIndex":12
- }
- }
获取键值
- ~ curl http://10.211.55.25:2379/v2/keys/cqh
- {
- "action":"get","node":{
- "key":"/cqh","value":"陈琼和","modifiedIndex":14,"createdIndex":14
- }
- }
创建键值带 ttl
~ curl http://10.211.55.25:2379/v2/keys/hero -XPUT -d value="超人" -d ttl=5
创建有序键值
- curl http://10.211.55.25:2379/v2/keys/fitness -XPOST -d value="bench_press"
- curl http://10.211.55.25:2379/v2/keys/fitness -XPOST -d value="dead_lift"
- curl http://10.211.55.25:2379/v2/keys/fitness -XPOST -d value="deep_squat"
获取刚创建的 fitness
- curl http://10.211.55.25:2379/v2/keys/fitness
- {
- "action":"create","node":{
- "key":"/fitness/00000000000000000020","value":"bench_press","modifiedIndex":20,"createdIndex":20
- }
- }
- {
- "action":"create","node":{
- "key":"/fitness/00000000000000000021","value":"dead_lift","modifiedIndex":21,"createdIndex":21
- }
- }
- {
- "action":"create","node":{
- "key":"/fitness/00000000000000000022","value":"deep_squat","modifiedIndex":22,"createdIndex":22
- }
- }
- {
- "action":"get","node":{
- "key":"/fitness","dir":true,"nodes":[{
- "key":"/fitness/00000000000000000022","value":"deep_squat","modifiedIndex":22,"createdIndex":22
- },{
- "key":"/fitness/00000000000000000020","value":"bench_press","modifiedIndex":20,"createdIndex":20
- },{
- "key":"/fitness/00000000000000000021","value":"dead_lift","modifiedIndex":21,"createdIndex":21
- }],"modifiedIndex":20,"createdIndex":20
- }
- }
删除键
curl http://10.211.55.25:2379/v2/keys/cqh -XDELETE
列出所有集群成员
curl http://10.211.55.25:2379/v2/members
统计信息 - 查看 leader
curl http://10.211.55.25:2379/v2/stats/leader
节点自身信息
curl http://10.211.55.26:2379/v2/stats/self
查看集群运行状态
curl http://10.211.55.26:2379/v2/stats/store
六. 搭建 Web 界面并使用
这里分别演示搭建 etcd-browser 和 etcdkeeper, 两者功能大同小异, 不同的是 etcdkeeper 支持 v3 的 API
1. 搭建 etcd-browser
- docker run --rm -d --name etcd-browser \
- -p 8000:8000 \
- --env ETCD_HOST=10.211.55.25 \
- --env ETCD_PORT=2379 \
- buddho/etcd-browser
运行后访问 http://10.211.55.25:8000/
看到如下界面, 可以看到上面添加的所有数据, 这里我使用界面添加了漫威和 DC 的英雄
2. 搭建 etcdkeeper
- docker run -it -d --name etcdkeeper \
- -p 8080:8080 \
- deltaprojects/etcdkeeper
访问 http://10.211.55.25:8080/etcdkeeper/, 输入 etcd 的地址, 看到如下界面
到这里, etcd 的单机版搭建, 集群版, 客户端使用, REST API Web 管理界面等功能都介绍了, 你还在等什么, 赶紧 high 起来
来源: https://www.cnblogs.com/chenqionghe/p/10503840.html