服务注册与服务发现

三部分的作用:

  • 注册中心:记录服务和服务地址的映射关系

  • 服务提供者:将服务注册到服务中心

  • 服务发现者:对服务中心的服务进行调用

简单易懂的 raft 算法

Raft算法是一个一致性算法。其过程如同选举一样,参选者要说服大多数的选民(服务器)投票给他,一旦选定,就要跟随其操作。

raft协议server 进程分为三类,分别是 Leader(领袖)、Candidate(候选人)、Follower(群众),一个 service 进程在某一时刻,只能是其中一种类型,但这不是固定的,不同时刻,它可能拥有不同的类型。

就想是一个民主社会,领袖由群众投票选出。刚开始没有领袖,所有集群中的参与者都是群众。首先开启一轮大选,在大选期间,所有的群众都能参与竞选,这时所有的群众的角色就会变成候选人,民主投票选出领袖后,就开始这一届的领袖任期,然后选举结束,所有除了领袖外的候选人又变回了群众的角色服从领袖领导。

Leader 选举过程

从raft算法的基本概念可以推出,一个最小的raft民主集群,也需要三个参与者。一般情况下,进行投票,都可以选出Leader,但是有些极端情况,比如 A B C 三个节点都投了自己,结果没有任何一方获得多数票,这时候,每个参与方都要随机休息一会,重新发起投票,直到一方获得多数票。这里的关键就是随机,最先从 timeout 中恢复发起投票的一方,向还在 timeout 中的另外两方请求投票,这时他只能投给自己,导致很快达成一致。

选举出来 leader 后,leader通过定期向所有的 Follower 发送心跳信息维持其统治,若 Follower 一段时间未收到 leader 的心跳,则认为 Leader已经挂了,然后再次发起选举过程。

raft算法的强一致性

raft 协议强依赖与 leader 节点的可用性,以确保集群数据的一致性。如果发生异常,集群的控制权就会从 Leader 节点往其他 Follower 节点转移。具体的过程如下

  1. 当 client 向集群 leader 节点提交数据后,此时 Leader 节点接受到的数据处于未提交状态

  2. Leader 节点会并发向所有的 Follower 极点复制数据并等待接受响应

  3. 集群中超过半数的节点已接受到数据后,Leader 再向 Client 确认数据已接受

  4. 一旦 Leader 节点向 Client 发送已接受数据的 ACK 响应的时候,表示此时的数据状态进入已提交状态。Leader 节点会再向 Follower 节点发通知告知该数据状态已提交

脑裂

raft算法保证任一任期内最多一个leader被选出。在一个复制集中任何时刻只能有一个leader。系统中同时有多余一个leader,被称之为脑裂(brain split),这是非常严重的问题,会导致数据的覆盖丢失。在raft中,两点保证了这个属性:

  1. 一个节点某一任期内最多只能投一票

  2. 只有获得majority投票的节点才会成为leader

因此,某一任期内一定只有一个leader。但是,在网络分割(network partition)的情况下,可能会出现两个leader,但两个leader所处的任期是不同的。

一旦出现脑裂,网络分将原来的 Leader 节点和 Follower 节点分隔开,Follower 节点收不到 Leader的心跳将重新发起选举,产生新的 Leader 节点,这样就会产生双 Leader的现象。

原来的 Leader 独自在一个区,向它提交数据不可能复制到多数节点,所以永远提交不成功。网络恢复后,旧的 Leader 会发现集群中有更新任期的新的 Leader,则自动降级为 Follower 并从新的 Leader 处同步数据达成集群数据一致。

Etcd 的基本操作

使用 docker 安装 etcd

docker run -d --restart=always -p 2379:2379  --env ALLOW_NONE_AUTHENTICATION=yes   --name etcd_zh  bitnami/etcd
  1. etcd 操作,分为数据库操作和非数据库操作两种。

  2. 默认的 etcdApi 为 2.x 版本,需设置为 3.X 的通用版本。

  3. 在 ubuntu 系统中,环境变量更改后,最好使用 reboot 命令重启一下,确保声明的环境变量生效。

export ETCDCTL_API=3

或者在`/etc/profile`文件中添加环境变量
vi /etc/profile
...
export ETCDCTL_API=3
...
source /etc/profile

数据库操作

1. 增

etcdctl put testkey01 111

2. 查

单个查找

etcdctl get testkey01

范围查找

etcdctl get testkey01  testkey03   # 查询范围为 [testkey01  testkey03 ),前闭后开,不含 testkey03

使用前缀查找

etcdctl get --prefix testkey      # 查询所有 testkey 开头的 key

如果以某前缀开始的 key 过多的话,可以限制数量

etcdctl get --prefix --limit 2  testke   #最多显示两个

3. 删除

范围删除

etcdctl del testkey01 testkey03   # 删除范围为 [testkey01  testkey03 ),前闭后开,不含 testkey03

watch 历史变动

在命令行输入watch 命令,则如果该值发生变化,则在该终端中会立马进行显示

etcdctl watch testkey03          # 监视 testkey03

etcdctl put  testkey03  0333  # 另开一个命令行,改变testkey03 的值

lease 租约

Lease 意思为租约。类似于 redis 中的 TTL (time to live)

$ etcdctl lease grant 100    # 授予租约
lease 694d80c19225c31a granted with TTL(100s) # 得到一个租约

将租约添加到 key4 上

etcdctl put --lease=694d80c19225c31e testkey04 444    # 将租约绑定到 key4上

持续刷新租约,让其永远生效

etcdctl lease keep-alive 694d80c19225c322

刷新租期剩余时间

$ etcdctl lease timetolive 694d80c19225c322                               # 查看租期的剩余时间
lease 694d80c19225c322 granted with TTL(100s), remaining(86s) # 查询结果:还剩86秒杀

撤销租约;在撤销的过程中,会删除掉该租约所附带的所有的 key

etcdctl lease timetolive 694d80c19225c322

etcd 入门的更多相关文章

  1. Etcd入门教程

    etcd是一个类似于zk的工具,用于保存值,节点-值这种映射关系的.节点组织结构类似unix文件系统结构,从/最开始.比如一个/test/name节点,值为guanxianseng.可以通过etcdc ...

  2. etcd入门

    简介 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库. etcd内部采用raft协议作为一致性算法,基于Go语言实现. et ...

  3. [转帖]从零开始入门 K8s | 手把手带你理解 etcd

    从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...

  4. Etcd 使用入门

    etcd简介 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库.etcd内部采用raft协议作为一致性算法,etcd基于Go语 ...

  5. OpenResty从入门到开发一个网关服务(使用etcd作为注册中心)

    简介 OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过揉和众多设计良 ...

  6. 从零开始入门 K8s | 手把手带你理解 etcd

    作者 | 曾凡松(逐灵) 阿里云容器平台高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 16 讲. 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 ...

  7. 从零开始入门 K8s | etcd 性能优化实践

    作者 | 陈星宇(宇慕)  阿里云基础技术中台技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 17 讲. 导读:etcd 是容器云平台用于存储关键元信息的组件.阿 ...

  8. K8S从入门到放弃系列-(3)部署etcd集群

    摘要:etcd 是k8s集群最重要的组件,用来存储k8s的所有服务信息, etcd 挂了,集群就挂了,我们这里把etcd部署在master三台节点上做高可用,etcd集群采用raft算法选举Leade ...

  9. ETCD快速入门-01 ETCD概述

    1.ETCD概述 1.1 ETCD概述     etcd是一个高可用的分布式的键值对存储系统,常用做配置共享和服务发现.由CoreOS公司发起的一个开源项目,受到ZooKeeper与doozer启发而 ...

  10. ETCD快速入门-02 ETCD安装

    2.ETCD安装     etcd 安装可以通过源码构建也可以使用官方构建的二进制文件进行安装.我们以二进制文件为例,系统为CentOS 7.9,操作步骤如下所示: 2.1 Linux ETCD_VE ...

随机推荐

  1. 安卓逆向HOOK 3.系类HOOK

    package xphok; import java.lang.reflect.Method; import java.security.MessageDigest; import java.text ...

  2. JZOJ 3226. 【HBOI2013】ALO

    题目 网上自己搜 解析 区间异或很容易想到可持久化字典树 但本题的关键是如何高效率求出以某个数为区间最大值时这个区间的范围 依题我们知道区间最长可到比它第二大的位置(开区间) 所以我们如果能找到每个数 ...

  3. axSpA患者新发炎症更容易发生在既往发生过炎症的区域

    axSpA患者新发炎症更容易发生在既往发生过炎症的区域 EULAR2015; PresentID: SAT0240 NEW INFLAMMATORY LESIONS IN AXIAL SPONDYLO ...

  4. 2022年冬pat乙级考试题目及代码解析附部分错误原因

    快考pat乙级了,花了十块钱做了一下去年冬天的pat乙级,不难,现在在花ac之后的时间来写文章,默默许愿几天后的也不难,但是我们也要做好准备啊~ B-1 谣言检测仪 分数 15 作者 陈越 单位 浙江 ...

  5. 【javascript】slice()、substring()和substr() 三种字符串截取方法区别

    slice(start, end) :slice(start, end) 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分.  1.start(包含) 和 end(不包含) 参数来指定字符串 ...

  6. CPU持续100%分析并解决

    背景 接到客户电话,说某系统数据库服务器CPU利用率从上午8点开始到现在基本上都是100%的情况,影响到了业务.让给看看是什么原因导致的,怎么紧急处理一下. 现象 查看CPU利用率,确实一直是90%以 ...

  7. Linux如何查看实时滚动日志

    Linux有多种方法可以查看实时滚动日志.最常用的方法是使用tail命令,它可以显示一个文件的最后几行,并且可以跟踪文件的变化.例如,你可以输入tail -f /var/log/syslog来查看系统 ...

  8. Spark Streaming实时计算

    spark批处理模式: receiver模式:接收数据流,负责数据的存储维护,缺点:数据维护复杂(可靠性,数据积压等),占用计算资源(core,memory被挤占) direct模式:数据源由三方组件 ...

  9. 使用iperf测试网卡性能

    1.目标 测试网卡通信性能,同时可以通过改变连接方式(从两台PC网线直连,切换到通过交换机连接)测试交换机最高速率性能. 2.使用工具 硬件:两台PC机(本例用win10 64位).数根网线.交换机 ...

  10. js将json数据保存下载为json文件

    const button = document.createElement('a'); button.onclick = () => { // 要保存的字符串, 需要先将数据转成字符串 cons ...