目录
1. Etcd是什么?
2. Etcd应用场景
3. Etcd关键词
4. Etcd工作原理
5、安装(单节点)
5.1 下载并安装
5.2 测试
5.3 创建一个etcd服务
6、Etcd基本使用
6.1.数据库操作
6.2 非数据库操作
1. Etcd是什么?
Etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 Etcd内部采用raft协议作为一致性算法,Etcd基于Go语言实现。
etcd | ETCD中文网站
Etcd作为服务发现系统,有以下的特点: 1.简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单。 2.安全:支持SSL证书验证。 3.快速:根据官方提供的benchmark数据,单实例支持每秒2k 读操作。 4.可靠:采用raft算法,实现分布式系统数据的可用性和一致性。 etcd项目地址:https://github.com/coreos/etcd/。 etcd下载地址:https://github.com/etcd-io/etcd/releases 根据需要查找对应版本下载即可。
2. Etcd应用场景
1.服务发现(重点) 服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一, 即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。
2.消息发布与订阅 3.负载均衡 4.分布式通知与协调 5.分布式锁
注1:etcd可以理解成springcloud中的注册中心,用于服务注册和发现 。 注2:Kubernetes: 将docker集群的配置信息存储到etcd中,用于服务发现和集群管理; 2.1 Etcd 的一致性对于正确安排和运行服务至关重要。 2.2 Kubernetes API 服务器将群集状态持久化在 etcd 中。它使用etcd的 watch API监视集群,并发布关键的配置更改。
3. Etcd关键词
Raft:etcd所采用的保证分布式系统强一致性的算法。 Node:一个Raft状态机实例。 Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。 Cluster:由多个Member构成可以协同工作的etcd集群。 Peer:对同一个etcd集群中另外一个Member的称呼。 Client: 向etcd集群发送HTTP请求的客户端。 WAL:预写式日志,etcd用于持久化存储的日志格式。 snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态。 Proxy:etcd的一种模式,为etcd集群提供反向代理服务。 Leader(领导者):Raft算法中通过竞选而产生的处理所有数据提交的节点。 Follower(跟随者):竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。 Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选。 Term:某个节点成为Leader到下一次竞选开始的时间周期,称为一个Term。 Index:数据项编号。Raft中通过Term和Index来定位数据。
4. Etcd工作原理
从Etcd的架构图中我们可以看到,Etcd主要分为四个部分: 第1部分是HTTP Server: 用于处理用户发送的API请求,以及其它etcd节点的同步与心跳信息请求。 第2部分是Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是Etcd对用户提供的大多数API功能的具体实现。 第3部分是Raft:Raft强一致性算法的具体实现,是Etcd的核心。 第4部分是WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。 在WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。
通常,一个用户的请求发送过来,会经由HTTP Server转发给Store,以进行具体的事务处理。如果涉及到节点修改,则交给Raft模块进行状态变更、日志记录; 然后,再同步给别的etcd节点,以确认数据提交;最后,进行数据提交,再次同步。
5、安装(单节点)
5.1 下载并安装
1.创建并切换到下载目录。
代码语言:javascript复制mkdir /usr/local/mytools && cd /usr/local/mytools
2.直接下载速度太慢,建议提前下载安装包再用rz上传。
https://github.com/etcd-io/etcd/releases/download/v3.4.3/etcd-v3.4.3-linux-amd64.tar.gz
https://github.com/etcd-io/etcd/releases/download/v3.4.3/etcd-v3.4.3-linux-amd64.tar.gz
3.解压文件到当前目录 。
代码语言:javascript复制tar xzvf etcd-v3.4.3-linux-amd64.tar.gz
4.切换至etcd根目录,运行查看命令ls,里面会有一些文档和2个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端 。
代码语言:javascript复制cd etcd-v3.4.3-linux-amd64 && ls
5.将etcd和etcdctl二进制文件复制到/usr/local/bin目录,why?这样系统中可以直接调用etcd/etcdctl这两个程序。
代码语言:javascript复制 cp etcd etcdctl /usr/local/bin
6.查看etcd版本。
代码语言:javascript复制 etcd --version
注:注意:etct3.4.3默认使用v3命令所以步骤7可省略,之前版本此步骤不可少,例如:v3.3.10
7.设置etcdctl版本(v2/v3)。
7.1 编辑环境变量。
代码语言:javascript复制vi /etc/profile
7.2 最后一行指定etcdctl命令的版本为v3。
代码语言:javascript复制export ETCDCTL_API=3
7.3 刷新环境变量。
代码语言:javascript复制source /etc/profile
7.4 查看当前etcdctl的版本信息,v2版本命令和v3命令是不一样的,例如:v2查看版本号。
代码语言:javascript复制etcdctl -version或 etcdctl -v
v3查看版本号
代码语言:javascript复制etcdctl version
7.6 更多命令帮助可以查询
代码语言:javascript复制etcdctl --help
注:重要注意事项,etcd版本不一样,命令是不一样,但可以通过etcdctl --help命令查看变化。
5.2 测试
输入命令etcd,即可启动一个单节点的etcd服务,ctrl c即可停止服务 。
Etcd服务启动成功后,控制台会输出很多信息,重要的几个参数说明如下: 1.name表示节点名称,默认为default。 2.data-dir 保存日志和快照的目录,默认为当前工作目录default.etcd/目录下。 3.在http://localhost:2380和集群中其他节点通信。 4.在http://localhost:2379提供客户端交互。 5.heartbeat为100ms,该参数的作用是leader多久发送一次心跳到followers,默认值是 100ms。 6.election为1000ms,该参数的作用是重新投票的超时时间,如果follow在该时间间隔没 有收到心跳包,会触发重新投票,默认为1000ms。 7.snapshot count为10000,该参数的作用是指定有多少事务被提交时,触发截取快照保 存到磁盘。 8.集群和每个节点都会生成一个uuid。 9.启动的时候会运行raft,选举出leader 请注意,采用这种方式启动的etcd只是一个程序,如果启动etcd的窗口被关闭的话则etcd便会被关闭,所以如果要长期使用的话最好是为etcd开启一个服务,在后台运行。
5.3 创建一个etcd服务
1.建立Etcd相关目录(即数据文件和配置文件的保存位置)。
代码语言:javascript复制/etc目录是整个Linux系统的中心,其中包含所有系统管理和维护方面的配置文件,所以etcd的配置也放在这里。
mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd/
2.创建etcd配置文件。
代码语言:javascript复制vim /etc/etcd/etcd.conf
代码语言:javascript复制# 节点名称
ETCD_NAME="etcd0"
# 指定数据文件存放位置
ETCD_DATA_DIR="/var/lib/etcd/"
3.创建systemd配置文件。
代码语言:javascript复制 vim /etc/systemd/system/etcd.service
代码语言:javascript复制[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
User=root
Type=notify
WorkingDirectory=/var/lib/etcd/
## 根据实际情况修改EnvironmentFile和ExecStart这两个参数值
## 1.EnvironmentFile即配置文件的位置,注意“-”不能少
EnvironmentFile=-/etc/etcd/etcd.conf
## 2.ExecStart即etcd启动程序位置
ExecStart=/usr/local/bin/etcd
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
4.启动/停止/查看etcd服务
4.1.重新加载systemd服务
代码语言:javascript复制systemctl daemon-reload
4.2.设置开机自启动
代码语言:javascript复制systemctl enable etcd
4.3.启动etcd
代码语言:javascript复制systemctl start etcd
4.4.查看etcd运行状态
代码语言:javascript复制systemctl status etcd
4.5.停止服务
代码语言:javascript复制systemctl stop etcd
4.6.重启etcd
代码语言:javascript复制 systemctl restart etcd
至此单机版etcd安装及测试成功成功,但如果启动失败,可通过如下两个命令查看原因 systemctl status etcd.service 详细查看命令 journalctl -xe
6、Etcd基本使用
Etcdctl是一个命令行客户端,可以对etcd服务进行测试或者手动修改数据库内容。另外,etcdctl还支持HTTP API(之后介绍)。 Etcdctl支持的命令大体上分为数据库操作和非数据库操作两类。
6.1.数据库操作
数据库操作围绕对键值和目录的CRUD完整生命周期的管理。 Etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如:testkey,此时实际上放在根目录/下面,也可以为指定目录结构,如/cluster1/node2/testkey,则将创建相应的目录结构
1.帮助命令
代码语言:javascript复制 etcdctl -h
2.put:指定某个键的值。
代码语言:javascript复制 etcdctl put /testdir/testkey "Hello world"
3.get :获取指定键的值。
代码语言:javascript复制etcdctl get /testdir/testkey
4.del:清空数据
代码语言:javascript复制 etcdctl del / --prefix
删除所有/test前缀的节点
代码语言:javascript复制etcdctl del /test --prefix
5.其它命令
update/rm/mk/mkdir/setdir/updatedir/rmdir/ls/
6.2 非数据库操作
非数据库操作包括:备份、监测、节点管理等
1.backup 备份etcd的数据 2.watch
监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
2.1.在一个终端运行
代码语言:javascript复制etcdctl watch key1
2.2.在第2个终端运行put/get/del命令
代码语言:javascript复制 etcdctl put key1 "zzz"
因为get操作值无变化,所以watch命令是没有任何反应的
代码语言:javascript复制 etcdctl get key1
代码语言:javascript复制 etcdctl del key1
2.3.exec-watch 监测一个键值的变化,一旦键值发生更新,就执行给定命令 4.member 通过list、add、remove命令列出、添加、删除etcd实例到etcd集群中