Go整合etcd

这篇具有很好参考价值的文章主要介绍了Go整合etcd。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

etcd 是什么

etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用,持久性数据存储和检索而准备。etcd 以一致和容错的方式存储元数据。分布式系统使用 etcd 作为一致性键值存储,用于配置管理,服务发现和协调分布式工作。使用 etcd 的通用分布式模式包括领导选举,分布式锁和监控机器活动。

关键特性:

  1. 分布式
  2. 强一致性
  3. 键值存储
  4. 监听数据变化
  • 使用场景

etcd 的场景默认处理的数据都是系统中的控制数据。所以 etcd 在系统中的角色不是其它 NoSQL 产品的替代品,更不能作为应用的主要数据存储。etcd 中应该尽量只存储系统中服务的配置信息,对于应用数据只推荐把数据量很小,但是更新和访问频次都很高的数据存储在 etcd 中。

作为一个受到 ZooKeeper 启发而催生的项目,它除了拥有与之类似的功能外,更专注于下面的这些点:

  1. 简单:易于部署,易使用。基于 HTTP+JSON 的 API 让你用 curl 就可以轻松使用。
  2. 安全:可选 SSL 客户认证机制。
  3. 快速:每个实例每秒支持一千次写操作。
  4. 可信:使用一致性 Raft 算法充分实现了分布式。
  • etcd的核心组件组成
  1. HTTP Server:用于处理用户发送的 API 请求以及其它 etcd 节点的同步与心跳信息请求。
  2. Store:用于处理 etcd 支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是 etcd 对用户提供的大多数 API 功能的具体实现。
  3. Raft:Raft 强一致性算法的具体实现,是 etcd 的核心。
  4. WAL:Write Ahead Log(预写式日志),是 etcd 的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd 就通过 WAL 进行持久化存储。WAL 中,所有的数据提交前都会事先记录日志。Snapshot 是为了防止数据过多而进行的状态快照;Entry 表示存储的具体日志内容。

通常,一个用户的请求发送过来,会经由 HTTP Server 转发给 Store 进行具体的事务处理,如果涉及到节点的修改,则交给 Raft 模块进行状态的变更、日志的记录,然后再同步给别的 etcd 节点以确认数据提交,最后进行数据的提交,再次同步。

为了保证数据的强一致性,etcd 集群中所有的数据流向都是一个方向,从 Leader (主节点)流向 Follower,也就是所有 Follower 的数据必须与 Leader 保持一致,如果不一致会被覆盖。简单点说就是,用户可以对 etcd 集群中的所有节点进行读写,读取非常简单因为每个节点保存的数据是强一致的。对于写入来说,etcd 集群中的节点会选举出 Leader 节点,如果写入请求来自 Leader 节点即可直接写入然后 Leader 节点会把写入分发给所有 Follower,如果写入请求来自其他 Follower 节点那么写入请求会给转发给 Leader 节点,由 Leader 节点写入之后再分发给集群上的所有其他节点。

  • leader 结点的选举

Raft 算法使用随机 Timer 来初始化 Leader 选举流程。比如说在上面三个节点上都运行了 Timer(每个 Timer 的持续时间是随机的),第一个节点率先完成了 Timer,随后它就会向其他两个节点发送成为 Leader 的请求,其他节点接收到请求后会以投票回应然后第一个节点被选举为 Leader。成为 Leader 后,该节点会以固定时间间隔向其他节点发送通知,确保自己仍是 Leader。有些情况下当 Follower 们收不到 Leader 的通知后,比如说 Leader 节点宕机或者失去了连接,其他节点会重复之前选举过程选举出新的 Leader。

命令行操作

  • 设置key

etcdctl set key value

  • 读取key
    etcdctl get key

  • 删除key
    etcdctl rm key

  • 监听key
    etcdctl watch [-f] [-r] key

-f 除非输入CTRL+C否则一直监控,不退出
-r 监听key包括key的所有子目录下的数据

Docker 搭建本地环境

docker-compose.yaml文章来源地址https://www.toymoban.com/news/detail-607580.html

version: '3'

services:
  etcd:
    image: quay.io/coreos/etcd
    command: etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379
    por

到了这里,关于Go整合etcd的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang/云原生/Docker/DevOps/K8S/持续 集成/分布式/etcd 教程

    3-6个月帮助学员掌握golang后端开发岗位必备技术点 教程时长: 150+小时 五大核心专栏,原理+源码+案例分析+项目实战直击工作岗位 golang:解决go语言编程问题 工程组件:解决golang工程化问题 分布式中间件:解决技术栈单一及分布式开发问题 云原生:解决云原生分布式部署及监

    2024年02月07日
    浏览(75)
  • Go gRPC etcd实现服务注册发现与负载均衡

    如果不了解go + grpc 调用方式和实现细节,可以参考上一篇文章 golang grpc配置使用实战教程 技术点 版本 描述 golang 1.19 基础版本 grpc v1.41.0 gRPC golang包 etcd server 3.5.0 注册中心 etcd client v3.5.8 客户端服务发现和负载均衡 服务注册依赖etcd的 key-value操作,key作为gRPC服务唯一标识,

    2024年02月05日
    浏览(56)
  • go-zero微服务实战——etcd服务注册与发现

    浅谈etcd服务注册与发现 etcd官网 etcd中文文档 apt安装etcd,启动命令十分简单 etcd 。 etcd分为v2版本和v3版本,命令有所不一样,使用命令 etcdctl h 查看 如上图所示并没有出现API的版本,此时是使用默认的v2版本,但是v2版本很多命令使用不了,因此切换为v3版本,命令如下: e

    2024年02月12日
    浏览(37)
  • 【Go微服务开发】gin+micro v4+rabbitmq+etcd 重构备忘录

    最近稍微重构了之前写的 micro-todolist 模块 项目地址:https://github.com/CocaineCong/micro-todoList 本次升级将原有的micro v2升级到了micro v4版本,v5 still deving,所以可能不太稳定,所以选择了v4版本。 micro相对于grpc,区别就是 grpc比较原始 ,什么都要自己封装,比如 服务的注册与发现

    2024年02月08日
    浏览(32)
  • 【Go语言实战】(22) gin+micro v4+rabbitmq+etcd 重构备忘录

    最近稍微重构了之前写的 micro-todolist 模块 项目地址:https://github.com/CocaineCong/micro-todoList 本次升级将原有的micro v2升级到了micro v4版本,v5 still deving,所以可能不太稳定,所以选择了v4版本。 micro相对于grpc,区别就是 grpc比较原始 ,什么都要自己封装,比如 服务的注册与发现

    2024年02月07日
    浏览(37)
  • golang整合kafka

    kafka 基本概念 消息队列 1、什么是消息队列 消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可

    2024年02月16日
    浏览(34)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(57)
  • 【Golang】go条件编译

    交叉编译只是为了能在一个平台上编译出其他平台可运行的程序,Go 作为一个跨平台的语言,它提供的类库势必也是跨平台的,比如说程序的系统调用相关的功能,能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,

    2024年02月11日
    浏览(58)
  • 【Golang】go交叉编译

    交叉编译是用来在一个平台上生成另一个平台的可执行程序 。Go 命令集是原生支持交叉编译的。 Mac下编译:Linux 或 Windows 的可执行程序 Linux下编译:Mac 或 Windows的可执行程序 Windows下编译:Mac 或 Linux的可执行程序 需要写一个批处理程序,在里面去设置,因为windows 下的 ter

    2024年02月10日
    浏览(43)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包