阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

从零开始搭建etcd分布式存储系统+Web管理界面

186次阅读
没有评论

共计 7596 个字符,预计需要花费 19 分钟才能阅读完成。

什么是 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 台都启动成功了
从零开始搭建 etcd 分布式存储系统 +Web 管理界面

然后我们在 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 是否能保持数据一致

从零开始搭建 etcd 分布式存储系统 +Web 管理界面

可以看到在 node1 和 node3 中都能能够正确的获取 /cqh 的值

四. 监听功能 watch 演示

  • etcdctl watch key
    观察一个值的变化,观察到变化后,打印值并 watch 退出
    从零开始搭建 etcd 分布式存储系统 +Web 管理界面

  • etcdctl watch key -f
    永久观察值的变化,观察到变化后,打印直到 Ctrl+ C 退出
    从零开始搭建 etcd 分布式存储系统 +Web 管理界面
  • etcdctl exec-watch key — sh -c ‘pwd’
    监听到值有变化,就执行指定的命令(且不退出执行的可以是 shell 命令)
    从零开始搭建 etcd 分布式存储系统 +Web 管理界面

五. 使用 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 的英雄
从零开始搭建 etcd 分布式存储系统 +Web 管理界面

2. 搭建 etcdkeeper

docker run -it -d --name etcdkeeper \
-p 8080:8080 \
deltaprojects/etcdkeeper

访问 http://10.211.55.25:8080/etcdkeeper/,输入 etcd 的地址, 看到如下界面
从零开始搭建 etcd 分布式存储系统 +Web 管理界面

到这里,etcd 的单机版搭建、集群版、客户端使用、rest api web 管理界面等功能都介绍了,你还在等什么,赶紧 high 起来

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计7596字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中