etcd是键值对数据库, 存储K8s集群的所有重要信息(持久化). 在Kubernetes集群中起到的了持久化的作用.
## 1.etcd概念
etcd官方将其定位为一个**可信赖**的**分布式****键值存储**服务, 它能够为整个分布式集群存储一些关键数据, 协助分布式集群的正常运转.
> 可信赖的:官方已经提供了一个高可用方案,也就是说本省自带高可用>> 分布式:将数据分散到不同节点,以此来保证数据的强壮性>> 键值存储:就是简单的K-V对 。etcd所有的数据类型只有一种存储结构,就是k-v结构 。
## 2. Raft算法
- Raft是etcd采用的算法,叫做共识算法,或最终一致算法 。
> ?举个例子,什么是共识算法 。比如有一个村子,村子里有几百个村民,然后有一个人考上了***大学,可厉害 。旁边的邻居知道了,然后就开始一传十,十传百,最后整个村子的人都知道了 。这就是共识算法>> ?那最终一致是怎么回事呢?整个村子的人可能有的人先知道这个事,有的人晚点知道,但最终大家都知道 。过程不一定一致,但结果是一致的 。>> ?刚刚说了Raft的节点为什么是3,5,7,9个呢,因为要投票选举,如果数据在某个节点,比如我的数据值是2017,另外两个事2018,已投票我就输了,那就是以你俩的数据为准 , 你俩成为leader了,来管理我,你们来提供服务,我要听你们的话,你们把数据给我 。
- 每一个Raft集群中都包含多个服务器,在任意时刻,每一台服务器只能处于Leader、Follower以及Candidate三种状态;在处于正常的状态时,集群中只会存在一个Leader,其余都是Follower 。
- Leader:领导者- Follower:跟随者- Candidate:竞选者
注意:一个能被外部正常访问的集群只有Leader和Follower两种状态 。并且通常只有一个leader,其余都是follower
读写的信息, 所有的读写信息都被存在Raft里面, 而且, 为了防止这些信息出现损坏, 他还有一个WAL预写日志
## 2. Raft算法
- ## etcd的版本
<img src="http://img.zhejianglong.com/231019/202JAJ7-1.png" alt="img" style="zoom:30%;" />
etcd现在有两个版本, v2和v3版本,
- V2:v2版本将数据保存到内存, 这样很可能会不稳定,一宕机 , 数据全没了 。- V3: v3版本将数据保 存到磁盘. 然后进行缓存加速 。并且 , 如果使用了V3版本 , 官方建议采用SSD进行存储和读取- 如何选择版本呢?不用我们自己选择,k8s已经集成了etcd 。正常我们都选择使用v3版本, 但Kubernetes v1.11版本之前使用的是v2版本.
-
## 3、Raft内部结构
Raft内部结构如下图,主要包含几个方面:Http Server,Raft,Wal,Store 。下面来详细介绍
<img src="http://img.zhejianglong.com/231019/202J64404-2.png" alt="image" style="zoom:50%;" />
### 1> HTTP Server
这里采用的是使用http进行构建的c/s服务, k8s也是采用的http协议进行c/s服务的开发. 为什么要这么做呢? 因为http天生支持一系列的操作. 例如: get ,post, put, delete, 授权认证等. 所以, 没有必要再去采用标准的tcp协议. 开发一系列的认证流程, 所以, 直接采用http协议即可. http协议主要解决的是数据传输问题 。
### 2> Raft
共识算法,上面说过了,这里不再赘述
### 3>WAL 预写日志
什么叫预写日志呢?在写入修改底层数据之前,把所有的操作先保存在日志里 。
- Raft:共识算法,从一开始就被设计成一个易于理解和实现的共识算法 。每一个Raft集群中都包含多个服务器,在任意时刻 , 每一台服务器只能处于Leader、Follower以及Candidate三种状态;在处于正常的状态时,集群中只会存在一个Leader,其余都是Follower 。
共识算法,或者叫最终一致算法 。比如:有3台etcd机器在运行的过程中,突然停了 , 那么3台etcd中的配置可能是不一样的 , 但是,一旦运行起来,经过一段时间,最终会达到一致 。每一个Raft集群都包含多个服务器,在任意时刻,每一台服务器只可能处于Leader(主节点)、Follower(跟随者)、Candidater(竞选者)三种状态中的一种 。在处于正常状态(可访问)时,集群中只会存在一个Leader,其余的服务器都是Follower 。
- WAL: 预写日志, 吸入到数据库之前,先保存到日志里 。如果要对数据进行更改, 那么先写入一条日志, 然后定时的对日志进行完整的备份. 也就是完整+临时. 比如: 我先备份一个大版本, 备份以后, 还会有1个子版本, 两个子版本....., 然后将这些版本再次进行一个完整备份,把它变成一个大版本. 这样做的好处, 我们不能始终进行完整备份, 因为消耗的数据量太大. 为什么还要在一定时间内进行完整的备份呢?防止增量备份太多, 还原的时候太费事. 并且, Raft还会实时的把这些数据和日志存入到本地磁盘进行持久化.
推荐阅读
- .net 温故知新:【9】.NET日志记录 ILogger使用和原理
- 安卓手机截屏模式怎么设置(手机截屏模式怎么设置)
- ubantu18.04@Intel 82545EM 【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机
- 星之彼端丹铜事件该如何选择
- iphone怎么刷机(iphone刷机教程)
- 《正义联盟》中超人是怎么死的
- 王者荣耀娜可露露前尘镜中文语音包怎么设置
- 《三国演义》中曹操的大将许褚是怎么死的(三国许褚做了哪些大事)
- 怎么玩比较合适(休假去哪玩比较合适)
- 红米Note11真机曝光_红米Note11外观详情