etcd的部署和简单使用

一、什么是etcd

etcd 是一个高可用的分布式 KV 系统,可以用来实现各种分布式协同服务。etcd 采用的一致性算
法是 raft,基于 Go 语言实现。
etcd 最初由 CoreOS 的团队研发,目前是 Could Native 基金会的孵化项目。
为什么叫 etcd:etc来源于 UNIX 的 /etc 配置文件目录,d 代表 distributed system。

二、etcd的应用场景

典型应用场景:
• Kubernetes 使用 etcd 来做服务发现和配置信息管理。
• Openstack 使用 etcd 来做配置管理和分布式锁。
• ROOK 使用 etcd 研发编排引擎。
etcd 和 ZooKeeper 覆盖基本一样的协同服务场景。ZooKeeper 因为需要把所有的数据都要加载
到内存,一般存储几百MB的数据。etcd使用bbolt存储引擎,可以处理几个GB的数据。

三、MVCC

etcd 的数据模型是 KV模型,所有的 key 构成了一个扁平的命名空间,所有的 key 通过字典序排序。
整个 etcd 的 KV 存储维护一个递增的64位整数。etcd 使用这个整数位为每一次 KV 更新分配一个 revision。每一个
key 可以有多个 revision。每一次更新操作都会生成一个新的 revision。删除操作会生成一个 tombstone 的新的
revision。如果 etcd 进行了 compaction,etcd 会对 compaction revision 之前的 key-value 进行清理。整个
KV 上最新的一次更新操作的 revision 叫作整个 KV 的 revision。

etcd的部署和简单使用_第1张图片

CreateRevision 是创建 key 的 revision;

ModRevsion 是更新 key 值的 revision;

Version 是 key 的版本号,从1 开始。

四、etcd数据存储

  • etcd 使用 bbolt 进行 KV 的存储。bbolt 使用持久化的 B+-tree 保存 key-value 。三元组(major、sub、type)是 B+-tree 的 key,major 是的 revision,sub 用来区别一次更新中的各个 key,type 保存可选的特殊值(例如 type 取值为 t 代表这个三元组对应的是一个tombstone)。这样做的目的是为加速某一个 revision 上的 range 查找。
  • 另外 etcd 还维护一个 in-memory 的 B-tree 索引,这个索引中的 key 是 key-value 中的key 。

五、etcd的部署

以下列出的是linux下安装3.3.13版本的etcd

下载链接:https://github.com/etcd-io/etcd/releases/download/v3.3.13/etcd-v3.3.13-linux-amd64.tar.gz

具体操作:

# 在当前目录下创建一个本地目录 {etcd-dir} 
mkdir -p etcd/
cd etcd/
# 下载etcd
wget https://github.com/etcd-io/etcd/releases/download/v3.3.13/etcd-v3.3.13-linux-amd64.tar.gz
# 把etcd压到一个本地目录 {etcd-dir} 
tar -zxvf etcd-v3.3.13-linux-amd64.tar.gz
# 把 {etcd-dir} 加到 PATH 环境变量。
export PATH=$PATH:/root/etcd/etcd-v3.3.13-linux-amd64

# 创建一个目录 {db-dir} 用来保存 etcd 的数据文件。
mkdir -p etcd-db/
cd etcd-db/

# 使用最新的 v3 API
export ETCDCTL_API=3

# 查看etcd版本
etcd -version

etcd Version: 3.3.13
Git SHA: 98d3084
Go Version: go1.10.8
Go OS/Arch: linux/amd64
# 启动etcd,在 {db-dir} 目录运行 etcd 启动 etcd 服务
etcd

2022-05-03 22:56:08.196843 I | etcdmain: etcd Version: 3.3.13
2022-05-03 22:56:08.196884 I | etcdmain: Git SHA: 98d3084
2022-05-03 22:56:08.196888 I | etcdmain: Go Version: go1.10.8
2022-05-03 22:56:08.196892 I | etcdmain: Go OS/Arch: linux/amd64
2022-05-03 22:56:08.196896 I | etcdmain: setting maximum number of CPUs to 1, to                                                                             tal number of available CPUs is 1
2022-05-03 22:56:08.196905 W | etcdmain: no data-dir provided, using default dat                                                                             a-dir ./default.etcd
2022-05-03 22:56:08.197222 I | embed: listening for peers on http://localhost:23                                                                             80
2022-05-03 22:56:08.197291 I | embed: listening for client requests on localhost                                                                             :2379
2022-05-03 22:56:08.201559 I | etcdserver: name = default
2022-05-03 22:56:08.201570 I | etcdserver: data dir = default.etcd
2022-05-03 22:56:08.201575 I | etcdserver: member dir = default.etcd/member
2022-05-03 22:56:08.201578 I | etcdserver: heartbeat = 100ms
2022-05-03 22:56:08.201581 I | etcdserver: election = 1000ms
2022-05-03 22:56:08.201584 I | etcdserver: snapshot count = 100000
2022-05-03 22:56:08.201591 I | etcdserver: advertise client URLs = http://localh                                                                             ost:2379
2022-05-03 22:56:08.201595 I | etcdserver: initial advertise peer URLs = http://                                                                             localhost:2380
2022-05-03 22:56:08.201601 I | etcdserver: initial cluster = default=http://loca                                                                             lhost:2380
2022-05-03 22:56:08.205173 I | etcdserver: starting member 8e9e05c52164694d in c                                                                             luster cdf818194e3a8c32
2022-05-03 22:56:08.205210 I | raft: 8e9e05c52164694d became follower at term 0
2022-05-03 22:56:08.205224 I | raft: newRaft 8e9e05c52164694d [peers: [], term:                                                                              0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2022-05-03 22:56:08.205228 I | raft: 8e9e05c52164694d became follower at term 1
2022-05-03 22:56:08.210992 W | auth: simple token is not cryptographically signe                                                                             d
2022-05-03 22:56:08.214150 I | etcdserver: starting server... [version: 3.3.13,                                                                              cluster version: to_be_decided]
2022-05-03 22:56:08.215983 I | etcdserver: 8e9e05c52164694d as single-node; fast                                                                             -forwarding 9 ticks (election ticks 10)
2022-05-03 22:56:08.216449 I | etcdserver/membership: added member 8e9e05c521646                                                                             94d [http://localhost:2380] to cluster cdf818194e3a8c32
2022-05-03 22:56:09.205424 I | raft: 8e9e05c52164694d is starting a new election                                                                              at term 1
2022-05-03 22:56:09.205458 I | raft: 8e9e05c52164694d became candidate at term 2
2022-05-03 22:56:09.205472 I | raft: 8e9e05c52164694d received MsgVoteResp from                                                                              8e9e05c52164694d at term 2
2022-05-03 22:56:09.205484 I | raft: 8e9e05c52164694d became leader at term 2
2022-05-03 22:56:09.205490 I | raft: raft.node: 8e9e05c52164694d elected leader                                                                              8e9e05c52164694d at term 2
2022-05-03 22:56:09.205918 I | etcdserver: setting up the initial cluster versio                                                                             n to 3.3
2022-05-03 22:56:09.205982 I | etcdserver: published {Name:default ClientURLs:[h                                                                             ttp://localhost:2379]} to cluster cdf818194e3a8c32
2022-05-03 22:56:09.206092 E | etcdmain: forgot to set Type=notify in systemd se                                                                             rvice file?
2022-05-03 22:56:09.206100 I | embed: ready to serve client requests
2022-05-03 22:56:09.206620 N | embed: serving insecure client requests on 127.0.                                                                             0.1:2379, this is strongly discouraged!
2022-05-03 22:56:09.207222 N | etcdserver/membership: set the initial cluster ve                                                                             rsion to 3.3
2022-05-03 22:56:09.207262 I | etcdserver/api: enabled capabilities for version                                                                              3.3
proto: no coders for int
proto: no encoder for ValueSize int [GetProperties]

六、使用etcd

新打开一个终端窗口执行:

[**@** {etcd-dir}]# ./etcdctl put foo bar
OK
[**@** {etcd-dir}]# ./etcdctl get foo
foo
bar
[**@** {etcd-dir}]# ./etcdctl del foo
1
[**@** {etcd-dir}]# ./etcdctl put one 1
OK
[**@** {etcd-dir}]# ./etcdctl put two 1
OK
[**@** {etcd-dir}]# ./etcdctl put three 3
OK
# etcdctl get“”--prefix=true 可以用来扫描 etcd 的所有数据。
# etcdctl del“”--prefix=true 可以用来删除 etcd 中的所有数据。
[**@** {etcd-dir}]# ./etcdctl get "" --prefix=true
one
1
three
3
two
1
[**@** {etcd-dir}]# ./etcdctl del "" --prefix=true
3

HTTP API
[**@** {etcd-dir}]# curl -L http://localhost:2379/v3beta/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'
{"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"8","raft_term":"2"}}[**@** {etcd-dir}]#
[**@** {etcd-dir}]# ./etcdctl get "" --prefix=true                                                                                  
foo
bar
[**@** {etcd-dir}]# curl -L http://localhost:2379/v3beta/kv/range -X POST -d '{"key": "Zm9v", "value": "YmFy"}'
{"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437                                                                             ","revision":"8","raft_term":"2"},"kvs":[{"key":"Zm9v","create_revision":"8","mo                                                                             d_revision":"8","version":"1","value":"YmFy"}],"count":"1"}

etcd的部署和简单使用_第2张图片
 

Zm9v 是 foo 的 base64 编码, YmFy 是 bar 的 base64 编码。

和 etcdctl 相比,etcd HTTP
API 返回的数据更多,可以帮助我们学习 etcd API 的行为。
 

你可能感兴趣的:(Kubernetes,实验手册,云原生,etcd,数据库,database)