consul 的键值存储


# 为提供服务发现和健康检测,Consul提供了易于使用的键值存储
# 可被用于存储动态配置信息、帮助服务协作、建构Leader选举机制、及开发者可以想到的建构任何其它的东西 ...

注册键值信息


# 先验证KV存储内是否有键,若无则返回404(递归recurse)
[root@node1 ~]# curl -s http://localhost:8500/v1/kv/?recurse

# 先用PUT方法存储一些键值
[root@node1 ~]# curl -X PUT -d 'test1'  http://localhost:8500/v1/kv/key1
[root@node1 ~]# curl -X PUT -d 'test2'  http://localhost:8500/v1/kv/key2
[root@node1 ~]# curl -X PUT -d 'test3' http://localhost:8500/v1/kv/web/key1?flags=42
# flags是键的标记(为64位整型数字,可被客户端用来做元数据)此处对键"web/key1"为其设置了"42"的自定义标记....

# 也可使用命令行方式注册
[root@node1 ~]# echo "5" | consul kv put redis/config/password -
[root@node1 ~]# consul kv put redis/config/password  @password.txt
[root@node1 ~]# consul kv put redis/config/connections  5
# Success! Data written to: redis/config/connections

# 获取数据
[root@node1 ~]# consul kv get [-detailed|-recurse] redis/config/connections
5

# 获取详情
[root@node1 ~]# consul kv get -detailed redis/config/connections
# CreateIndex  336
# Flags        0
# Key          redis/config/connections
# LockIndex    0
# ModifyIndex  336
# Session      -
# Value        5

# 删除数据
[root@node1 ~]# consul kv delete [-recurse|not-a-real-key] redis/config/connections 
# Success! Data deleted at key: redis/config/connections

# 导出tree结构
[root@node1 ~]# consul kv export vault/
# JSON output

查询键值信息


# 查询所有键值信息 (使用 recurse 参数发出递归请求)
[root@node2 ~]# curl -s http://node1:8500/v1/kv/?recurse | python -m json.tool
[
    {
        "CreateIndex": 1721,
        "Flags": 0,
        "Key": "key1",              # 键
        "LockIndex": 0,
        "ModifyIndex": 1721,
        "Value": "dGVzdDE="         # 值(值的返回是base64的编码,其允许非UTF8字符集)
    },
    {
        "CreateIndex": 1723,
        "Flags": 0,
        "Key": "key2",              # 键
        "LockIndex": 0,
        "ModifyIndex": 1723,
        "Value": "dGVzdDI="         # 值
    },
    {
        "CreateIndex": 1729,
        "Flags": 42,                # flag信息...(此标记不由Consul使用,它可被用于存储任意键值对的元数据信息)
        "Key": "web/key1",          # 键
        "LockIndex": 0,
        "ModifyIndex": 1729,
        "Value": "dGVzdDM="         # 值
    }
]

# 查询指定键值信息...
[root@node2 ~]# curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool 
[
    {
        "CreateIndex": 1729,
        "Flags": 42,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 1729,
        "Value": "dGVzdDM="
    }
]

# ---------------------------------------------

# 也可使用consul的命令行方式查询
[root@node1 ~]# consul kv get web/key1
# newval

# 查询所有键值对信息
[root@node1 ~]# consul kv get -recurse
# key1:test1
# key2:test2
# my_key:666
# web/key1:newval

删除键值信息


[root@node2 ~]# curl -X DELETE http://localhost:8500/v1/kv/web/key1?recurse     # 使用DELETE方法即可
[root@node2 ~]# cus http://localhost:8500/v1/kv/web/key1 | python -m json.tool  # 再次查询即不存在
# No JSON object could be decoded

修改键值信息


# 使用PUT请求相同的URI并提供不同的消息体即可修改指定键,Consul提供了检测并设置的操作且操作是原子的......
# 通过在GET中提供 ?cas= 参数并及指定最新的 ModifyIndex 值就可以得到原子操作

# 假设想要更新"web/key1"
[root@node2 ~]# curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool
[
    {
        "CreateIndex": 1841,
        "Flags": 0,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 1841,    # ModifyIndex的值为1841
        "Value": "bmV3dmFs"
    }
]
[root@node2 ~]# curl -X PUT -d 'newval' http://localhost:8500/v1/kv/web/key1?cas=1841
true
[root@node2 ~]# curl -X PUT -d 'newval' http://localhost:8500/v1/kv/web/key1?cas=1841
false
#这里,第1个CAS更新成功是因为最新的 ModifyIndex 是1841,而第二个操作失败因为最新的 ModifyIndex 不再是此值

#--------------------------------------------------------------------------------------------------------
#通过提供"?index=",即可请求等待直到键包含一个大于20000的 ModifyIndex 的值
#并且由于"?wait=",限制了查询最多等待5秒则超时后会返回当前没有修改的值
#该操作可高效地等待键的更新。另外相同的方法可用于等待一个键的集合,直到键集合中任何一个键发生更新...
[root@node2 ~]# curl -s "http://localhost:8500/v1/kv/web/key1?index=20000&wait=3s" | python -m json.tool  
[
    {
        "CreateIndex": 1841,
        "Flags": 0,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 1858,
        "Value": "bmV3dmFs"
    }
]

上一篇:k8s部署consul集群


下一篇:服务发现 - consul 的介绍、部署和使用