etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库.
etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现
那么这个etcd用在哪呢?
etcd作为服务发现系统,有以下的特点:
etcd项目地址:https://github.com/coreos/etcd/
etcd下载地址:https://github.com/etcd-io/etcd/releases 根据需要查找对应版本下载即可
1.服务发现(重点)
服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,
即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接
在通俗点就是我们消费者去掉生产者的服务的时候 生产者在哪里部署在哪个服务上面我们都不知道
这个时候就需要我们去找到这个服务,它能让你远程调用的时候性能特别快
2.消息发布与订阅
3.负载均衡
4.分布式通知与协调
5.分布式锁
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来定位数据。
从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节点,以确认数据提交;最后,进行数据提交,再次同步
1.etcd在生产环境中一般推荐集群方式部署
2.etcd使用的2个默认端口号:2379和2380
2379:用于客户端通信(类似于sqlserver的1433/oracle的1521/mysql的3306)
客户端与
2380:用于与集群中的Peer通信 集群与集群通讯就需要2380这个端口
3.因为etcd是go语言编写的,安装只需要下载对应的二进制文件,并放到合适的路径就行。
第一步:下载并安装
1.创建并切换到下载目录
2.直接下载速度太慢,建议提前下载安装包再用rz上传
3.解压文件到当前目录
4.切换至etcd根目录,运行查看命令ls,里面会有一些文档和2个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端
5.将etcd和etcdctl二进制文件复制到/usr/local/bin目录,why?这样系统中可以直接调用etcd/etcdctl这两个程序
6.查看etcd版本
注意:etct3.4.3默认使用v3命令所以步骤7可省略,之前版本此步骤不可少,例如:v3.3.10
7.编辑环境变量,设置etcdctl版本(v2/v3)
vi /etc/profile
最后一行指定etcdctl命令的版本为v3
export ETCDCTL_API=3
刷新配置文件
source /etc/profile
8.证明etcd安装成功
#v3查看版本号
etcdctl version
v2查看版本号
etcdctl -version或 etcdctl -v
注意:etct3.4.3默认使用v3命令所以步骤7可省略,之前版本此步骤不可少,例如:v3.3.10
9.更多命令帮助可以查询
etcdctl --help
注1:重要注意事项,etcd版本不一样,命令是不一样,但可以通过etcdctl --help命令查看变化
第二步.测试,输入命令etcd,即可启动一个单节点的etcd服务,ctrl+c即可停止服务
etcd
etcd服务启动成功后,控制台会输出很多信息,重要的几个参数说明如下:
注2:采用这种方式启动的etcd只是一个程序,如果启动etcd的窗口被关闭的话则etcd便会被关闭,所以如果要长期使用的话最好是为etcd开启一个服务,在后台运行
三.创建一个etcd服务
1.建立etcd相关目录(即数据文件和配置文件的保存位置)
/etc目录是整个Linux系统的中心,其中包含所有系统管理和维护方面的配置文件,所以etcd的配置也放在这里
2.创建etcd配置文件
vim /etc/etcd/etcd.conf
(#) 节点名称
ETCD_NAME=“etcd0”
(#) 指定数据文件存放位置
ETCD_DATA_DIR="/var/lib/etcd/"
3.创建systemd配置文件
vim /etc/systemd/system/etcd.service
[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服务**
1.设置开机自启动
2.重新加载systemd服务
3.启动etcd
4.查看etcd运行状态
5.停止服务
6.重启etcd
至此单机版etcd安装及测试成功成功,但如果启动失败,可通过如下两个命令查看原因
查看etcd服务状态
ystemctl status etcd.service
日志查看命令
journalctl -xe
etcdctl是一个命令行客户端,可以对etcd服务进行测试或者手动修改数据库内容。另外,etcdctl还支持HTTP API(之后介绍)。
etcdctl支持的命令大体上分为数据库操作和非数据库操作两类
1.数据库操作
数据库操作围绕对键值和目录的CRUD完整生命周期的管理
etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如:testkey,
此时实际上放在根目录/下面,也可以为指定目录结构,如/cluster1/node2/testkey,则将创建相应的目录结构
0.帮助命令
1.put
指定某个键的值。例如
##控制台输出
Hello world
支持的选项包括
–ttl ‘0’ 该键值的超时时间(单位为秒),不配置(默认为0)则永不超时
–swap-with-value value 若该键现在的值是value,则进行设置操作
–swap-with-index ‘0’ 若该键现在的索引值是指定索引,则进行设置操作
2.get
获取指定键的值。例如:
支持的选项为:
–sort 对结果进行排序
-consistent 将请求发给主节点,保证获取内容的一致性。
3.del
清空数据
删除所有/xx前缀的节点
4.其它命令
update/rm/mk/mkdir/setdir/updatedir/rmdir/ls/
1.非数据库操作
非数据库操作包括:备份、监测、节点管理等
2.backup
备份etcd的数据
3.watch
监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
4.在一个终端运行
etcdctl watch key1
5.在第2个终端运行put/get/del命令
etcdctl put key1 “zzz”
etcdctl get key1 #因为get操作值无变化,所以watch命令是没有任何反应的
etcdctl del key1
6.exec-watch
监测一个键值的变化,一旦键值发生更新,就执行给定命令
7.member
通过list、add、remove命令列出、添加、删除etcd实例到etcd集群中
8.查看版本
curl http://127.0.0.1:2379/version