ETCD简介与使用

最近在工做中后端业务须要与etcd数据库进行数据交互,ETCD——高可用的分布式键值(key-value)数据库,由GO语言实现。
如下简单介绍下在此次业务实现中学习的ETCD的基本用法(入门小白级)python

下载安装

单机实例安装,即stardard alone形式的安装,这种方式安装后,etcd的client和etcd的server均在同一台机器,便于练习。git

etcdgithub仓库的releases页面下载对应的版本,Github下载地址github

目前最新版本为V3.3.2,V2版本与V3版本差别较大,如下均为V3版本上的操做
从github上下载后解压后,该目录下会有etcd、etcdctl两个可执行文件,cd至该目录下,查看对应版本数据库

etcd -version

若出现正确版本号,则能够正常使用,启动etcd服务器json

etcd

回车便可后端

基本用法

coreos公司在开发etcd时,预留了多种交互接口,数组

etcdctl

etcdctl属于ETCD的客户端,目前V3版本也兼容了V2版本的接口API,故而在使用etcdctl时,必须在命令开头指明所使用的API版本。(PS: 这部分就学了仨命令 QAQ)服务器

ETCDCTL_API=3 etcdctl put key1 "A"  //返回OK表示添加key1:'A'键值对成功
ETCDCTL_API=3 etcdctl get key1      //获取key1键的值
ETCDCTL_API=3 etcdctl del key1      //删除key1键值对

REST API

etcd支持rest风格的接口,可直接利用curl直接与etcd交互curl

curl http://127.0.0.1:2379/version //查看版本

 //V2版本
 curl http://127.0.0.1:2379/v2/keys/hello -XPUT -d value="world" // 建立键值对(hello:"world")
 curl http://127.0.0.1:2379/v2/keys/hello //查看hello键的值
 curl http://127.0.0.1:2379/v2/keys/hello -X DELETE //删除hello键值对

//V3版本,注意在V3版本中全部的key和value都必须转换为base64编码而后才能够存储
// foo is 'Zm9v' in Base64
// bar is 'YmFy' in Base64
curl -L http://127.0.0.1:2379/v3beta/kv/put \
    -X POST -d '{"key": "Zm9v", "value": "YmFy"}'
// 建立键值对 foo:bar

curl -L http://127.0.0.1:2379/v3beta/kv/range \
    -X POST -d '{"key": "Zm9v"}' 

// 查看键值对 foo

ETCD事务型操做

ETCD的事务性操做这里以V3的curl方式为例:分布式

// python2
// 已在etcd中建立了key1:0,A:"success",B:"failure"三个键值对
import json
import base64
import requests

URL = "http://127.0.0.1:2379/v3beta/kv/%s"

url = URL % "txn"

payload = {
    "compare":[
        {
            "target": "VALUE",
            "key":base64.b64encode("key1"),
            'result': "EQUAL",
            "value": base64.b64encode("0"),
        },
    ],
    "success":[
        {
            "requestRange":{
                "key":base64.b64encode("A"),
            }
        }
    ],
    "failure":[
        {
            "requestRange":{
                "key":base64.b64encode("B"),
            }
        }
    ]
}
resp = requests.post(url,json=payload)
print json.dumps(resp.json(), indent=2)

以上的逻辑:
在etcd中判断key1的值是否为0,若是为0则返回A的值,不然返回B的值
compare至关于 If,success至关于then,failure至关于else
即若是compare条件成立,执行success,不然执行failure

  1. compare

    compare中的条件结构以下:

    {
      "target": "VALUE",// (值为如下其中之一 "VALUE","CREATE", "MOD", "VERSION")
      "key":base64.b64encode("key1"), // 要比较的键值对的键
      "result": "EQUAL",  .//设置的判断条件,如下几种之一 (EQUAL,GREATER, NOT_EQUAL, LESS, )
      "value": base64.b64encode("0"), 
      // 这个的键与target对应, 值则为你想要比较的值
      /*
          'VERSION' => 'version',
          'CREATE'  => 'createRevision',
          'MOD'     => 'modRevision',
          'VALUE'   => 'value'
      */
    }

    上述的结构可理解为:判断 key(key1)的target(value)和value("0")是否 result(EQUAL)

    每一个条件都是一个相似的结构,多个条件之间同时成立,条件才为真,因此,实际上这也是为何compare是数组的缘由

  2. success,failure

    这两个结构,用法相似

    {
        requestRange:{
            "key": base64.b64encode("A"),
        }
    }

    这其中的requestRange,表明了range这个操做,即查看键值
    内部的值为参数

    有requestRange,requestPut,requestDel,三种操做,
    分类对应于查看,建立,删除

欢迎访问个人博客了解更多

相关文章
相关标签/搜索