001.etcd简介及单节点使用
Posted IT中国人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了001.etcd简介及单节点使用相关的知识,希望对你有一定的参考价值。
一 etcd简介
1.1 概述
etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。
特点:
- 简单:支持 REST 风格的 HTTP+JSON API
- 安全:支持 HTTPS 方式的访问
- 快速:支持并发 1k/s 的写操作
- 可靠:支持分布式结构,基于 Raft 的一致性算法
延伸:ZooKeeper 是一套分布式系统中进行同步和一致性管理的工具,doozer 则是一个一致性分布式数据库。Raft 是一套通过选举主节点来实现分布式系统一致性的算法。
1.2 交互
etcd 对外通过 HTTP API 对外提供服务,这种方式方便测试(通过 curl 或者其他工具就能和 etcd 交互),也很容易集成到各种语言中(每个语言封装 HTTP API 实现自己的 client 就行)。
1.3 应用场景
一般情况下,用户使用 etcd 可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的 etcd 实例将会保持彼此信息的一致性。
提示:更多使用场景见《002.etcd使用场景》。
二 etcd安装及运行
2.1 下载并解压
1 [root@etcdhost ~]# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz 2 [root@etcdhost ~]# tar xzvf etcd-v3.3.9-linux-amd64.tar.gz 3 [root@etcdhost ~]# cd etcd-v3.3.9-linux-amd64/ 4 [root@etcdhost etcd-v3.3.9-linux-amd64]# ls 5 [root@etcdhost etcd-v3.3.9-linux-amd64]# cp etcd* /usr/local/bin/
提示: etcd为服务主文件,etcdctl为命令客户端,etcd-migrate负责进行迁移。
提示:二进制文件及源码https://github.com/coreos/etcd。
也可使用yum安装:
1 [root@etcdhost ~]# yum -y install etcd
使用yum安装其默认配置文件为:/etc/etcd/etcd.conf
2.2 etcd运行
1 [root@etcdhost ~]# etcd
三 etcd日常使用
3.1 etcd常见命令
1 [root@etcdhost ~]# etcdctl set myname "xianghongying" #设置键值 2 xianghongying 3 [root@etcdhost ~]# etcdctl get myname #获取键值 4 xianghongying 5 [root@etcdhost ~]# curl -L http://localhost:2379/v2/keys/myname #通过HTTP API获取
3.2 etcd数据库操作
数据库操作围绕对键值和目录的 CRUD (符合 REST 风格的一套操作:Create)完整生命周期的管理。
etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如 myname,此时实际上放在根目录 / 下面,也可以为指定目录结构,如 cluster1/node2/testkey,则将创建相应的目录结构。
提示:CRUD 即 Create, Read, Update, Delete,是符合 REST 风格的一套 API 操作。
- 创建键值
1 [root@etcdhost ~]# etcdctl set /etcdb/myself/name "Xiang HongYing" 2 选项: 3 --ttl \'0\' #该键值的超时时间(单位为秒),不配置(默认为 0)则永不超时 4 --swap-with-value value #若该键现在的值是 value,则进行设置操作 5 --swap-with-index \'0\' #若该键现在的索引值是指定索引,则进行设置操作
- 获取键值
1 [root@etcdhost ~]# etcdctl get /etcdb/myself/name 2 选项: 3 --sort #对结果进行排序 4 --consistent #将请求发给主节点,保证获取内容的一致性
- 获取键值,包含更详细的元数据
1 [root@etcdhost ~]# etcdctl get -o extended /etcdb/myself/name
- 设置TTL
获取ttl,过期后会自动删除
1 [root@etcdhost ~]# etcdctl set /etcdb/myself/name --ttl 5
- 更新键值
1 [root@etcdhost ~]# etcdctl update /etcdb/myself/name "Xiao XianNv" 2 [root@etcdhost ~]# etcdctl get /etcdb/myself/name 3 选项: 4 --ttl \'0\' #超时时间(单位为秒),不配置(默认为 0)则永不超时
- 条件更新键值
如果/etcdb/myself/name键值为"Xiao XianNv",则更新为"Xiang HongYing"
1 [root@etcdhost ~]# etcdctl set --swap-with-value "Xiao XianNv" /etcdb/myself/name "Xiang HongYing"
- 更新ttl
1 [root@etcdhost ~]# etcdctl update --ttl 3 /etcdb/myself/name "Xiao XianNv"
- 删除键值
1 [root@etcdhost ~]# etcdctl rm /etcdb/myself/name 2 选项: 3 --dir #如果键是个空目录或者键值对则删除 4 --recursive #删除目录和所有子键 5 --with-value #检查现有的值是否匹配 6 --with-index \'0\' #检查现有的 index 是否匹配
- 条件删除键值
1 [root@etcdhost ~]# etcdctl rm --with-value "Xiao XianNv" /etcdb/myself/name
- 条件创建键值
1 [root@etcdhost ~]# etcdctl mk /etcdb/myself/age "25"
若设置的键不存在,则创建一个新的键值,当键存在的时候,执行该命令会报错。
选项:
1 --ttl \'0\' #超时时间(单位为秒),不配置(默认为 0)则永不超时
- 自动创建排序的 key
1 [root@etcdhost ~]# etcdctl mk --in-order /etcdb/myself/member zhangsan 2 [root@etcdhost ~]# etcdctl mk --in-order /etcdb/myself/member lisi
- 创建目录
1 [root@etcdhost ~]# etcdctl setdir testetcd2 2 选项: 3 --ttl \'0\' #超时时间(单位为秒),不配置(默认为 0)则永不超时
创建一个键目录,无论存在与否。
- 更新目录
1 [root@etcdhost ~]# etcdctl updatedir testetcd2 2 --ttl \'0\' #超时时间(单位为秒),不配置(默认为 0)则永不超时
- 条件创建目录
若设置的键不存在,则创建一个新的键值,当键存在的时候,执行该命令会报错。
1 [root@etcdhost ~]# etcdctl mkdir testetcd 2 选项: 3 --ttl \'0\' #超时时间(单位为秒),不配置(默认为 0)则永不超时
- 删除空目录或键值
1 [root@etcdhost ~]# etcdctl rmdir /testetcd2 #删除非空目录 2 [root@etcdhost ~]# etcdctl rmdir /etcdb/myself 3 Error: 108: Directory not empty (/etcdb/myself) [16] 4 [root@etcdhost ~]# etcdctl get /etcdb/myself/age #删除键值
提示:若目录不空,会报错。
- 列出目录或键
1 [root@etcdhost ~]# etcdctl ls 2 [root@etcdhost ~]# etcdctl ls etcdb
1 选项: 2 --sort #将输出结果排序 3 --recursive #如果目录下有子目录,则递归输出其中的内容 4 -p #对于输出为目录,在最后添加 `/` 进行区分
提示:列出目录(默认为根目录)下的键或者子目录,默认不显示子目录中内容。
3.3 非数据库操作
- 备份etcd数据库
1 [root@etcdhost ~]# etcdctl backup --data-dir /var/lib/etcd/default.etcd --backup-dir /tmp 2 选项: 3 --data-dir #etcd 的数据目录 4 --backup-dir #备份到指定路径
提示:etcd默认数据文件保存路径为:/var/lib/etcd/default.etcd。
- 监控键值
监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。
1 [root@etcdhost ~]# etcdctl watch /etcdb/myself/name 2 [root@etcdhost ~]# etcdctl set /etcdb/myself/name "Xiang HongYing" 3 [root@etcdhost ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
选项:
1 --forever #一直监测,直到用户按 `CTRL+C` 退出 2 --after-index \'0\' #在指定 index 之前一直监测 3 --recursive #返回所有的键值和子键值
- 条件监控键值
1 [root@etcdhost ~]# etcdctl exec-watch /etcdb/myself/name -- sh -c \'etcdctl ls\' 2 [root@etcdhost ~]# etcdctl set /etcdb/myself/name "Xiang HongYing" 3 [root@etcdhost ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
监测一个键值的变化,一旦键值发生更新,就执行给定命令。
1 选项: 2 --after-index \'0\' #在指定 index 之前一直监测 3 --recursive #返回所有的键值和子键值
- 一直监控
一直监听,除非 `CTL + C` 导致退出监听
1 [root@etcdhost ~]# etcdctl watch --forever /etcdb/myself/name
3.4 成员管理
- 查看成员
1 [root@etcdhost ~]# etcdctl member list
- 添加成员
1 [root@etcdhost ~]# etcdctl member add node2 http://172.24.8.101:2380
- 删除成员
1 [root@etcdhost ~]# etcdctl member remove 8e9e05c52164694d
- 更新成员peerURLS
1 [root@etcdhost ~]# etcdctl member update node2 http://172.24.8.102:2380
四 其他命令
1 [root@etcdhost ~]# etcdctl cluster-health #集群健康检查 2 [root@etcdhost ~]# etcdctl --version #查看etcd版本 3 [root@etcdhost ~]# etcdctl --help #获取帮助 4 [root@etcdhost ~]# etcdctl cluster-health #查看集群状态
- --debug #输出 cURL 命令,显示执行命令的时候发起的请求
- --no-sync #发出请求之前不同步集群信息
- --output, -o \'simple\' #输出内容的格式 (simple 为原始信息,json 为进行json格式解码,易读性更佳)
- --peers, -C #指定集群中的同伴信息,用逗号隔开 (默认为: “127.0.0.1:4001”)
- --cert-file #HTTPS 下客户端使用的 SSL 证书文件
- --key-file #HTTPS 下客户端使用的 SSL 密钥文件
- --ca-file #服务端使用 HTTPS 时,使用 CA 文件进行验证
- --help, -h #显示帮助命令信息
- --version, -v #打印版本信息
五 常见配置
5.1 设置配置
默认配置文件为/etc/etcd/etcd.conf。
提示:
所有以 --init 开头的配置都是在 bootstrap 集群的时候才会用到,后续节点的重启会被忽略;
所有的参数也可以通过环境变量进行设置,如--my-flag 对应环境变量的 ETCD_MY_FLAG;
命令行指定的参数会覆盖环境变量对应的值。
六 v2和v3的区别
1 export ETCDCTL_API=3 #声明API版本为v3
v3相关不一致命令如下:
- 创建、更新key
1 etcdctl put /etcdb/myself/name "Xiao XianNv" 2 etcdctl put /etcdb/myself/name Xiang HongYing"
- 删除key
1 etcdctl del /etcdb/myself/name 2 etcdctl del /etcdb/myself/name --prefix #删除所有name前缀的节点
- 查询key
1 etcdctl get /etcdb/myself/name 2 etcdctl get /etcdb/myself/name --prefix #查询所有name前缀的键值
- 监控键值
1 etcdctl watch /etcdb/myself/name 2 etcdctl watch /etcdb/myself --prefix #监听子节点
- 申请租约
1 etcdctl lease grant 40 #从申请开始计算时间
- 授权租约
1 etcdctl put --lease=4e5e5b853f528859 /etcdb/myself/name Xiang HongYing" #节点的生命伴随着租约到期将会被DELETE
- 撤销租约
1 etcdctl lease revoke 4e5e5b853f5286cc #撤销租约和租约到期一样,节点都会被删除
- 租约续约
1 etcdctl lease keep-alive 4e5e5b853f52892b #每当到期将会续约
以上是关于001.etcd简介及单节点使用的主要内容,如果未能解决你的问题,请参考以下文章