Server | ETCD2 | ETCD3 |
---|---|---|
ETCD2 | 1.698331852s = 1698.331852ms | error |
ETCD3 | 20.87944695s = 20879.44695ms | 156.3686ms |
注:插入数据量为2000条。etcd3的TXN每次最多可批量操作128条,所以,在etcd3中会每128条进行一次txn处理,最后不足128的为一次。租约支持每个key一个租约,测试2000条数据时支持。
结论
在etcd.client2版本中,因为是每一个key都进行一次etcd的set操作,这个操作是加锁的,所以,在一边遍历一边set的情况下会耗时很多在锁上面。
在etcd.client3版本中,是把所有的conf分类后,每128个操作进行一次事务性执行,所以,性能增长很明显。
ETCD3 基本命令用法:
查看版本:
./etcdctl version
GET:
获取某个KV
./etcdctl get key
获取所有的KV
./etcdctl get --from-key ''
获取一定范围内的KV
./etcdctl get key1 keyn
PUT:
写入KV
./etcdctl put key value
DEL:
删除一个KV
./etcdctl del key
删除一定范围内的KV
./etcdctl del key1 keyn
WATCH:
watch某个Key:
./etcdctl watch key
watch一定范围内的Key
./etcdctl watch key1 keyn
watch以某字符串为首的所有Key
./etcdctl watch --prefix=true string
LEASE:
创建一定时间的租约,单位为s
./etcdctl lease grant n
为某个KV授予租约
./etcdctl put --lease=name key value
查看租约信息
./etcdctl lease timetolive name
保持租约
./etcdctl lease keep-alive name
撤销租约,租约撤销的同时,被授予租约的KV会被删除
./etcdctl lease revoke name
ETCD3 go-clientv3 使用示例
func main() {
cli, err := clientv3.New(clientv3.Config{
Endpoints: endpoints,
DialTimeout: dialTimeout,
})
if err != nil {
println(err)
}
defer cli.Close()
//PUT值
if _, err := cli.Put(context.TODO(), "foo", "bar"); err != nil{
fmt.Println(err.Error())
}
//GET值
if resp, err := cli.Get(context.TODO(), "foo"); err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("resp: ", resp)
}
//TXN
ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)
_, err = cli.Txn(ctx).
If(clientv3.Compare(clientv3.Value("key"), ">", "abc")).
Then(clientv3.OpPut("key", "XYZ")).
Else(clientv3.OpPut("key", "ABC")).
Commit()
cancel()
if err != nil {
fmt.Println(err)
}
//Watch
rch := cli.Watch(context.Background(), "", clientv3.WithPrefix())
for wresp := range rch {
for _, ev := range wresp.Events {
fmt.Printf("%s %q : %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
}
}
}