// 连接etcd
import (
"github.com/coreos/etcd/clientv3"
"github.com/coreos/etcd/mvcc/mvccpb"
)
config = clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
DialTimeout: 5 * time.Second,
} client, err = clientv3.New(config)
kv = clientv3.NewKV(client)
// put
putResp, err = kv.Put(context.TODO(), "/cron/jobs/job1", "bye", clientv3.WithPrevKV())
putResp.Header.Revision
putResp.PrevKv.Value
// get
getResp, err = kv.Get(context.TODO(), "/cron/jobs/job1", /*clientv3.WithCountOnly()*/)
getResp.Kvs
getResp.Count // get prefix
getResp, err = kv.Get(context.TODO(), "/cron/jobs/", clientv3.WithPrefix())
getResp.Kvs
// delete
delResp, err = kv.Delete(context.TODO(), "/cron/jobs/job1", clientv3.WithFromKey(), clientv3.WithLimit(2))
for _, kvpair = range delResp.PrevKvs {
fmt.Println("删除了:", string(kvpair.Key), string(kvpair.Value))
}
// lease: 关注key是否存在

lease = clientv3.NewLease(client)
leaseGrantResp, err = lease.Grant(context.TODO(), 10)
keepRespChan, err = lease.KeepAlive(context.TODO(), leaseGrantResp.id) //自动续约 putResp, err = kv.Put(context.TODO(), "/cron/lock/job1", "", clientv3.WithLease(leaseGrantResp.id))
putResp.Header.Revision
// watch:  关注key的变化

getResp, err = kv.Get(context.TODO(), "/cron/jobs/job7") //先get到当前值,监听后续变化
watchStartRevision = getResp.Header.Revision + 1
watcher = clientv3.NewWatcher(client) ctx, cancelFunc := context.WithCancel(context.TODO())
time.AfterFunc(5 * time.Second, func() {
cancelFunc()
}) watchRespChan = watcher.Watch(ctx, "/cron/jobs/job7", clientv3.WithRev(watchStartRevision)) for watchResp = range watchRespChan {
for _, event = range watchResp.Events {
switch event.Type {
case mvccpb.PUT:
fmt.Println("修改为:", string(event.Kv.Value), "Revision:", event.Kv.CreateRevision, event.Kv.ModRevision)
case mvccpb.DELETE:
fmt.Println("删除了", "Revision:", event.Kv.ModRevision)
}
}
}
// op操作(类似条件一样的)
putOp = clientv3.OpPut("/cron/jobs/job8", "123123123")
opResp, err = kv.Do(context.TODO(), putOp) // kv.Put
// kv.Get
// kv.Delete opResp.Put().Header.Revision getOp = clientv3.OpGet("/cron/jobs/job8")
opResp, err = kv.Do(context.TODO(), getOp)
opResp.Get().Kvs[0].ModRevision
opResp.Get().Kvs[0].Value
// 事务机制: 去锁资源, 判断lock目录key是否存在, 如果不存在则put进去, 标记抢锁成功, 如果存在则象征性get下, 标记强锁失败
lease = clientv3.NewLease(client) //创建租约, 自动续租, 拿着租约去抢占一个key
leaseGrantResp, err = lease.Grant(context.TODO(), 5)
defer lease.Revoke(context.TODO(), leaseGrantResp.id)
defer lease.Revoke(context.TODO(), leaseGrantResp.id)
keepRespChan, err = lease.KeepAlive(ctx, leaseId) //5秒后会取消自动续租 go func() {
for {
select {
case keepResp = <- keepRespChan:
if keepRespChan == nil {
fmt.Println("租约已经失效了")
goto END
} else { // 每秒会续租一次, 所以就会受到一次应答
fmt.Println("收到自动续租应答:", keepResp.ID)
}
}
}
END:
}() kv = clientv3.NewKV(client) // if 不存在key, then 设置它, else 抢锁失败
txn = kv.Txn(context.TODO()) // 创建事务 //if条件成立,走then,否则走else
txn.If(clientv3.Compare(clientv3.CreateRevision("/cron/lock/job9"), "=", 0)).
Then(clientv3.OpPut("/cron/lock/job9", "xxx", clientv3.WithLease(leaseId))).
Else(clientv3.OpGet("/cron/lock/job9")) // 否则抢锁失败
txn.Commit()
txnResp.Succeeded //抢锁成功

理解事务: 一个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)

所谓的支持事务锁: 里面的操作是原子的

      // 发起转账视图
txn := etcd.Txn(ctx.TODO()).If(
v3.Compare(v3.ModRevision(from), “=”, fromKV.ModRevision), // 事务提交时,from账户余额没有没有变动
v3.Compare(v3.ModRevision(to), “=”, toKV.ModRevision)) // 事务提交时,to账户余额没有变动
txn = txn.Then(
OpPut(from, fromUint64(fromV - amount)), // 更新from账户余额
OpPut(to, fromUint64(toV - amount)) // 更新to账户余额
putresp, err := txn.Commit() // 提交事务

[etcd]分布式锁

etcd election特性使用场景——Master选举分析与实现

[go]etcd使用的更多相关文章

  1. 一次基于etcd的分布式锁自动延时失败问题的排查

    今天在测试基于etcd的分布式锁过程中,在测试获取锁后,释放之前超出TTL时长的情况下自动延长TTL这部分功能,在延长指定key的TTL时总是返回404错误信息,在对目标KEY更新TTL时目标KEY已 ...

  2. etcd:用于服务发现的键值存储系统

    etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...

  3. Centos7下Etcd集群搭建

    一.简介 "A highly-available key value store for shared configuration and service discovery." ...

  4. 通过docker-machine和etcd部署docker swarm集群

    本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使 ...

  5. etcd第三集

    简单说下golang的etcd接口例子.etcd api有v2(http+json)和v3(grpc)两个版本,目前大家都用v2,所以... v2: https://github.com/coreos ...

  6. etcd第二集

    参考文章:https://github.com/coreos/etcd/blob/master/Documentation/v2/api.mdhttp://www.cnblogs.com/zhengr ...

  7. etcd第一集

    网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...

  8. etcd命令说明 etcd Version: 3.0.15

    etcd Version: 3.0.15Git SHA: fc00305Go Version: go1.6.3Go OS/Arch: linux/amd64 https://github.com/co ...

  9. etcd api 接口

    etcd api接口 基本操作api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Doc ...

  10. Key/Value存储系统etcd的特性

    etcd 是一个高可用的Key/Value存储系统,和其他KV存储系统不同的是,它的灵感来自于 ZooKeeper 和 Doozer,主要用于分享配置和服务发现.利用 etcd 的特性,应用程序可以在 ...

随机推荐

  1. 四、DML语言

    目录 简介 主要操作 插入语句 语法 修改语句 修改单表 删除语句 DELETE TRUNCATE 两种删除总结 简介 DML语言就是数据操作语言 主要操作 插入:insert 修改:update 删 ...

  2. 010.简单查询、分组统计查询、多表连接查询(sql实例)

    -------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SEL ...

  3. FirstWriting

    在很久很久以前,你拥有我我拥有你 <外面的世界> 在很久很久以前我就有搞一个类似博客的东西的想法,不过一直都没有尝试着搞-- 某天(10号左右吧)刷知乎看到github和hexo可以搭建博 ...

  4. ArcGIS水文分析实战教程(15)库容和淹没区计算

    库容和淹没区计算 的基本流程 要计算库容就必须先计算出该集水区面积,并且通过不同的水位计算出淹没区,并利用淹没区去裁剪DEM数据,将水面与下垫面的体积计算出来,这就是水库的库容.由于有了前面的基础,这 ...

  5. gitlab常用的命令

    git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态git stash  #把所有没有提交的修改暂存到stash里面.可用git stash pop回复.git reset ...

  6. HDU 5734 Acperience ( 数学公式推导、一元二次方程 )

    题目链接 题意 : 给出 n 维向量 W.要你构造一个 n 维向量 B = ( b1.b2.b3 ..... ) ( bi ∈ { +1, -1 } ) .然后求出对于一个常数 α > 0 使得 ...

  7. 2019 南昌ICPC网络赛H The Nth Item

    The Nth Iteam 题意:F(0)=1,F(1)=1,F(n)=3*F(n-1)+2*F(n-2) (n>=2) ,F(n) mod 998244353.给出Q跟N1,Ni=Ni-1^( ...

  8. Codevs 4909 寂寞的堆

    4909 寂寞的堆 时间限制: 1 s 空间限制: 8000 KB 题目等级 : 大师 Master 题目描述 Description 堆,是一种神奇的数据结构 不寂寞的堆,是一棵满二叉树,其儿子节点 ...

  9. 创建express项目(nodejs)

    1.下载nodejs安装包 nodejs官网下载最新版本就行,网址:http://nodejs.cn/download/,点击自己适用的系统,自动下载跟电脑操作系统位数符合的安装包, 2.配置环境 最 ...

  10. springMVC配置拦截器、过滤器、前端控制器时遇到的问题总结

    1.业务场景:使用vuejs+springMVC+spring框架搭建一个mis系统,集成SSO单点登录: 2.遇到问题:使用interceptor拦截器配置SSO单点登录,直接敲域名,或者ip+端口 ...