1.etcd介绍
1.1 什么是etcd
etcd的官方定义如下:
A distributed, reliable key-value store for the most critical data of
distributed system
etcd是一个Go语言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值(key
value)存储、配置共享和服务发现等功能。
官网:etcd官网
文档:文档地址
1.2 etcd的应用场景
分布式系统中的数据分为控制数据和应用数据。etcd的使用场景默认处理的数据都是控制数据,对于
应用数据,只推荐数据量很小,但是更新访问频繁的情况。常见的etcd使用场景包括:服务发现、分
布式锁、分布式队列、分布式通知和协调、主备选举等。
1.3为什么使用etcd
与ZooKeeper相比,etcd更简单,安装、部署和使用更加容易,并且etcd的某些功能是ZooKeeper所
没有的。因此,在很多场景下,etcd比ZooKeeper更受用户的青睐,具体表现在如下几个方面:
- etcd更加稳定可靠,它的唯一目标就是把分布式一致性KV存储做到极致,所以它更注重稳定 性和扩展性。
- 在服务发现的实现上,etcd使用的是节点租约(Lease),并且支持Group(多key):而ZooKeeper使用的是临时节点,临时节点存在不少的问题。
- etcd支持稳定的watch,而不是ZooKeeper一样简单的单次触发(onetimetrigger)watch 因为在微服务的环境下,通过调度系统的调度,一个服务随时可能会下线,也可能为应对临时访问压力而增加新的服务节点,而很多调度系统是需要得到完整节点历史记录的,在这方面,etcd可以存储数十万个历史变更。
- etcd支持MVCC(多版本并发控制),因为有协同系统需要无锁操作。
- etcd支持更大的数据规模,支持存储百万到千万级别的key。
- 相比ZooKeeper,etcd的性能更好。在一个由3台8核节点组成的云服务器上,etcdv3版本
可以做到每秒数万次的写操作和数十万次的读操作,
2.etcd实战
2.1 etcd环境搭建
对于搭建开发和测试环境,最简单和快捷的方式是在本地部署一个单机版或集群版的etcd环境。
单实例etcd部署
etcd社区提供了编译好的etcd服务器和客户端的二进制文件以下载
wget https://github.com/etcd-io/etcd/releases/download/v3.5.13/etcd-v3.5.13-linux-amd64.tar.gz
tar -zxvf etcd-v3.5.13-linux-amd64.tar.gz
cd etcd-v3.5.13-linux-amd64
#启动etcd服务
./etcd
#后台启动etcd,日志文件输出到/tmp/etcd.log目录
nohup./etcd>/tmp/etcd.log 2>&1 &
#查看etcd版本
./etcd-version
#将etcd和etcdctl复制到/usr/local/bin目录,系统中可以直接调用etcd/etcdctl
cp etcd etcdctl/usr/local/bin
2.2单机多实例etcd部署
etcdserver默认使用2380端口监听集群中其他server的请求,但是如果在同一台机器上有多个
etcdserver都在同一个端口上监听,那么会导致端口冲突。作为示例,我们分别让3个etcdserver
监听在12380、22380、32380端口上。
我们可以通过进程管理工具goreman,快速创建、停止本地的多节点etcd集群
#安装goreman,依赖go环境
go install github.com/mattn/goreman@latest
goreman help
利用goreman创建3节点etcd集群
编写local-cluster-profile文件
etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http:///127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new
etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http:///127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new
etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http:///127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new