etcd 初探 + 集群部署

本贴最后更新于 2274 天前,其中的信息可能已经时异事殊

一: 简介
    1) 近年来随着 docker+kubenetes 流行与火热,它们都默认用了 etcd 组件作为一个高可用的跨节点的数据存储仓库,etcd 是什么?很多人第一反应是键值存储仓库。首先先看官方的定义。
etcd 是一个分布式的键值存储仓库,它提供了一种跨集群的的数据存储的可靠方法。

etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines.

    看了以上定义,可能又有人会问,这种分布式的跨集群的数据存储有许多,为什么会是它,请看另一段定义。
etcd 是一个开源的分布式键值存储仓库,它为容器提供了配置共享和服务发现。

etcd is an open-source distributed key value store that provides shared configuration and service discovery for Container Linux clusters.

    2) etcd 和 ZooKeeper/Consul/doozer 等非常相似,都提供了类似的功能,以及 REST API 的访问操作,具有以下特点:
      * 简单:安装和使用简单,提供了 REST API 进行操作交互
      * 安全:支持 HTTPS SSL 证书
      * 快速:支持并发千次的读写操作
      * 可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性
    3) etcd 用有限的资源,就可以提供高可用跟高并发服务。具体的参数请参考官方网站:
        https://coreos.com/etcd/docs/latest/op-guide/hardware.html
    4) etcd 构建自身高可用集群主要有三种形式:
        ① 静态发现: 预先已知 etcd 集群中有哪些节点,在启动时直接指定好 Etcd 的各个 node 节点地址
        ② etcd 动态发现: 通过已有的 etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
        ③ dns 动态发现: 通过 DNS 查询方式获取其他节点地址信息
    本文主要介绍第一种方式。
二:环境介绍:
    三台虚拟机,系统环境均为 Centos7,对应节点名称及 IP 地址如下:
    app1:192.168.16.5
    app2:192.168.16.6
    app3:192.168.16.102
三:安装&配置
    三台机器分别执行 sudo yum install etcd -y,yum 安装的 etcd 默认配置文件在/etc/etcd/etcd.conf,以下将三个节点上的配置贴出来,未贴出部分不影响集群的搭建就表明暂时不用改
    app1:
        #[Member]
        #数据存放路径
        ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
        #监听其他 etcd node 的 url
        ETCD_LISTEN_PEER_URLS="http://192.168.16.5:2380,http://127.0.0.1:2380"
        #监听客户端的 url,etcdctl 默认 ip 为 127.0.0.1,不追加 127.0.0.1 可能会报端口拒绝的错误
        ETCD_LISTEN_CLIENT_URLS="http://192.168.16.5:2379,http://127.0.0.1:2379"
        ETCD_NAME="app1"
        #[Clustering]
        #集群内通信用 url
        ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.16.5:2380"
        #集群内广播给其他节点用 url
        ETCD_ADVERTISE_CLIENT_URLS="http://192.168.16.5:2379"
        #初始化集群列表
        ETCD_INITIAL_CLUSTER="app1=http://192.168.16.5:2380,app2=http://192.168.16.6:2380,app3=http://192.168.16.102:2380"
        #集群名称
        ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
        #初期化集群状态,new 为新建集群
        ETCD_INITIAL_CLUSTER_STATE="new"
    app2:
        #[Member]
        ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
        ETCD_LISTEN_PEER_URLS="http://192.168.16.6:2380,http://127.0.0.1:2380"
        ETCD_LISTEN_CLIENT_URLS="http://192.168.16.6:2379,http://127.0.0.1:2379"
        ETCD_NAME="app2"
        #[Clustering]
        ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.16.6:2380"
        ETCD_ADVERTISE_CLIENT_URLS="http://192.168.16.6:2379"
        ETCD_INITIAL_CLUSTER="app1=http://192.168.16.5:2380,app2=http://192.168.16.6:2380,app3=http://192.168.16.102:2380"
        ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
        ETCD_INITIAL_CLUSTER_STATE="new"
    app3:
        #[Member]
        ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
        ETCD_LISTEN_PEER_URLS="http://192.168.16.102:2380,http://127.0.0.1:2380"
        ETCD_LISTEN_CLIENT_URLS="http://192.168.16.102:2379,http://127.0.0.1:2379"
        ETCD_NAME="app3"
        #[Clustering]
        ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.16.102:2380"
        ETCD_ADVERTISE_CLIENT_URLS="http://192.168.16.102:2379"
        ETCD_INITIAL_CLUSTER="app1=http://192.168.16.5:2380,app2=http://192.168.16.6:2380,app3=http://192.168.16.102:2380"
        ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
        ETCD_INITIAL_CLUSTER_STATE="new"
    改好配置之后,在各个节点上开启 etcd 服务:sudo systemctl restart etcd,集群就此搭建完毕
四:测试验证:
    1. etcdctl member list
        4ed30152ffb4e90b: name=app2 peerURLs=http://192.168.16.6:2380 clientURLs=http://192.168.16.6:2379 isLeader=false
        8db7b2edc9e1381e: name=app3 peerURLs=http://192.168.16.102:2380 clientURLs=http://192.168.16.102:2379 isLeader=false
        973ffc1324497d5b: name=app1 peerURLs=http://192.168.16.5:2380 clientURLs=http://192.168.16.5:2379 isLeader=true
    2. etcdctl cluster-health
        member 4ed30152ffb4e90b is healthy: got healthy result from http://192.168.16.6:2379
        member 8db7b2edc9e1381e is healthy: got healthy result from http://192.168.16.102:2379
        member 973ffc1324497d5b is healthy: got healthy result from http://192.168.16.5:2379
        cluster is healthy
五:参考资料
    https://coreos.com/etcd/

  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 546 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    183 引用 • 1010 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 500 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9382 引用 • 42757 回帖 • 112 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 76 关注
  • Access
    1 引用 • 3 回帖 • 6 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 676 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 413 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 8 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 62 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 254 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    157 引用 • 290 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 664 关注
  • danl
    163 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 168 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • 印象笔记
    3 引用 • 16 回帖 • 2 关注