设为首页 收藏本站
查看: 1373|回复: 0

[经验分享] etcd的学习心得和使用

[复制链接]

尚未签到

发表于 2019-1-31 11:51:18 | 显示全部楼层 |阅读模式
  1 etcd key-value 存储结构
   “A highly-available key value store for shared configuration and service discovery.”
  Etcd是coreos开发的分布式服务系统,内部采用raft协议作为一致性算法
  raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader
  Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。
● 简单:支持 curl 方式的用户 API (HTTP+JSON)
  

  

  Etcd构建自身高可用集群主要有三种形式:
    1)静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好Etcd的各个node节点地址
    2)Etcd动态发现: 通过已有的Etcd集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
    3)DNS动态发现: 通过DNS查询方式获取其他节点地址信息


  

  

  2 下载地址
  https://github.com/coreos/etcd/releases/
  

  

  

  ###################  演示etcd单机的使用
  3. 安装(解压即可使用)
  cd /usr/local/src/

  wget https://github.com/coreos/etcd/releases/download/v3.2.5/etcd-v3.2.5-linux-amd64.tar.gz
  tar xvf etcd-v3.2.5-linux-amd64.tar.gz
  cp -r etcd-v3.2.5-linux-amd64 /usr/local/etcd  #将软件放置到常用目录下
  

  

  4.创建配置文件和数据目录
  cd /usr/local/etcd/
  

  touch etcd.conf
  mkdir data
  

  ## 将启动文件和命令管理文件拷贝到 PATH找到的路径中
  cp etcd /usr/local/bin
  cp etcdctl /usr/local/bin
  

  5. 编辑配置文件
name: ops-cuidehua001
data-dir: "/usr/local/etcd/data"
#监听URL,用于与其他节点通讯
listen-peer-urls: "http://10.59.87.121:2380"
# list of URLs to listen on for client traffic
listen-client-urls: "http://10.59.87.121:2379,http://127.0.0.1:2379"
#list of this member's client URLs to advertise to the public
advertise-client-urls: "http://10.59.87.121:2379"  

  listen-peer-urls、listen-client-urls、advertise-client-urls的区别?
  

  6、启动
  etcd --config-file=/usr/local/etcd/etcd.conf &
  

  7、检查是否启动
  ps -ef |grep etcd
  或者
  [root@ops-cuidehua001 etcd]# etcdctl cluster-health
  member 8e9e05c52164694d is healthy: got healthy result from http://10.59.87.121:2379
  cluster is healthy
  

  生成的了数据目录
  [root@ops-cuidehua001 etcd]# ls data/member/
  snap  wal
  

  8、常用命令操作
  #查看版本
  etcdctl -version 或者  etcd -version
  

  [root@ops-cuidehua001 etcd]# etcdctl -v
  etcdctl version: 3.2.5
  API version: 2
  (可以查看到命令的版本和api接口的版本)
  

  #查看检查状况
  etcdctl cluster-health
  

  ##etcd主要是做存储k-v的作用,所以经常对其数据进行操作(即etcd的操作 增删改查)
数据库操作围绕对键值和目录的 CRUD (符合 REST 风格的一套操作:Create)完整生命周期的管理。
etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如 testkey,此时实际上放在根目录 / 下面,也可以为指定目录结构,如 cluster1/node2/testkey,则将创建相应的目录结构。
注:CRUD 即 Create, Read, Update, Delete,是符合 REST 风格的一套 API 操作。
  

  #################### ##数据库操作 #################
  ##set 指定某个键的值
  etcdctl set /testdir/testkey "Hello world"
  

  会创建目录/testdir 和设定这个目录下的testkey的value值为"Hello world"
  

  ##查看目录结构,默认是查看根目录下
  [root@ops-cuidehua001 etcd]# etcdctl ls
  /testdir
  [root@ops-cuidehua001 etcd]# etcdctl ls /testdir
  /testdir/testkey
  

  ##get 获取某个key的value
  [root@ops-cuidehua001 etcd]#  etcdctl get /testdir/testkey
  Hello world
  #不支持则会报错,且key不支持通配符
  [root@ops-cuidehua001 etcd]#  etcdctl get /testdir/testkey2
  Error:  100: Key not found (/testdir/testkey2) [5]
  

  ##update更新建的值,key不存在时会报错
  etcdctl update /testdir/testkey "hello"
  

  ##rm删除某个键
  etcdctl rm /testdir/testkey
  [root@ops-cuidehua001 etcd]# etcdctl rm /testdir/testkey
  PrevNode.Value: hello
  [root@ops-cuidehua001 etcd]# etcdctl get /testdir/testkey
  Error:  100: Key not found (/testdir/testkey) [7]
  

  当删除某个目录时
  etcdctl rm -h 查看命令帮助
  etcdctl rm -r
  [root@ops-cuidehua001 etcd]# etcdctl rm -r /testdir
  

  ## 创建目录mkdir setdir
  etcdctl setdir /testdir
  

  (mkdir 如果目录存在则会报错 setdir 也会报错,但是不一样? 待研究两者不同)
  [root@ops-cuidehua001 etcd]# etcdctl setdir /testdir
  Error:  102: Not a file (/testdir) [11]
  

  ###################### 非数据库操作 #################
  # 备份etcd数据目录
  [root@ops-cuidehua001 etcd]# du -sh data/
  123Mdata/
  [root@ops-cuidehua001 etcd]# etcdctl backup --data-dir=/usr/local/etcd/data/ --backup-dir=/tmp/data
  [root@ops-cuidehua001 etcd]# du -sh /tmp/data/
  62M/tmp/data/
  

  (临时目录文件不会备份)
  

  #watch 观察一个值的变化(只是针对key 不针对目录)
  观察到变化后,打印值并watch退出
  可以用选项: -f
  forever watch a key until CTRL+C
  

  #exce-wathc 监听到值有变化,就执行指定的命令(且不退出执行的可以是shell命令)
  etcdctl exec-watch /testdir/testkey -- sh -c 'pwd'
  

  #member 集群用途将其他成员添加到cluster中或者从cluster中删除
  

  [root@ops-cuidehua001 etcd]# etcdctl  member list
  8e9e05c52164694d: name=ops-cuidehua001 peerURLs=http://localhost:2380 clientURLs=http://10.59.87.121:2379 isLeader=true
  

  (因为是单点操作所以就一个节点)
  

  

  

  

  

  #################### API 接口 ####
  可以通过浏览器访问,或者通过curl命令增删改查
  基本接口:
  http://10.59.87.121:2379/v2/keys/
  [root@ops-cuidehua001 etcd]#  curl -s http://10.59.87.121:2379/v2/keys/ | jq "."
{
  "node": {
    "nodes": [
      {
        "createdIndex": 4,
        "modifiedIndex": 4,
        "dir": true,
        "key": "/testdir"
      }
    ],
    "dir": true
  },
  "action": "get"
}  可获取目录下的所有key-value和
  [root@ops-cuizhiliang001 etcd]#  curl -s http://10.59.87.121:2379/v2/keys/testdir | jq "."
{
  "node": {
    "createdIndex": 4,
    "modifiedIndex": 4,
    "nodes": [
      {
        "createdIndex": 4,
        "modifiedIndex": 12,
        "value": "yes3",
        "key": "/testdir/testkey"
      },
      {
        "createdIndex": 10,
        "modifiedIndex": 10,
        "value": "yes3",
        "key": "/testdir/testkey2"
      }
    ],
    "dir": true,
    "key": "/testdir"
  },
  "action": "get"
}  

  

  ## 删除指定的key,返回被删掉的内容(目录是不能删除的)
  curl -s http://10.59.87.121:2379/v2/keys/testdir/testkey2 -XDELETE |jq "."
  

  ## set指定的值
  curl -s http://10.59.87.121:2379/v2/keys/testdir/testkey3 -XPUT -d value="hello world" |jq "."
  

  

  

  

  

  

  

  ################### 配置集群  ###############
  http://www.linuxidc.com/Linux/2017-01/139665.htm
  

  可以在初始知道的时候就加入,还可在后面在加入
  目前支持三种发现方式:Static,etcd Discovery,DNS Discovery。
● Static适用于有固定IP的主机节点
● etcd Discovery适用于DHCP环境
● DNS Discovery依赖DNS SRV记录
这里我们采用Static方式,创建etcd0脚本,方便配置etcd启动参数
  

  

  方法1: (参考)
  可以在知道有哪些作为集群的时候,使用
  ● –initial-cluster-token 集群的ID
● –initial-cluster 集群中所有节点
● –initial-cluster-state 集群状态,new为新创建集群,existing为已存在的集群
  

(以下 只是作为知识说明,在此文章中并未使用到)


  #初始化名称
  INITIAL_CLUSTER_TOKEN=etcd_cluster_1
  #初始化群集列表
  INITIAL_CLUSTER="node1=http://10.59.72.221:2380,node2=http://10.59.72.191:2380,node3=http://10.59.72.192:2380"
  #初始化状态
  INITIAL_CLUSTER_STATE=new


方法2:(这里举例使用了这种方法 演示)
后面add的节点(比如从一台机器的集群  变成多台的集群)


和第一个节点一样搭建了如下第二个节点。
这里要将 这个第二个节点加入到 上面的第一个节点中去。

  [root@ops-rpmbuild001 etcd]# etcdctl member list
  8e9e05c52164694d: name=etcd-node-002 peerURLs=http://localhost:2380 clientURLs=http://10.59.87.11:2379 isLeader=true





(记住 一定要在配置中补充)  补充脚本

#!/bin/bash
#
#初始化Etcd
#
#ETCD 名称
ETCD_NAME=ops-cuidehua001
#ETCD存储目录
ETCD_DATA_DIR=/usr/local/etcd/data
#本机IP地址
LOCAL_IP=10.59.87.121
#初始化名称
INITIAL_CLUSTER_TOKEN=etcd_cluster_cuidehua
#初始化群集列表
INITIAL_CLUSTER="ops-cuizhiliang001=http://10.59.87.121:2380,etcd-node-002=http://10.59.87.11:2380"
#初始化状态
INITIAL_CLUSTER_STATE=new
#初始化
M1(){
    #
    [ -d ${ETCD_DATA_DIR} ] &&  /bin/rm -rf ${ETCD_DATA_DIR} >/dev/null 2>&1
    #
    /bin/mkdir ${ETCD_DATA_DIR} >/dev/null 2>&1
    /usr/local/etcd/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}
}
M2(){
    /usr/local/etcd/etcd --config-file /usr/local/etcd/etcd.conf
}
M${1}

每台机器上执行
sh init.sh 1
sh init.sh 2 &>/dev/null &


查看:
  # etcdctl member list
  bfb265066811202: name=ops-cuidehua001 peerURLs=http://10.59.87.121:2380 clientURLs=http://10.59.87.121:2379 isLeader=false
  4ee240ac8ec54efb: name=etcd-node-002 peerURLs=http://10.59.87.11:2380 clientURLs=http://10.59.87.11:2379 isLeader=true
  

  

  

  

  ## 集群成员操作(不管否是leader 都可以执行这个操作,执行完后,对方就从集群中踢出去了,在从新选举Leader)
etcdctl member remove bfb265066811202




增加成员时候,INITTAL_CLUSTER_STATE 一定要标记为

#初始化状态
INITIAL_CLUSTER_STATE=existing
























运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670015-1-1.html 上篇帖子: etcd + TLS 集群部署 下篇帖子: 配置Etcd集群和TLS认证
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表