敞开成长之旅!这是我参加「日新方案 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 - 用 Java 编写的 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 天,点击检查活动详情