ETCD支持可靠的键值对存储并且提供了可靠的Watcher机制,其中的键值对存储支持多版本,并且具备能够Watch历史事件的功能。这里简单介绍多版本存储的含义,假设键K1对应的值为V1,当我们将K1对应的值修改成V2时,etcd并不会直接将V1修改成V2,而是同时记录V1和V2两个值,并通过不同的版本号进行区分。另外,Watch历史事件的含义是,可以向一个Key添加Watcher,同时可以指定一个历史版本,从该版本开始的所有事件都会触发该Watcher。随着key的版本增多,数据量会越来越大,为了缓解压力,etcd会定期进行压缩,清理过旧的数据。
ETCD在存储中维护一个字段序的B树索引,在B树索引的每个索引项中,都存储了一个Key值,这样可以快速定位指定的Key或是进行范围查询。而每个Key值对应了多个版本号,etcd中维护了一个全局自增的版本号,为每次事务分配一个全局唯一的版本号(main revision),事务中的每个操作也有唯一的编号(sub revision),通过这两部分可以确定一个唯一的Value值。
每个Key会对应多个generation,当Key首次创建时,会同时创建一个与之关联的generation实例,当该Key被修改时,会将对应的版本记录到generation中,当Key被删除时,会向generation中添加tombston,并创建新的generation,会向新generation中写入后续的版本信息。
在查询时,先在内存索引中通过用户指定的key值,查找到该Key值对应的全部版本号,然后根据用户指定的版本号,从底层存储中查找到具体的Value值。当然,如果指定的版本号,已经被etcd压缩删除,则无法再查询到该版本的Value值。
在etcd v3版本中,底层存储使用的是BoltDB,其中的Key 是版本信息(main revision+sub revusision)。这样,在查询时先通过上述B树索引查找到对应的版本信息,然后在BoltDB中通过版本信息查找相应的value值。
– 在内存索引中通过用户指定的key值 --> 查找到该Key值对应的全部版本号 --> 根据用户指定的版本号(main revision+sub revusision) --> BoltDB中通过版本信息查找相应的value值 –
etcd集群节点名称name | 用于集群内各个节点之间通信的URL地址listen-peer-urls | 用于集群内部节点之间交互的URL地址initial-advertise-peer-urls | 用于当前节点与客户端交互的URL地址listen-client-urls | 建议客户端使用的URL地址advertise-client-urls | 集群的唯一标识initial-cluster-token etcd-cluster-1 | 集群中所有的initail-advertise-peer-urls的合集initail-cluster | 新建集群的表示initial-cluster-state new |
infra0 | http://127.0.0.1:2380 | http://127.0.0.1:2380 | http://127.0.0.1:2379 | http://127.0.0.1:2379 | etcd-cluster-1 | infra0=http://127.0.0.1:2380 infra1=http://127.0.0.1:2382 infra2=http://127.0.0.1:2384 | new |
infra1 | http://127.0.0.1:2382 | http://127.0.0.1:2382 | http://127.0.0.1:2381 | http://127.0.0.1:2381 | etcd-cluster-1 | infra0=http://127.0.0.1:2380 infra1=http://127.0.0.1:2382 infra2=http://127.0.0.1:2384 | new |
infra2 | http://127.0.0.1:2384 | http://127.0.0.1:2384 | http://127.0.0.1:2383 | http://127.0.0.1:2383 | etcd-cluster-1 | infra0=http://127.0.0.1:2380 infra1=http://127.0.0.1:2382 infra2=http://127.0.0.1:2384 | new |