简介

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. 用tk.mybaits实现指定字段更新

    ​ 去年年底的因为业务需要需要在使用tk.mybaits框架的系统中实现指定字段的更新,可是tk.mybaits框架本身并不支持这个功能,我翻遍了CSDN和其他相关的技术相关的网站都没有找到相关的解决 ...

  2. 2022-02-13:k8s安装gitlab,yaml如何写?

    2022-02-13:k8s安装gitlab,yaml如何写? 答案2022-02-13: yaml如下: apiVersion: apps/v1 kind: Deployment metadata: ...

  3. 2021-10-09:杨辉三角。给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。力扣118。

    2021-10-09:杨辉三角.给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行.在「杨辉三角」中,每个数是它左上方和右上方的数的和.力扣118. 福大大 答案2021-10 ...

  4. 人手一个 Midjourney,StableStudio 重磅开源!

    人手一个 Midjourney,StableStudio 重磅开源! Stability AI 公司在上个月 19 号推出了 Alpha 版本 StableLM 大语言模型,包含了 30 亿和 70 ...

  5. springboot 整合druid和mybatis

    Shrio+Mybatis+Druid 1.导入相关依赖包 2.在配置文件配置数据源 3.pojo对应实体类和mapper目录下的接口UserMapper (3.使用注解版) package com. ...

  6. nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:50

    最近在nginx中配置一个443端口 一.安装nginx 首先得先安装个nginx 1.安装依赖包 # 一键安装上面四个依赖 [root@dex ~]# yum -y install gcc zlib ...

  7. postman接口关联1

    1.接口关联 在接口测试中,经常会遇到后一接口的请求数据需要用到前一接口响应数据 关联接口:简单描述就是一个接口的返回结果作为另一个接口入参,其中最典型的就是需要登录token验证的接口,需要先调用登 ...

  8. 聊聊MAUI、WinUI3和WPF的优势及劣势

    今天在群里聊到WinUI3的学习及发展,还有他那堪比玩具的使用体验,正好梳理一篇关于WinUI3.MAUI和WPF优劣势,我整理的不是很好,所以又让ChatGPT在生成了一遍,感觉整体还可以.看完可以 ...

  9. CANoe工具的安装

    CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment,用于分析和模拟CAN(Controller Area Network)和LIN ...

  10. 尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)

    第01章-项目介绍 1.课程介绍 项目名称:尚医通预约挂号统一平台 项目原型:https://www.114yygh.com 北京市预约挂号统一平台 项目技术栈:前后端分离 后端技术:SpringBo ...