简介

etcd是一个采用Raft协议实现强一致性的分布式键值数据库,它提供了一种可靠的方式存储需要被分布式系统或机器集群访问的数据。

常见使用场景:服务注册与发现、键值对存储、消息发布和订阅、分布式锁。

特点

  • 简单:安装配置简单,提供HTTP API进行交互
  • 安全:支持SSL认证
  • 键值对存储:将数据存储在分层组织的目录中,如同在标准文件系统中
  • 监测变更:监测特定的键或目录以进行更改,并对值的更改做出反应
  • 性能:性能良好,根据官方压测结果,单实例支持每秒两千次以上的读操作
  • 可靠:基于raft算法,分布式数据的一致性和可用性有保证

常见相关术语

术语 描述 备注
raft raft算法,etcd实现一致性的核心 etcd有etcd-raft模块
follower 集群中的从节点 nil
leader 集群中的主节点 leader节点协调整个集群
candidate 候选节点 当follower接收leader的消息超时,就会转变为candidate
node raft状态机的实例 nil
member etcd实例,管理对应的node节点 可处理客户端请求
peer 同一个集群中的另一个member nil
cluster etcd集群 nil
lease 租期 键值对设置的过期时间,过期后删除
watch 监测机制 监控键值对的变化
term 任期 某个节点成为leader,到下一次竞选的时间
WAL 预写式日志 用于持久化存储的日志格式

单机部署

二进制包方式

  1. 从 github 仓库的 release 下载二进制包
  2. 解压后得到 etcd 和 etcdctl。将两个二进制可执行文件放到 /usr/local/bin 目录
  3. 验证
etcd --version
etcdctl version
  1. 安装完成

单机启动脚本

#!/bin/bash

set -u
scriptDir=$(cd $(dirname $0) && pwd)
baseDir=$(cd ${scriptDir}/.. && pwd) function startApp() {
nohup etcd \
--listen-client-urls http://127.0.0.1:12379 \
--advertise-client-urls http://127.0.0.1:12379 \
--enable-pprof \
--logger 'zap' \
--log-outputs=stderr \
--data-dir="${baseDir}/data" > ${baseDir}/logs/app.log 2>&1 &
} function main(){
startApp
} main

集群部署

etcd集群一般由奇数个节点组成,多个节点通过raft算法相互协作。raft算法会选择其中一个主节点作为leader,负责数据同步和分发。当leader发生故障时,系统会自动选择另一个节点作为leader。

静态集群

如果集群成员的一些信息,比如IP、端口是已知的,则可以静态方式部署etcd集群。

单机三实例的启动脚本示例,注意修改IP、端口号等信息

#!/bin/bash

set -u
script_dir=$(cd $(dirname $0) && pwd) etcd1IP='192.168.0.41'
etcd2IP='192.168.0.41'
etcd3IP='192.168.0.41'
etcdClusterToken='etcd-cluster-1' function startNode1() {
nohup etcd --name etcd1 \
--listen-client-urls http://${etcd1IP}:12379 \
--advertise-client-urls http://${etcd1IP}:12379 \
--listen-peer-urls http://${etcd1IP}:12380 \
--initial-advertise-peer-urls http://${etcd1IP}:12380 \
--initial-cluster-token ${etcdClusterToken} \
--initial-cluster="etcd1=http://${etcd1IP}:12380,etcd2=http://${etcd2IP}:22380,etcd3=http://${etcd3IP}:32380" \
--initial-cluster-state 'new' \
--enable-pprof \
--logger 'zap' \
--log-outputs=stderr \
--data-dir="${script_dir}/node1/data" > ${script_dir}/node1/logs/app.log 2>&1 &
} function startNode2() {
nohup etcd --name etcd2 \
--listen-client-urls http://${etcd2IP}:22379 \
--advertise-client-urls http://${etcd2IP}:22379 \
--listen-peer-urls http://${etcd2IP}:22380 \
--initial-advertise-peer-urls http://${etcd2IP}:22380 \
--initial-cluster-token ${etcdClusterToken} \
--initial-cluster="etcd1=http://${etcd1IP}:12380,etcd2=http://${etcd2IP}:22380,etcd3=http://${etcd3IP}:32380" \
--initial-cluster-state 'new' \
--enable-pprof \
--logger 'zap' \
--log-outputs=stderr \
--data-dir="${script_dir}/node2/data" > ${script_dir}/node1/logs/app.log 2>&1 &
} function startNode3() {
nohup etcd --name etcd3 \
--listen-client-urls http://${etcd3IP}:32379 \
--advertise-client-urls http://${etcd3IP}:32379 \
--listen-peer-urls http://${etcd3IP}:32380 \
--initial-advertise-peer-urls http://${etcd3IP}:32380 \
--initial-cluster-token ${etcdClusterToken} \
--initial-cluster="etcd1=http://${etcd1IP}:12380,etcd2=http://${etcd2IP}:22380,etcd3=http://${etcd3IP}:32380" \
--initial-cluster-state 'new' \
--enable-pprof \
--logger 'zap' \
--log-outputs=stderr \
--data-dir="${script_dir}/node3/data" > ${script_dir}/node1/logs/app.log 2>&1 &
} function main() {
mkdir -p ./node{1,2,3}/{data,logs}
startNode1
startNode2
startNode3
} main

测试:etcdctl --endpoints=http://192.168.0.41:12379 member list -w table

18681a1499dc680b, started, etcd2, http://192.168.0.41:22380, http://192.168.0.41:22379, false
8d715e240221ff02, started, etcd1, http://192.168.0.41:12380, http://192.168.0.41:12379, false
b0fec1f33e425704, started, etcd3, http://192.168.0.41:32380, http://192.168.0.41:32379, false

主要参数说明,其它参数可执行etcd --help查看。

  • --name:etcd集群中的实例名,不重复即可
  • --listen-client-urls:监听的用于客户端通信的url,可监听多个
  • --advertise-client-urls:建议使用的客户端通信url,用于etcd代理或etcd成员与etcd节点通信
  • --listen-peer-urls:节点之间通信的url,可监听多个,集群内布通过这些url进行数据交互
  • --initial-advertise-peer-urls:同样用于节点之间通信
  • --initial-cluster-token:根据该token生成集群唯一id
  • --initial-cluster:集群中其它节点的--initial-advertise-peer-urls合集
  • --initial-cluster-state:new,新建集群的标志

动态发现集群

nil

基于dns的动态发现集群

nil

参考

[etcd]简介与安装的更多相关文章

  1. ETCD 简介 + 使用

    etcd简介 etcd是一个高可用的分布式键值(key-value)数据库.etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现. etcd是一个服务发现系统,具备以下的特点: 简单: ...

  2. 001.etcd简介及单节点使用

    一 etcd简介 1.1 概述 etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key- ...

  3. 01 . etcd简介原理,应用场景及部署,简单使用

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

  4. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  5. Java Gradle入门指南之简介、安装与任务管理

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍.    ...

  6. 细细品味Storm_Storm简介及安装

    Storm是由专业数据分析公司BackType开发的一个分布式实时数据处理软件,可以简单.高效.可靠地处理大量的数据流.Twitter在2011年7月收购该公司,并于2011年9月底正式将Storm项 ...

  7. VMware vSphere 5.1 简介与安装

    虚拟化系列-VMware vSphere 5.1 简介与安装  标签: 虚拟化 esxi5.1 VMware vSphere 5.1 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  8. Nutch搜索引擎(第2期)_ Solr简介及安装

    1.Solr简介 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化 ...

  9. Node.js的简介和安装

    一.Node.js的简介和安装 a)       什么是Node.js? Node.js是一个开发平台 让JavaScript运行在服务器端的开发平台 ---简单点说就是用JavaScript写服务器 ...

  10. Nutch之简介与安装

    初学Nutch之简介与安装 初学Nutch之简介与安装   1.Nutch简介 Nutch是一个由Java实 现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其 ...

随机推荐

  1. PaddlePaddle 飞桨复现 ResNeXt

    import paddle.nn as nn import paddle class BN_Conv2D(nn.Layer): """ BN_CONV_RELU &quo ...

  2. ERRORS: app1.Book.photo: (fields.E210) Cannot use ImageField because Pillow is not installed.

    报错: (env) E:\pyAPP\mybook>python manage.py makemigrations SystemCheckError: System check identifi ...

  3. ModuleNotFoundError: No module named 'flask_sqlalchemy'

    ModuleNotFoundError: No module named 'flask_sqlalchemy' 解决: pip install flask_sqlalchemy

  4. 使用 Django 集成 vue 到一个服务器上,还是 Django 和 vue 分开部署

    Django+Vue 的项目,实际部署的时候,使用 Django 集成 vue 到一个服务器上,还是 Django 和 vue 分开部署? 目前在架构选择,基本上定了 Django + Vue 但是实 ...

  5. es mysql 适用场景对比

    es mysql 适用场景对比 问题一 全文检索毫无疑问直接上es,那么除了这种场景,什么时候该选es?为啥mysql不行? 对枚举字段的搜索 mysql创建索引的原则是对于那些区别度高字段建立索引, ...

  6. 驱动开发:内核解析PE结构节表

    在笔者上一篇文章<驱动开发:内核解析PE结构导出表>介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上 ...

  7. .net 温故知新【11】:Asp.Net Core WebAPI 入门使用及介绍

    在Asp.Net Core 上面由于现在前后端分离已经是趋势,所以asp.net core MVC用的没有那么多,主要以WebApi作为学习目标. 一.创建一个WebApi项目 我使用的是VS2022 ...

  8. CMU15445 (Fall 2020) 之 Project#1 - Buffer Pool 详解

    前言 去年暑假完成了 CMU15-445 Fall 2019 的四个实验,分别对应下述博客: CMU15445 (Fall 2019) 之 Project#1 - Buffer Pool 详解 CMU ...

  9. 【技术积累】JavaSciprt中的函数【一】

    什么是函数?如何声明函数? JavaScript中的函数是一段可重复使用的代码块,它可以接受输入并返回输出. 在JavaScript中,函数是一种特殊的对象,因此可以将其存储在变量中,将其作为参数传递 ...

  10. #PowerBi Superchange PowerBi 序言部分笔记(2)

    Xmind本文思维导图 序言部分,主要讲述了BI的分类及发展,以及作者推荐的学习方法.重点是介绍了powerbi的主要四大步骤. 即: 一:数据采集 Data acquisition: Power B ...