etcd工作原理和部署指南

jianweixs

https://www.jianshu.com/p/8d22ad512a78

etcd-logo.png

​ etcd是由CoreOS团队发的一个分布式一致性的KV存储系统,可用于服务注册发现和共享配置,随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd为解决这类问题带来了福音,本文将从etcd的应用场景开始,深入解读etcd的实现方式,以供开发者们更为充分地享用etcd所带来的便利。

特点:

使用场景

  • 配置管理
  • 服务注册于发现
  • 选主
  • 应用调度
  • 分布式队列
  • 分布式锁

原理:

​ etcd推荐使用奇数作为集群节点个数。因为奇数个节点和其配对的偶数个节点相比,容错能力相同,却可以少一个节点。综合考虑性能和容错能力,etcd官方文档推荐的etcd集群大小是3,5,7。由于etcd使用是Raft算法,每次写入数据需要有2N+1个节点同意可以写入数据,所以部分节点由于网络或者其他不可靠因素延迟收到数据更新,但是最终数据会保持一致,高度可靠。随着节点数目的增加,每次的写入延迟会相应的线性递增,除了节点数量会影响写入数据的延迟,如果节点跟接节点之间的网络延迟,也会导致数据的延迟写入。
结论:
​ 1.节点数并非越多越好,过多的节点将会导致数据延迟写入。
​ 2.节点跟节点之间的跨机房,专线之间网络延迟,也将会导致数据延迟写入。
​ 3.受网络IO和磁盘IO的延迟
​ 4.为了提高吞吐量,etcd通常将多个请求一次批量处理并提交Raft,
​ 5.增加节点,读性能会提升,写性能会下降,减少节点,写性能会提升。

部署

单机节点(CentOS 7)

$ yum install etcd -y
修改配置文件,通过yum 安装的etcd,以下是etcd的配置文件:$ vim /etc/etcd/etcd.conf
#[Member]
#ETC D_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.109:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.109:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"

参数说明:

  • –data-dir:指定节点的数据存储目录,若不指定,则默认是当前目录。这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指 定–wal-dir,还会存储WAL文件
  • –wal-dir:指定节点的was文件存储目录,若指定了该参数,wal文件会和其他数据文件分开存储
  • –name:节点名称
  • –initial-advertise-peer-urls:告知集群其他节点的URL,tcp2380端口用于集群通信
  • –listen-peer-urls:监听URL,用于与其他节点通讯
  • –advertise-client-urls:告知客户端的URL, 也就是服务的URL,tcp2379端口用于监听客户端请求
  • –initial-cluster-token:集群的ID
  • –initial-cluster:集群中所有节点
  • –initial-cluster-state:集群状态,new为新创建集群,existing为已存在的集群
  • etcd 默认存储大小限制是 2GB, 可以通过 --quota-backend-bytes 标记配置,最大支持 8GB.

启动etcd服务

$ systemctl start etcd.service
$ systemctl status etcd.service
● etcd.service - Etcd ServerLoaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled)Active: active (running) since 六 2018-06-02 22:17:34 CST; 9s agoMain PID: 2876 (etcd)CGroup: /system.slice/etcd.service└─2876 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://192.168.1.109:2379

多节点部署

自定义的 etcd discovery 服务

这种方式就是利用一个已有的 etcd 集群来提供 discovery 服务,从而搭建一个新的 etcd 集群。

假设已有的 etcd 集群的一个访问地址是:myetcd.local,那么我们首先需要在已有 etcd 中创建一个特殊的 key,方法如下:

$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

其中 value=3 表示本集群的大小,即: 有多少集群节点。而 6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 就是用来做 discovery 的 token。

接下来你在 3 个节点上分别启动 etcd 程序,并加上刚刚的 token。
加 token 的方式同样也有 命令行参数 和 环境变量 两种。

命令行参数:

-discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

环境变量

ETCD_DISCOVERY=https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

命令行参数启动方式为例:

$ etcd -name etcd0 -initial-advertise-peer-urls http://10.0.1.10:2380 \-listen-peer-urls http://10.0.1.10:2380 \-listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \-advertise-client-urls http://10.0.1.10:2379 \-discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd -name etcd1 -initial-advertise-peer-urls http://10.0.1.11:2380 \-listen-peer-urls http://10.0.1.11:2380 \-listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \-advertise-client-urls http://10.0.1.11:2379 \-discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd -name etcd2 -initial-advertise-peer-urls http://10.0.1.12:2380 \-listen-peer-urls http://10.0.1.12:2380 \-listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \-advertise-client-urls http://10.0.1.12:2379 \-discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

测试

可以使用etcd附带的基准 CLI工具完成基准测试etcd性能。

对于一些基准性能数字,我们考虑具有以下硬件配置的三个成员的etcd集群:

  • Google云计算引擎
  • 3台8个vCPU + 16GB内存+ 50GB固态硬盘
  • 1台机器(客户端),16个vCPU + 30GB内存+ 50GB SSD
  • Ubuntu 17.04
  • etcd 3.2.0,去1.8.3

有了这个配置,etcd可以大致写出:

密钥数量 密钥大小(字节) 值大小以字节为单位 连接数 客户数量 目标ETCD服务器 平均写入QPS 每个请求的平均延迟 平均服务器RSS
8 256 1 1 只有领导者 583 1.6毫秒 48 MB
100000 8 256 100 1000 只有领导者 44341 22毫秒 124MB
100000 8 256 100 1000 所有成员 50104 20ms的 126MB

示例命令是:

# write to leader
benchmark --endpoints=${HOST_1} --target-leader --conns=1 --clients=1 \put --key-size=8 --sequential-keys --total=10000 --val-size=256
benchmark --endpoints=${HOST_1} --target-leader  --conns=100 --clients=1000 \put --key-size=8 --sequential-keys --total=100000 --val-size=256# write to all members
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=100 --clients=1000 \put --key-size=8 --sequential-keys --total=100000 --val-size=256

可线性读取请求通过集群成员的法定人数达成一致以获取最新数据。可序列化的读取请求比线性读取要便宜,因为它们由任何单个etcd成员提供,而不是成员法定人数,以换取可能的陈旧数据。etcd可以阅读:

请求数 密钥大小(字节) 值大小以字节为单位 连接数 客户数量 一致性 平均读取QPS 每个请求的平均延迟
8 256 1 1 线性化 1,353 为0.7ms
8 256 1 1 序列化 2909 0.3ms的
100000 8 256 100 1000 线性化 141578 5.5ms
100000 8 256 100 1000 序列化 185758 时间为2.2ms

示例命令是:

# Single connection read requests
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=1 --clients=1 \range YOUR_KEY --consistency=l --total=10000
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=1 --clients=1 \range YOUR_KEY --consistency=s --total=10000# Many concurrent read requests
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=100 --clients=1000 \range YOUR_KEY --consistency=l --total=100000
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=100 --clients=1000 \range YOUR_KEY --consistency=s --total=100000

我们鼓励在新环境中首次安装etcd集群时运行基准测试,以确保集群达到足够的性能; 群集延迟和吞吐量可能会对较小的环境差异敏感。

以上测试部分翻译自官方文档(https://coreos.com/etcd/docs/latest/op-guide/performance.html)

  • 关于对Raft算法原理参考链接:

    • InfoQ:Raft 一致性算法论文译文

      http://www.infoq.com/cn/articles/raft-paper

      知乎:raft算法与paxos算法相比有什么优势,使用场景有什么差异?

      https://www.zhihu.com/question/36648084

      Raft算法动画:经典的Raft算法动画演示链接

      http://thesecretlivesofdata.com/raft/

etcd工作原理和部署指南相关推荐

  1. 垃圾回收算法的实现原理_有关垃圾回收算法工作原理的动画指南

    垃圾回收算法的实现原理 Garbage Collection is the process of cleaning up a computer's memory by getting rid of d ...

  2. 第28节 防火墙基本知识、工作原理及工作模式

    防火墙基本知识.工作原理及工作模式 1 防火墙概述 1.1 基本概念 1.2 与路由器对比 1.3 防火墙的基本功能 1.4 衡量防火墙性能的5大指标 2 区域隔离 2.1 区域概念 2.2 隔离思路 ...

  3. kubernetes的部署架构以及工作原理

    kubernetes 整体架构 Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统,所以整体的架构和borg很相似,整个架构有api server,control ...

  4. 深入浅出理解 Spark:环境部署与工作原理

    一.Spark 概述 Spark 是 UC Berkeley AMP Lab 开源的通用分布式并行计算框架,目前已成为 Apache 软件基金会的顶级开源项目.Spark 支持多种编程语言,包括 Ja ...

  5. zookeeper集群部署监控与选举同步流程等工作原理

    部署一个zookeeper集群,要多简单就能有多简单(下载压缩包,解压,修改配置文件zoo.cfg,执行启动脚本),但是想要真的把这套东西玩好了,还是需要费些功夫研究一番的.就跟自己搭建一个lnmp的 ...

  6. svn增量打包部署_超详细的jenkins持续集成工作原理、功能、部署方式等介绍

    概述 今天简单整理了一下jenkins的一些概念性内容,归纳如下: 1.概念 jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实 ...

  7. 超详细的jenkins持续集成工作原理、功能、部署方式等介绍

    文章由LinuxBoy分享于2019-08-30 11:08:39 超详细的jenkins持续集成工作原理.功能.部署方式等介绍 1. 概念 jenkins是一个开源项目,提供了一种易于使用的持续集成 ...

  8. 企业级别应用--GFS分布式文件系统(GlusterFS工作原理、弹性 HASH 算法 、GlusterFS卷的类型、 部署GlusterFS)

    文章目录 一. GlusterFS 概述 1.1 GlusterFS 简介 与传统分布式相比的优点 1.2 GlusterFS 的特点 扩展性和高性能 高可用性 全局统一命名空间 弹性卷管理 基于标准 ...

  9. 《Arduino开发实战指南:机器人卷》一3.2 直流电机工作原理

    本节书摘来华章计算机<Arduino开发实战指南:机器人卷>一书中的第3章 ,第3.2节,黄文恺 伍冯洁 陈 虹 编著更多章节内容可以访问云栖社区"华章计算机"公众号查 ...

最新文章

  1. opencv各版本 IplImage Mat 转换
  2. HDFS namenode 高可用(HA)搭建指南 QJM方式 ——本质是多个namenode选举master,用paxos实现一致性...
  3. 计算机视觉算法——目标检测网络总结
  4. [HDU1394]Minimum Inversion Number
  5. SAP BCP 超时机制的实现
  6. F. Cowmpany Cowmpensation(树形dp + 拉格朗日插值)
  7. “陪护机器人”研报:距离真正“陪护”还差那么一点
  8. 简单的for循环,你不会就落后了
  9. Python学习之路_day_25(面向对象之封装/多态/组合)
  10. Kotlin入门教程——目录索引
  11. Idea插件 Sonar
  12. 公钥密码学 公钥基础设施_简单解释公钥密码学
  13. 用ggplot2进行直线回归并添加回归方程和方差分析表
  14. 一文读懂机器学习分类全流程
  15. c#中将word转成图片,无水印
  16. Android Framework实战开发-binder通信常见(oneway,in,out,inout)元素介绍及binder双向通信的实现
  17. 终端环境如何下载谷歌网盘google drive文件
  18. vagrant给vmbox创建虚拟机及docker安装mysql和redis
  19. 【Paper】2022_Fixed-Time Cooperative Tracking for Delayed Disturbed Multi-Agent Systems Under Dynamic
  20. 用freemarker生成word文档,并插入图片

热门文章

  1. java 时间格式化 星期_Java SimpleDateFormate时间格式化
  2. python的reversed函数实质_Python reversed函数及使用方法解析
  3. java 小数 乘法_javascript(js)的小数点乘法除法-Java架构师必看
  4. Error:java: Invalid additional meta-data in ‘META-INF/spring-configuration-metadata.json‘: End of in
  5. mysql的驱动connect放在哪里_MySQL的JDBC驱动程序下载地址
  6. 基于模型与不基于模型的深度增强学习_CVPR2018: 基于时空模型无监督迁移学习的行人重识别...
  7. easyui tab页面关闭根据回调函数刷新父tab页
  8. TypeScript 的声明文件的使用与编写
  9. Arduino IDE和ArduBlock 的下载安装
  10. Linux命令解释之head