zoukankan      html  css  js  c++  java
  • 从零开始搭建etcd分布式存储系统+web管理界面

    什么是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起来

  • 相关阅读:
    Asp.net Mvc 中的模型绑定
    ActionResult 之HttpGet HttpPost
    Asp.net MVC 之 ActionResult
    Amazon MWS 上传数据 (三) 提交请求
    Amazon MWS 上传数据 (二) 构造请求
    Amazon MWS 上传数据 (一) 设置服务
    linq常用
    Nacos入门
    Post 方法参数写在body中和写在url中有什么区别
    强密码(必须包含字母、数字、特殊字符,长度8到16位)
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/10503840.html
Copyright © 2011-2022 走看看