服务注册与服务发现

三部分的作用:

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

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

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

简单易懂的 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. 用ChatGPT,绘制一个账号系统的C4架构图

    hi,我是熵减,见字如面. 昨天我们用ChatGPT来设计一个账号系统,并尝试输出:模型表,类关系图,序列图,状态图等常用的架构设计中常用的元素. 今天,我们继续向更高层级延伸一下,看ChatGPT能 ...

  2. 开源免费3D CAD软件:FreeCAD

    推荐:将 NSDT场景编辑器 加入你的3D开发工具链. FreeCAD是来自法国Matra Datavision公司的一款开源**3D CAD软件, 基于CAD / CAM / CAE几何模型核心,是 ...

  3. 基于C++的OpenGL 01 之Hello Triangle

    1. 引言 本文基于C++语言,描述OpenGL的绘制流程,这里描述的是OpenGL的核心模式(Core-profile) 本文基于Ubuntu 20.04.3 LTS系统,使用CMake构建程序,O ...

  4. TP框架在nginx中的配置

    TP框架配置中默认URL_MODEL=1,而Nginx默认是不支持PATHINFO的.如果我们只想跑起来tp框架,很简单,只需到更改TP配置,设置URL_MODEL=3(兼容模式).但是如果要让Ngi ...

  5. Android Studio连接SQLlite

    1. MainActivity.java package com.example.dbproject;import android.database.sqlite.SQLiteDatabase;imp ...

  6. ionic混合开发总结之调用手机相机

    整理一下,给接触ionic的伙伴们一些参考,少走弯路. 调用手机的前提是已经成功创建了项目. 首先,要下载两个插件,一个是 cordova-plugin-camera,是调用相机的插件,还有一个是Ng ...

  7. 找出一组数中出现次数最多的数(csp201312-1)

    问题描述:找出一组数字出现次数最多的数,如果有多个这样的数,输出其中最小的一个. 算法:sort排序,遍历数组,每遍历一个数,查出它已经出现的次数. 代码: #include<bits/stdc ...

  8. windows与linux下的路径区别

    windows与linux下的路径区别windows用的是"\",linux用的是"/"这一点要特别清楚,, ps:在PHP windows也可以用/表示路径 ...

  9. iOS组件化 pod命令创建私有库详解【引用其他私有库、oc、Swift混编】

    1.命令创建pod pod lib create pod的名字 2.根据指令依次填写信息 3.填写完成后会自动打开项目 .然后修改podspec文件即可 4.创建当前pod的git 仓库.将当前代码放 ...

  10. Wordpress主题twentytwelve修改首页文章摘要

    方法:网站后台->外观->编辑->找到content.php文件 路径:wp-content/themes/twentytwelve/ 找到这一句: <?php if ( is ...