目录
一、简介
1. etcd是什么
2. 特点
3. 使用场景
4. 关键字
5. 工作原理
6. 获取
二、安装
1. etcd安装前的介绍
2. 安装
3. 启动
4. 创建一个etcd服务
三、ETCD的使用
一、简介
1. etcd是什么
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。
2. 特点
- 简单的接口,通过标准的HTTP API进行调用,也可以使用官方提供的 etcdctl 操作存储的数据
- 键值对存储。
- 有监听机制,可以监听特定键的变化,并作出响应
3. 使用场景
- 服务发现(Service Discovery)
- 消息发布与订阅
- 负载均衡
- 分布式通知与协调
- 分布式锁
4. 关键字
- 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来定位数据。
5. 工作原理
第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表示存储的具体日志内容
6. 获取
- etcd项目地址:https://github.com/coreos/etcd/
- etcd下载地址:https://github.com/etcd-io/etcd/releases 根据需要查找对应版本下载即可
二、安装
1. etcd安装前的介绍
- etcd在生产环境中一般推荐集群方式部署
- etcd使用的2个默认端口号:2379和2380
2379:用于客户端通信(类似于sqlserver的1433/oracle的1521/mysql的3306)
2380:用于与集群中的Peer通信- 因为etcd是go语言编写的,安装只需要下载对应的二进制文件,并放到合适的路径就行。
2. 安装
- 创建并切换到下载目录
mkdir /usr/local/mytools && cd /usr/local/mytools
- 下载
wget https://github.com/etcd-io/etcd/releases/download/v3.4.3/etcd-v3.4.3-linux-amd64.tar.gz
- 解压文件到当前目录
tar xzvf etcd-v3.4.3-linux-amd64.tar.gz
- 切换至etcd根目录,运行查看命令ls,里面会有一些文档和2个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端
cd etcd-v3.4.3-linux-amd64 && ls
- 将etcd和etcdctl二进制文件复制到/usr/local/bin目录, 这样系统中可以直接调用etcd/etcdctl这两个程序
cp etcd etcdctl /usr/local/bin
- 查看etcd版本
etcd -version
- 设置etcdctl版本(v2/v3)
注意:etct3.4.3默认使用v3命令所以步骤7可省略,之前版本此步骤不可少,例如:v3.3.10
vi /etc/profile# 最后一行指定etcdctl命令的版本为v3 export ETCDCTL_API=3# 刷新环境变量 source /etc/profile #查看当前etcdctl的版本信息 #v2版本命令和v3命令是不一样的,例如: #v2查看版本号 etcdctl -version或 etcdctl -v #v3查看版本号 etcdctl version # 更多命令帮助可以查询 etcdctl --help
环境变量配置示意图:
3. 启动
输入命令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
4. 创建一个etcd服务
- 建立etcd相关目录(即数据文件和配置文件的保存位置)
/etc目录是整个Linux系统的中心,其中包含所有系统管理和维护方面的配置文件,所以etcd的配置也放在这里mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd/
- 进入/etc/etcd/,上传etcd.conf
vim /etc/etcd/etcd.conf内容: # 节点名称 ETCD_NAME="etcd0" # 指定数据文件存放位置 ETCD_DATA_DIR="/var/lib/etcd/"
- 进入/etc/systemd/system/,上传etcd.service
vim /etc/systemd/system/etcd.service[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target ## 对于那些严格要求 必须存在真实可用的网络连接的单元, ## 应该在其单元文件中包含 Wants=network-online.target ## 与 After=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
- 启动/停止/查看etcd服务
## 1.重新加载systemd服务 systemctl daemon-reload## 2.设置开机自启动 systemctl enable etcd ## 3.启动etcd systemctl start etcd## 4.查看etcd运行状态 systemctl status etcd## 5.停止服务 systemctl stop etcd## 6.重启etcd systemctl restart etcd
三、ETCD的使用
1. 如何获取帮助
etcdctl -h
2. put
支持的选项包括
--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为0)则永不超时
--swap-with-value value 若该键现在的值是value,则进行设置操作
--swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作etcdctl put /testdir/testkey "Hello world"
3. get
-sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性。etcdctl get /testdir/testkey
4. del
# 清空数据 etcdctl del / --prefix#删除所有/test前缀的节点 etcdctl del /test --prefix
5. watch
#1. 增加一个key,(客户端窗口1) etcdctl put key1 "hello"#2. 打开一个新的客户端窗口2,监听key1的变化 etcdctl watch key1#3. 回到窗口1,向key1 中put新值 etcdctl put key1 "hello work"# 4. 此时可以在窗口2中看到监听输出# 查看版本信息 curl http://127.0.0.1:2379/version