1. etcd简介

  • 简介

        Etcd是CoreOS基于Raft协议开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。

        在分布式系统中,如何管理节点间的状态一直是一个难题,etcd像是专门为集群环境的服务发现和注册而涉及,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。

  • 特点

        简单:curl可访问的用户的API(HTTP + JSON)

        安全:可选的SSL客户端证书认证

        快速: 单实例每秒1000次写操作

        可靠:使用Raft算法保证一致性

  • 主要功能

        1. 基本的key-value存储

        2. 监听机制

        3. key的过期及续约机制, 用于监控和服务发现

        4. 原子Compare And Swap和Compare And Delete, 用于分布式锁和leader选举

2. Raft协议

1. 参考链接

Rafthttp://thesecretlivesofdata.com/raft/

2.  理解raft协议

  • raft协议本身是为了实现分布式系统一致性(选举的方式选举出leader,多次确认的方式来写入数值 )

        以etcd为例,etcd作为一个节点本身有三个状态(follower遵循者/Candidate候选人/leader意见领袖)。假设系统有三个节点,在初始化的时候是以follower来进行初始化,如果follower没有leader则会把自己转变为Candidate(150ms-300ms随机时间), 则自己去拉票,只要超过半数的票则从Candidate变成leader。则所有的集群都要听从leader的安排,leader会每时每刻保持心跳,让其他follower知道leader在线。

        有leader以后所有的修改都会从leader发起。假设设置一个数值,会先预提交,leader要通知其他follower进行设置数值,当集群超过半数的人修改完成commit,leader则对于自身设置数值进行commit。

        新的任期leader权利会大于老的任期leader, Term值得大小来决定。

3. etcd整个写数据流程

  • 写数据流程步骤图解

  •  文字详细叙述上图过程

  1. 当客户端对etcd发起请求的时候,如果etcd不是leader的状态而是follower,follower则会将请求转发leader; 如果是leader后, 会对其进行预检查,检查(配额、限速、鉴权【判断请求是否合法】、包大小【需要小于1.5M,过大则会拒绝】)。
  2. 如果请求本身是合法的,会将请求转发给KVServer处理。
  3. KVserver一致性模块进行数据处理,一致性模块是基于raft协议实现的,这时候的数据本身是处于unstable状态。
  4. 当leader该数据处理unstable状态后,会通过rpc通知其他follower也来同步该数据,并且leader本身会在数据同步到日志模块【wal日志, wal日志通过fsync落盘到磁盘中】。而其他follow在同步该数据的时候,本身完成的是步骤3和数据同步到日志模块,follower一致性模块数据变成commited状态,当完成了这些后通过上次rpc返回响应体给leader。
  5. leader在收到了超过半数集群本身确认后,更新MatchIndex, 一致性模块中数据本身由unstable变化成commited状态。这时候通过MVCC模块【treeIndex和BoltDB开源组件组成】进行状态机的写入,将数据同步到treeIndex【会更新modified版本[当前版本号], generations信息[创建的版本,当前版本数,过往的所有版本号]】。再通过BoltDB落盘到磁盘中。这时候一致性模块数据由commited变化为applied状态。【在这里如果没有要求数据强一致性,弱一致性的话,那么数据在commited状态就认为数据已经同步完成了】。
  6. 再通过heatbeat将数据同步到follower中MVCC模块中。最终完成数据的一致性。如下图所示。 【如果follower比leader落后好几个版本,leader会通过headbeat带到follower进行同步】。

4. etcd高可用解决方案

etcd-operator

1. 开源代码链接

GitHub - coreos/etcd-operator: etcd operator creates/configures/manages etcd clusters atop Kuberneteshttps://github.com/coreos/etcd-operator

  • Etcd statefulset Helm chart

1. 开源代码链接

Helm Charts to deploy Etcd in Kuberneteshttps://bitnami.com/stack/etcd/helmcharts/bitnami/etcd at master · bitnami/charts · GitHubBitnami Helm Charts. Contribute to bitnami/charts development by creating an account on GitHub.https://github.com/bitnami/charts/tree/master/bitnami/etcd

5. kubernetes如何使用etcd

        在kubernetes-master\pkg\registry\core\pod\storage\storage.go对于每个k8s object都有一个这个文件负责对象的存储操作

6. 连接kubernetes的etcd方式

1. 查询etcd pod名称

kubectl get po --namespace=kube-system

2. 进入pod执行sh命令框

 kubectl --namespace=kube-system exec -it etcd-ubuntu sh

3. 拼接命令 

# 获取etcd证书参数
ps -ef | grep etcd 

# 拼接好证书后简单进行查询key为/开头
etcdctl --endpoints https://192.168.137.156:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt get --prefix / --keys-only  

# 查询成员对象
etcdctl --endpoints https://192.168.137.156:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt member list 

# 查询key为/registry/services/specs/default/kubernetes对应的值
etcdctl --endpoints https://192.168.137.156:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt get /registry/services/specs/default/kubernetes

文章还没有写完,后续会慢慢补齐,谢谢

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐