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,三種操做,
    分類對應於查看,建立,刪除

歡迎訪問個人博客瞭解更多

相關文章
相關標籤/搜索