什么是ETCD
etcd是基于go语言实现的一个高可用的分布式键值(key-value)数据库,内部使用了raft协议作为一致性算法,保证所有节点数据的一致性。在网络分区期间,能够在单点故障的情况下不影响服务以及数据的丢失。etcd的结构是有一位领导者(leader),其他节点作为follower进行选举,在此过程follower会同步leader上的数据。所以,必须保证etcd节点数是奇数,如果不是奇数就会出现所有节点都收到同样的选举票数,导致leader无法正常工作。
ETCD的作用
etcd是一个受到zookeeper与docker而催生的项目,最常用的就是在k8s环境中使用,将所有的kubernetes的所有配置数据都存储在etcd中,用于服务的发现和集群管理。kubernetes API服务器将集群状态的持久化在etcd中,用etcd的watch api监控集群,并发布关键的配置修改。
以下是etcd的四个特性:
简单:基于 HTTP+JSON 的 API让用户的请求。
安全:可选 SSL 客户认证机制。
快速:每个实例每秒支持一千次写操作。
可信:使用 Raft 算法充分实现了分布式。
应用场景:
服务发现(Service Discovery)
消息发布于订阅
负载均衡
分布式通知与协调
分布式锁、分布式队列
集群监控与leader竞选
ETCD的优势
etcd的api分两种,分别是export ETCDCTL_API=2和ETCDCTL_API=3,两种不同之处在于数据组织形式的不同,ETCDCTL_API=2是把key和value都存储在内存中,而ETCDCTL_API=3是只把key存储在内存中,value是写到硬盘里,因为key相比value比较短小很多。ETCDCTL_API=3中key以B树的形势存储在内存中,value是以B+树的形势存在硬盘中,之所以要以B/B+树的结构存储在硬盘中,是为了减少数据从硬盘中读取的时间。相比较而言,从内存中读取的速度和从硬盘中读取的速度要少的多。而这种存储体系就能在很大程度上降低磁盘的访问率。
B/B+树模型是从AVL(二叉平衡树)而来的,对于AVL来说,每个节点只存储一个数据,而相对庞大的AVL树来说,访问数据的时间复杂度是log2 n,这里的n是课AVL树,存储的数据总数,假设有一个数据总量为1023的AVL, 访问某个数据最坏的情况下需要访问10个节点. 由于AVL树的节点之间不像数元素在内存中连续存储, 这10次节点访问操作
很有可能包含多次磁盘访问. 因此拖慢了访问速度. 而对于B/B+树来说, 设计者将每一个节点的大小设置为内存一个分页的大小(一般是4kb), 而内存的一个分页的大小又等同于磁盘一个数据块的大小.因此, B/B+树相对于AVL来说的优势在于,它在硬盘中读取数据时, 单位是4kb的数据块而不是单个数据. 这样, 它将数据块读取到内存中后再进一步查找,从而大大减少了磁盘I/O的次数. 关于B/B+树在数据库系统应用中更为详细的介绍网上有很多相关资料.不再赘述.至于B树和B+树的区别,B+树只在叶子节点中存储data, 在非叶子节点中只存储search_key, B树在非叶子节点中存储的就是真正的数据.
etcd中存储一个key-value:etcd是如何将数据存储到硬盘中. 首先,etcd中有个概念叫revision, 这个revision可以理解为是一个全局变量. 用户每次执行一个操作, 例如插入一个key-pair, 这个revision就会自增1, 可以理解为这个revision就是一个全局的ID,表示已经执行了多少次操作, 每一次操作都有唯一的revision来识别. 对于内存中的B树来说, 它在进行查找时所使用的search-key是etcd key, 节点中存储的就是revision信息.而硬盘中存储的B+树的search-key就是revision值, 其节点中存储的是etcd key和etcd value. 通过这样的组织结构, etcd做到了保存每一个key 的每一个历史记录.
至此,我们可以梳理一下etcd查找关键字,例如"spe",的过程, 首先etcd根据"spe"去内存中遍历B树, 找到这个key所对应的revision, 这里revision是一组数字,包含了"spe"的每一次修改. 从
这一组revision中找到最大的那一个,如果用户指定了某个revision的话, 那么就取出用户指定的那个. 然后拿着revision去硬盘中查找B+树, 依次将节点读入内存进行查找.直至到达叶子节点,并且最终找到想要的值.
ETCD的结构
HTTP Server: 用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。
Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
Raft:Raft强一致性算法的具体实现,是etcd的核心。
WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。
过程:一个用户的请求发送过来,会经由HTTP Server转发给Store进行具体的事务处理,如果涉及到节点的修改,则交给Raft模块进行状态的变更、日志的记录,然后再同步给别的etcd节点以确认数据提交。最后进行数据的提交,再次同步。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏