etcd v2 v3 同时存在的问题

最近使用 etcd 时候遇到了一个问题,发现用 go 代码调用 clientv3 写进去的 key 和用 etcdctlkey 是不一样的,而且两边可以同时读写相同的 key, 但是值却是不相同的。

因为这个问题查了将近两个小时,最后发现,原来 etcd 默认情况下是 v2v3 的客户端 API 共存的,而两个版本的 API 产生和查询的数据是隔离的。

etcd 的过程中看了不少的文章,结果恰恰我看的文章里都没有提到这一点,结果当了冤大头,浪费了这么多时间。

其实现在应该大部分人都是用 v3 版本的 APIetcdctl 默认却是 v2API。不知道是出于什么考虑没有把 v3 版本 API 作为 etcdctl 的默认 API 版本。

至于我会问到这个问题,也是因为我在开发的过程中想要用 etcdctl 来验证我的代码写进去的数据是否正确,如果我没有用 etcdctl 来读 go 客户端写进去的数据的话,也就不会有这个问题了。如果想要让 etcdctl 默认用 v3 版的 API,可用在使用 etcdctl 之前,设置版本环境变量:

1
2
export ETCDCTL_API=3
etcdctl ...

如果不想每次使用 etcdctl 是都设置,可以在 .bashrc 或者 .bash_profile 加入该语句:

1
export ETCDCTL_API=3