敞开成长之旅!这是我参加「日新方案 2 月更文应战」的第 23 天,点击检查活动详情

简介

什么是etcd?

etcd 是一个一致的分布式键值存储。在分布式体系中主要用作独自的协调服务。

并设计用于保存可完全放入内存中的少数数据

2 安装和基础运用

     git clone -b v3.5.0 https://github.com/etcd-io/etcd.git
 2005  ls
 2006  cd etcd/
 2007  ls
 2008  ./build.sh
 2009  ls 
 2019  export PATH="$PATH:/data/etcds/etcd/bin"
 2020  etcd --version

安装后,需求发动它

    nohup etcd >etcd.log 2>&1 &

指定客户端衔接本服务时,需求键入的主机地址:

   nohup etcd --listen-client-urls http://192.168.30.131:2379 --advertise-client-urls http://192.168.30.131:2379 >etcds.log 2>&1 &

设置键值:

    etcdctl --endpoints=127.0.0.1:2379 put foo "hello bar."

获取键值:

    etcdctl --endpoints=127.0.0.1:2379 --write-out="json" get foo

其他客户端能够经过外网ip衔接

    etcdctl --endpoints=192.168.30.131:2379 endpoint health

2.1 怎么设置演示 etcd 集群,访问etcd

直接经过ip端口号访问:

设置键值:

    etcdctl --endpoints=127.0.0.1:2379 put foo "hello bar."

获取键值:

etcdctl --endpoints=127.0.0.1:2379 --write-out="json" get foo

2.3 怎么经过前缀获取键

大量相似的键,存储的值,能够经过其一起的前缀 一次性获取,比方设置 web1 web2 web3 后,经过web能够悉数获取

    root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 put web1 "hello web1"
	OK
	root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 put web2 "hello web2"
	OK
	root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 put web3 "hello web3"
	OK
	root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 get web --prefix
	web1
	hello web1
	web2
	hello web2
	web3
	hello web3

成果写入json:

  etcdctl --endpoints=127.0.0.1:2379 --write-out="json" get web --prefix
    {"header":{"cluster_id":14841639068965178418,"member_id":10276657743932975437,"revision":6,"raft_term":2},
    "kvs":[{"key":"d2ViMQ==","create_revision":4,"mod_revision":4,"version":1,"value":"aGVsbG8gd2ViMQ=="},
        {"key":"d2ViMg==","create_revision":5,"mod_revision":5,"version":1,"value":"aGVsbG8gd2ViMg=="},
        {"key":"d2ViMw==","create_revision":6,"mod_revision":6,"version":1,"value":"aGVsbG8gd2ViMw=="}],
     "count":3}

2.4 怎么删去键

只删去一个

按前缀批量删去

	root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 del web1
	1
	root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 del web --prefix
	2

2.5 怎么在业务中进行屡次写入 multiple writes in a transaction

设置一个新值

  etcdctl --endpoints=127.0.0.1:2379 user1 bad

创立业务

  etcdctl --endpoints=127.0.0.1:2379 txn --interactive

修改这个设置的值

   etcdctl --endpoints=127.0.0.1:2379 txn --interactive
	compares:
	value("user1") = "bad"
	success requests (get, put, del):
	del user1
	failure requests (get, put, del):
	put user1 good
	SUCCESS

2.6 怎么监控键值更改 watch key

发动监听键值服务

     etcdctl --endpoints=127.0.0.1:2379 watch stock --prefix

在另一个进程设置这个 stock前缀的任何值,将在此处反响

     etcdctl --endpoints=127.0.0.1:2379 put stock1 100

监控台将实时反响:

 etcdctl --endpoints=127.0.0.1:2379 watch stock --prefix
	PUT
	stock1
	100

2.7 怎么创立租约 lease

创立一个租约

etcdctl --endpoints=127.0.0.1:2379 lease  grant 300
lease 694d85bfb1026b25 granted with TTL(300s)

坚持租约合法

root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 lease keep-alive 694d85bfb1026b25
lease 694d85bfb1026b25 keepalived with TTL(300)

在此指定租约中 创立 键值,(假如此时你的键值监听仍然在线,那么将会看到这个操作)

root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 put stock2 2000 --lease=694d85bfb1026b1f
OK

获取键值信息

root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 get stock2
root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 lease revoke 694d85bfb1026b25

留意,即使创立了租约,可是在设置键值的时分,没有指定租约id,那么键值是不会受到租约的影响的。

2.8 怎么创立锁

etcd的锁是 阻塞锁,假如一个客户端创立了锁,那么这个客户端将干不了其他事情

  etcdctl --endpoints=127.0.0.1:2379 lock mutex1
  mutex1/694d85bfb1026b2e

这时,客户端2 假如尝试创立同样的锁,将不被响应

   etcdctl --endpoints=127.0.0.1:2379 lock mutex1

锁能够没有时长约束。

2.9 etcd集群怎么进行leader推举

集群推举能够指定

   etcdctl --endpoints=127.0.0.1:2379 elect one p1
      one/694d85bfb1026b41
      p1

或许

   etcdctl --endpoints=127.0.0.1:2379 elect one p2
      one/694d85bfb1026b48
      p2

2.10 怎么检查集群状态

状态检查,为每台机器指定初始集群装备:

  etcdctl --write-out=table --endpoints=127.0.0.1:2379 endpoint status

健康检查

  etcdctl --endpoints=127.0.0.1:2379 endpoint health

例子:

    etcdctl --endpoints=$ENDPOINTS endpoint health
root@fk:/data/etcds#    etcdctl --write-out=table --endpoints=127.0.0.1:2379 endpoint status
+----------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|    ENDPOINT    |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 127.0.0.1:2379 | 8e9e05c52164694d |   3.5.0 |   29 kB |      true |      false |         2 |         46 |                 46 ||
+----------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
root@fk:/data/etcds# etcdctl --endpoints=127.0.0.1:2379 endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 4.369833ms

2.12 怎么保存数据库

etcd 数据库快照指南,snapshot保存 etcd 数据库的时刻点快照:

只能从一个 etcd 节点恳求快照,因此–endpoints标志应仅包括一个端点

etcdctl --endpoints=127.0.0.1:2379 snapshot save my.db
etcdctl --endpoints=127.0.0.1:2379 snapshot save my.db
	{"level":"info","ts":1673961180.7177243,"caller":"snapshot/v3_snapshot.go:68","msg":"created temporary db file","path":"my.db.part"}
	{"level":"info","ts":1673961180.720011,"logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"}
	{"level":"info","ts":1673961180.7207196,"caller":"snapshot/v3_snapshot.go:76","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
	{"level":"info","ts":1673961180.72545,"logger":"client","caller":"v3/maintenance.go:219","msg":"completed snapshot read; closing"}
	{"level":"info","ts":1673961180.7287757,"caller":"snapshot/v3_snapshot.go:91","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"29 kB","took":"now"}
	{"level":"info","ts":1673961180.728973,"caller":"snapshot/v3_snapshot.go:100","msg":"saved","path":"my.db"}
	Snapshot saved at my.db

2.13 支撑模块

有以下常用模块:

	go.etcd.io/etcd/api/v3 - 包括界说 etcd 客户端和服务器之间通信协议的 API 界说(如原型和原型生成的库)。
	go.etcd.io/etcd/pkg/v3 - etcd 运用的实用程序包调集,不特定于 etcd 本身。一个包只有在将来或许被移出到它自己的存储库中时才归于这儿。请防止在此处增加自身有很多依靠项的代码,由于它们会自动成为客户端库的依靠项(咱们期望坚持轻量级)。
	go.etcd.io/etcd/client/v3 - 用于经过网络 (grpc) 联络 etcd 的客户端库。引荐用于 etcd 的一切新用法。
	go.etcd.io/etcd/client/v2 - 用于经过 HTTP 协议联络 etcd 的旧版客户端库。已弃用。一切新用法都应依靠于 /v3 库。
	go.etcd.io/etcd/raft/v3 - 分布式一致协议的实现。应该没有 etcd 特定代码。
	go.etcd.io/etcd/server/v3 - etcd 实现。这个包中的代码是 etcd 内部的,不该该被外部项目运用。包布局和 API 能够在非有必要版本中更改。
	go.etcd.io/etcd/etcdctl/v3 - 一个用于访问和办理 etcd 的命令行东西。
	go.etcd.io/etcd/tests/v3 - 一个包括 etcd 一切集成测验的模块。留意:一切单元测验(快速且不需求跨模块依靠)都应保存在本地模块中以供测验代码运用。
	go.etcd.io/bbolt - 耐久 b 树的实现。托管在独自的存储库中:https ://github.com/etcd-io/bbolt 。

2.14 库和东西

etcd 东西和客户端库的列表

	etcdctl - etcd 的命令行客户端
	etcd-dump - 用于转储/康复 etcd 的命令行实用程序。
	etcd-fs - 用于 etcd 的 FUSE 文件体系
	etcddir - 实时同步 etcd 和本地目录。运用 Windows 和 Linux。
	etcd-browser - 运用 AngularJS 的根据 Web 的 etcd 键/值编辑器
	etcd-lock - Master election & distributed r/w lock implementation using etcd - 支撑 v2
	etcd-console - 运用 PHP 的 etcd 的根据 Web 的键/值编辑器
	etcd-viewer - 用 Ja​​va 编写的 etcd 键值存储编辑器/检查器
	etcdtool - 将 etcd 目录导出/导入/编辑为 JSON/YAML/TOML 并运用 JSON 形式验证目录
	etcdloadtest - 用于 etcd 3.0 及更高版本的命令行负载测验客户端。
	lucas - 用于 kubernetes etcd3.0+ 集群的根据 Web 的键值检查器。
	etcd-manager - 现代、高效、多渠道且免费的 etcd 3.x GUI 和客户端东西。适用于 Windows、Linux 和 Mac。
	etcd-backup-restore - 定期增量备份和康复 etcd 的实用程序。
	etcdadm - 用于操作 etcd 集群的命令行东西。
	图书馆
	以下部分按语言列出了 etcd 客户端库。
Go
	etcd/client/v3 - 官方保护的 v3 客户端
	etcd/client/v2 - 官方保护的 v2 客户端
	go-etcd - 已弃用的官方客户端。或许对旧版本 (<2.0.0) 的 etcd 有用。
	encWrapper -encWrapper 是 etcd 客户端密钥 API/KV 的加密包装器.
Python
	kragniz/python-etcd3 - v3 客户端
	jplana/python-etcd - 支撑 v2
	russellhaering/txetcd - 一个扭曲的 Python 库
	cholcombe973/autodock - 一个 docker 布置自动化东西
	lisael/aioetcd - (Python 3.4+) Asyncio 协程客户端(支撑 v2)
	txaio-etcd - 用于 Twisted(今天)和 asyncio(未来)的异步 etcd v3-only 客户端库
	dims/etcd3-gateway - 运用 HTTP grpc 网关的 etcd v3 API 库
	aioetcd3 -(Python 3.6+)用于异步的 etcd v3 API
	Revolution1/etcd3-py -(python2.7 和 python3.5+)用于 etcd v3 的 Python 客户端,运用 gRPC-JSON-Gateway

运用 etcd 的项目

spf13/viper - Go 装备库,运用可选加密从 ENV、pflags、文件和 etcd 中读取值
go-discover - Go 中的服务发现
gleicon/goreman - 支撑 etcd 的 Go Foreman 克隆的分支
garethr/hiera-etcd - 运用 etcd 的 Puppet hiera 后端
mattn/etcd-vim - vim 内部的 SET 和 GET 键

小结

资源 怎么增加和删去成员,处理 etcd 集群成员资历的过程. member增加、删去、更新会员资历:

      https://etcd.io/docs/v3.5/tutorials/how-to-deal-with-membership/
      https://etcd.io/docs/v3.5/faq/

是否悉数客户端的恳求都发往了 etcd leader

 是根据领导者的;领导者处理一切需求集群一致的客户端恳求。
 可是,客户端不需求知道哪个节点是领导者。
 发送给跟随者的任何需求达成一致的恳求都会自动转发给领导者。不需求一致的恳求(例如,序列化读取)能够由任何集群成员处理

装备资源:

listen-<client,peer>-urls、advertise-client-urls 或 initial-advertise-peer-urls 之间有什么区别
listen-client-urls并listen-peer-urls指定 etcd 服务器绑定到的本地地址以承受传入衔接。

要侦听一切接口的端口,请指定0.0.0.0为侦听 IP 地址。

advertise-client-urls并initial-advertise-peer-urls指定 etcd 客户端。
其他 etcd 成员应该用来联络 etcd 服务器的地址。
对外地址有必要能够从长途计算机访问。
不要为生产设置发布比如localhost或之类0.0.0.0的地址,由于这些地址无法从长途计算机访问。

敞开成长之旅!这是我参加「日新方案 2 月更文应战」的第 23 天,点击检查活动详情