etcd

  • etcd v2版本和v3版本的区别:

    • v2版本会把所有数据写入内存中,并且在kubernetes v1.11版本中弃用

    • v3版本会把所有数据持久化到磁盘中。

  • 高可用、分布式键值对类型数据库,go写的,主要用来共享配置,存储各种资源信息和服务发现

  • etcd可以集中管理配置信息,服务端存储客户端从etcd获取,同时etcd或监听配置信息的改变,发现改变通知给客户端

  • etcd集群个数不超过7个,一般3个或5个。

特点
  • 通过raft一致性算法保证多节点数据的强一致性和高可用

    • 强一致性:过半节点同步成功才返回成功

    • 高可用:leader选举机制

  • 通过WAL预写日志记录修改操作遇到故障能快速恢复之前状态

    • WAL系统中所有的修改在提交前需要先写入log文件中

    • 预写日志到了一定条目数量会自动触发快照到磁盘。

  • 通过snapshot防止WAL触发快照的次数过多

原理
  • 一个用户请求过来会先由http server接收转发给store进行具体的事务处理,如果涉及到节点的修改,则会交给raft模块进行状态的变更日志的记录,然后同步给etcd集群中的其他节点,确认数据提交和同步

image-20210521104131552

  • HTTP Server:用来处理用户的API请求以及其他etcd节点的同步和心跳信息的请求

  • Store: 处理etcd支持的各类功能的事物,包括数据索引、节点状态变更、监控和反馈、事件处理和直行等待等等功能都是etcd的API为用户提供

  • Raft:强一致性算法

  • WAL:Write Ahead Log预写日志是etcd数据存储的方式 ,除了在内存里存储了所有数据的状态和节点索引意外,

    etcd通过WAL对数据进行持久化存储,WAL中所有的数据提交前都会事先记录日志

  • Snapshot:为了防止数据过多而进行的状态快照

  • Entry:存储了具体的日志内容

优点
  • 简单:基于http+json的API使用curl就能直接使用

  • 安全:可选SSL客户认证机制

  • 快速:每个实例每秒支持千次的写操作

  • 可信:使用raft算法实现分布式

概念词
  • Raft:etcd所采用的保证分布式系统强一致性的算法。

  • Node:一个Raft状态机实例。

  • Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。

  • Cluster:由多个Member构成可以协同工作的etcd集群。

  • Peer:对同一个etcd集群中另外一个Member的称呼。

  • Client: 向etcd集群发送HTTP请求的客户端。

  • WAL:预写式日志,etcd用于持久化存储的日志格式。

  • snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态

  • Proxy:etcd的一种模式,为etcd集群提供反向代理服务。

  • Leader:Raft算法中通过竞选而产生的处理所有数据提交的节点。

  • Follower:竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。

  • Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。

  • Term:某个节点成为Leader到下一次竞选时间,称为一个Term。

  • Index:数据项编号。Raft中通过Term和Index来定位数据

应用场景
  • 消息发布订阅

  • 负载均衡

  • 分布式通知和协调

  • 分布式锁和分布式队列

  • 服务发现 service discovery

  • 集群监控和leader竞选

raft算法
  • 选举阶段

    • etcd集群中会有一个作为主节点leader负责写操作,多个从节点follower负责读操作

    • 主节点通过发送心跳包给从节点,从节点进行响应

    • 从节点一定时间没有收到心跳包,就会认为主节点不可用,自身成为候选主节点candidate,发起投票

    • 投票过程中的所有节点,只会响应收到的第一个投票请求,后续请求不做响应

    • 某个节点如果得到一半节点的响应投票,就会成为新的主节点

  • 数据更新

    • 主节点将修改信息记录到本地日志,并把日志复制给所有接地那,超过一半节点响应,就会认为操作成功,并通知客户端。

    • 同步成功后,主节点开始将本地日志持久化到磁盘,并通知所有从节点也进行数据修改和提交。

  • 当etcd遇到故障时会把Raft日志持久化到磁盘,并把日志发送到故障节点来恢复。

备份
  • etcd通过snapshot命令备份

    • 需要先做快照

       #这个是从活动成员来做快照
       $ export ETCDCTL_API=3;./etcdctl  --endpoints='10.201.46.112:2379,10.201.46.113:2379,10.201.46.114:2379' snapshot save ~/.snapshot.db
       
       
       #cron写法
       #!/bin/bash
       ENDPOINTS='10.201.46.112:2379,10.201.46.113:2379,10.201.46.114:2379'
       BACKUP_DIR='~/.snapshot.db'
       DATE=`date +%Y%m%d-%H%M%S`
       [ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR
       export ETCDCTL_API=3;etcdctl --endpoints=$ENDPOINTS snapshot save $BACKUP_DIR/snapshot-$DATE\.db
       cd $BACKUP_DIR;ls -lt $BACKUP_DIR|awk '{if(NR>11){print "rm -rf "$9}}'|sh
    • 恢复数据会覆盖一些元数据(成员ID和集群ID),并且需要创建新的etcd数据目录

    • 下边是三成员集群创建新的etcd数据目录,在三台节点执行

       $ etcdctl snapshot restore snapshot.db \
         --name ETCD-CLUSTER-001 \
         --initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \
         --initial-advertise-peer-urls http://10.201.46.112:2380
       $ etcdctl snapshot restore snapshot.db \
         --name ETCD-CLUSTER-002 \
         --initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \
         --initial-advertise-peer-urls http://10.201.46.113:2380
       $ etcdctl snapshot restore snapshot.db \
         --name ETCD-CLUSTER-003 \
         --initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \
         --initial-advertise-peer-urls http://10.201.46.114:2380
    • 启动etcd从新的数据目录开始

       $ sudo sh /apps/sh/etcd.sh start
优化调整
  • 快照条目数量:--snapshot-count,指定有多少事物被提交时触发快截取快照保存到磁盘,

    • 3.2版本之前默认是1w条,之后默认调整为10w条

    • 过低会导致频繁io压力,过高会导致占用高内存和etcd GC过慢,一般是10w-20w。

  • 历史数据压缩:key空间长期的时候,如果不做压缩清理,达到上限阈值时,集群就会处于只能删除和读的状态。

    • 数据压缩只是清理数据的历史版本,不影响最新版本

    • 手动压缩命令:压缩清理revision 为10之前的历史数据

       $ export ETCDCTL_API=3;etcdctl compaction 10
    • 自动压缩使用:--auto-compaction-retention=1 表示每一小时进行一次数据压缩

  • 碎片清理:

    • 在历史数据压缩也就是执行compaction操作后,旧的revision被压缩会产生内部碎片, 内部碎片是指空闲状态并且能

      被后端使用,但是依然会消耗磁盘空间,

    • 清理命令:

       $  etcdctl defrag
    •  

posted @ 2021-07-21 10:51  遥不可及的  阅读(418)  评论(0)    收藏  举报