什么是ETCD

随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐为开发人员所关注。

在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,

更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。

etcd为解决这类问题带来了福音,它是一个高可用的 Key/Value 存储系统,内部采用raft协议作为一致性算法。

准备好了吗,干货要来了,are you ok ?

内容简介

  • 1.etcd的安装
  • 2.搭建单机版
  • 3.搭建集群版
  • 4.使用监听功能watch(服务发现)
  • 5.使用rest api
  • 6.搭建WEB界面并使用

一.安装

查看:下载地址

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

启动参数解释

--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"}

如果不想使用2379和2380端口,也可以

#etcd 启动 指定端口2280 2279
/usr/local/bin/etcd \
--data-dir=/etcd-data --name node1 \
--initial-advertise-peer-urls http://0.0.0.0:2280 --listen-peer-urls http://0.0.0.0:2280 \
--advertise-client-urls http://0.0.0.0:2279 --listen-client-urls http://0.0.0.0:2279 \
--initial-cluster node1=http://0.0.0.0:2280 #连接
etcdctl --endpoints=http://127.0.0.1:2279 set cqh chenqionghe
etcdctl --endpoints=http://127.0.0.1:2279 get cqh

当然,我们也可以通过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

六.可视化界面

这里分别演示搭建etcd-browser和etcdkeeper,两者功能大同小异,不同的是etcdkeeper支持v3的api

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的英雄

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起来

从零开始搭建etcd分布式存储系统+web管理界面的更多相关文章

  1. CentOS7下搭建LAMP+FreeRadius+Daloradius Web管理

    注意:本文所有命令均在root命令下执行. freeradius服务官网:http://freeradius.org/ daloradius Web管理页面官网:https://sourceforge ...

  2. ##7.Dashboard web管理界面-- openstack pike

    ##7.Dashboard web管理界面 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard ...

  3. GeoServer基础教程(二):GeoServer的Web管理界面快速入门

    转载:http://blog.163.com/daimiao_study/blog/static/248923117201542522742373/ GeoServer的控制和管理是基于网页形式,所有 ...

  4. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  5. Horizon Web管理界面

    一.horizon 介绍: Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , 管理员可以使用通过 ...

  6. openstack核心组件——horizon Web管理界面(10)

    一.horizon 介绍: 理解 horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 ...

  7. 云计算openstack核心组件——horizon Web管理界面(10)

    一.horizon 介绍: 理解 horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 ...

  8. OpenStack (horizon Web管理界面)

    horizon 简介 Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , 管理员可以使用通过 WE ...

  9. 云计算OpenStack核心组件---horizon Web管理界面(9)

    一.horizon介绍 Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , 管理员可以使用通过 W ...

随机推荐

  1. spot 状压dp

    题目大意:数轴上有n个泥点,共有m个木板,求最少用几个木板可以覆盖全部泥点,并求最优方案数(n,m<=15) 看范围,肯定是状压 f[i][j]表示前i个泥点都被覆盖,使用的木板集合为j 转移: ...

  2. BZOJ_3626_[LNOI2014]LCA_离线+树剖

    BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度, ...

  3. BZOJ_1455_罗马游戏_可并堆

    BZOJ_1455_罗马游戏_可并堆 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢 ...

  4. Solr相似性算法

    Solr相似性算法 介绍 Solr 4及之前的版本默认采用VSM(向量空间模型)进行相似度的计算(或打分).之后的版本,则采用Okapi BM25(一种二元独立模型的扩展),属于概率模型. 检索模型通 ...

  5. 我的mfc基础知识点

    最近由于作业的缘故,结交了mfc这个新朋友,虽然他对我还很是陌生,相信日久定能生情!现在记录一些学习的笔记,备忘. MFC提供了不同类型的设备描述表的类(绘图类):CDC.CPaintDC.CClie ...

  6. Spark学习之数据读取与保存总结(一)

    一.动机 我们已经学了很多在 Spark 中对已分发的数据执行的操作.到目前为止,所展示的示例都是从本地集合或者普通文件中进行数据读取和保存的.但有时候,数据量可能大到无法放在一台机器中,这时就需要探 ...

  7. Adobe Photoshop CC 2019 for Mac v20.0.4 中文版安装教程

    全新Adobe Photoshop CC 2019 mac特别版终于上线了,简称ps cc 2019,Adobe Photoshop CC 2019 for Mac v20.0.4 中文版安装教程分享 ...

  8. java游戏开发杂谈 - 线程

    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...

  9. .net double类型转string类型的坑

    之前项目当中的接入的高德逆地理编码功能偶尔会出现参数错误的bug,经过排查服务端异常log,发现请求的url中的location参数中的小数点变成了逗号. 代码如下 public async Task ...

  10. 结合JDK源码看设计模式——适配器模式

    定义: 将一个类的接口转换成客户期望的另外一个接口(重点理解适配的这两个字),使得接口不兼容的类可以一起工作适用场景: 已经存在的类,它的方法和需求不匹配的时候 在软件维护阶段考虑的设计模式 详解 首 ...