码迷,mamicode.com
首页 > 其他好文 > 详细

etcd的学习心得和使用

时间:2017-08-19 23:30:56      阅读:472      评论:0      收藏:0      [点我收藏+]

标签:etcd 单机 cluster 学习操作

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












本文出自 “残剑” 博客,请务必保留此出处http://cuidehua.blog.51cto.com/5449828/1957659

etcd的学习心得和使用

标签:etcd 单机 cluster 学习操作

原文地址:http://cuidehua.blog.51cto.com/5449828/1957659

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!