浅入深出ETCD之【简介与命令行使用】
前言
你知道etcd吗?随着k8s的使用广泛之后,etcd被非常多的人所知道,同时又因为它可靠的分布式特性被很多人喜欢。所以,我准备有几篇博文来记录一下,从基本使用到线上部署再到原理分析,做一个系列。那么,今天先来说说它的简介与命令行的使用。
简介
ETCD是什么
我个人总结为下面用几个要点:
- 高可用K-V存储,就类似于redis一样的键值对存储。
- 允许应用实时监听存储中的K-V变化。
- 能够容忍单点故障,能够应对网络分区。
- etcd利用raft在集群中同步K-V信息,raft是强一致的集群日志同步算法。
总结:etcd是一个分布式高可用k-v存储,通过复制达到每个节点存储的信息一致,从而保证高可用。
数据复制
这里简单说一下复制的具体流程:

(client为我们的客户端,用来发出存储请求,leader和follower都是etcd的节点)
就如图上所看到的,我叫它两段式提交:
- 客户端请求leader发送存储的数据,然后leader节点要将信息通过日志复制给大多数的follower节点,如上图所示,只需要复制给两个(加上它自己是三个)那么就是大多数节点。
- leader当复制完成之后才会本地提交,然后返回给客户端成功,(如果没有或者不能复制给大多数节点,那么则存储失败)此时再同时其他follower去他们自己本地提交。
是不是有一种分布式事务的感觉?分布式的解决通常都是这种感觉。
我们也可以看到,etcd通过先将数据存放在大多数节点上面从而保证数据不会出错并且效率较高,最终所有节点数据还是会同步一致的。
- 官方给出写入的性能:1000/s
PS:这里因为是简介,所以就简单提一下,有关如何选举出leader还有raft协议的一些具体细节,以及当出现网络分区或者节点异常问题的恢复会在之后的博客中给出。
存储结构
底层存储key是有序排列的
'key' -> 'value'
aaa/bbb -> 111
aaa/bbc -> 3333
bbb/aaa -> 1321
ccc -> 24
就是按照key的顺序依次排列,相同前缀的key会被放在一起,这样到存储结构,当查询时可以通过key的前缀将一系列的value都取出来
watch机制和lease租约
etcd有一个很棒的机制要单独提一句,就是watch,它允许你去监控一个key的变化。当你监控了之后,这个key的添加修改删除都会被监控到。
lease租约,这个机制和redis中的key过期机制一样,可以申请一个租约,这个租约有一个时间限制,比如60秒,你可以将这个租约设置到一个key上,那么这个key过60秒就会被自动删除。当然也可以进行续租。
具体使用情况,可以从后面的命令行操作中看到。
还有一些小点
- etcd使用grpc,所以网络性能会高
- 部署节点数量要求是2N+1个
- 选举leader需要半数以上的节点参与
- etcd是支持事务操作的,可以if第一次a提交正常,then提交b,else不提交b
本地单节点部署
我们一开始学习和测试的时候只需要在本地部署一个单节点就可以了,单节点的部署比较方便这边简单说明一下。
首先下载对应的版本:https://github.com/etcd-io/etcd/releases
我这边使用的mac对应的darwin-amd64的版本,其他版本应该类似。
下载解压之后有两个文件比较重要:
- etcd 这个是节点
- etcdctl 这个是客户端
进入所在目录使用命令进行启动和使用
使用节点命令
➜ ./etcd
使用客户端命令
➜ ./etcdctl
NAME:
etcdctl - A simple command line client for etcd. WARNING:
Environment variable ETCDCTL_API is not set; defaults to etcdctl v2.
Set environment variable ETCDCTL_API= to use v3 API or ETCDCTL_API= to use v2 API.
之后会出现上述类似警告,告诉你,默认使用的是v2版本的API,你需要设置环境变量ETCDCTL_API=3就能使用v3版本的API了,这里我们使用命令export ETCDCTL_API=3
或者你可以手动修改环境变量添加export ETCDCTL_API=3就可以了,当不出现警告的时候证明环境变量设置正确。
简单命令行操作
下面介绍几个最基本的etcd的操作,其实非常简单。主要与redis不同的是拥有独特的watch机制,这个机制非常棒。
put
➜ ./etcdctl put /aaa/a
OK
➜ ./etcdctl put /aaa/b
OK
get
➜ ./etcdctl get /aaa/a
/aaa/a ➜ ./etcdctl get --prefix /aaa
/aaa/a /aaa/b
--prefix意思是取出所有前缀为/aaa的key
watch
新开一个窗口使用命令watch进行监听
➜ ./etcdctl watch /aaa/a
然后对/aaa/a这个key的操作全部都会被监听到
➜ ./etcdctl put /aaa/a
OK
➜ ./etcdctl del /aaa/a ➜ ./etcdctl watch /aaa/a
PUT
/aaa/a DELETE
/aaa/a
lease
创建一个60s的租约
➜ ./etcdctl lease grant
lease 694d6b2b7d7e6a0c granted with TTL(60s)
➜ ./etcdctl put /aaa/a --lease=694d6b2b7d7e6a0c
OK
put的时候使用租约注意,这里需要输入上面租约的16进制标识符
然后监听的地方会发现,60秒后,/aaa/a这个key被自动删除了
当然你可以使用keep-alive进行续租,如:
➜ ./etcdctl lease keep-alive 694d6b2ac4a35625
总结
以上简单说明了etcd的一些基本信息,单节点部署,以及一些基本用法,从上述信息我们总结可知:
- etcd是分布式的,能保证在单点故障下也能正常使用
- 分布式也会导致问题,etcd写入性能相较redis肯定有所不及
- etcd独特的watch机制可以用于很多场景,如配置更新分发等
那这里就说这么多,看完你就应该大致知道etcd是个啥玩意了,从现在看来你可能还没有感觉它有什么厉害的地方,后面我们结合实际的场景使用就能更加明白了。
浅入深出ETCD之【简介与命令行使用】的更多相关文章
- 浅入深出ETCD之【集群部署与golang客户端使用】
前言 之前说了etcd的简介,命令行使用,一些基本原理.这次来说说现实一点的集群部署和golang版本的客户端使用.因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一 ...
- 浅入深出ETCD之【raft原理】
前言 这次我们来说说,有关于etcd原理的一些事情.之前我们已经了解到了etcd是一个分布式的k-v存储,那么它究竟是如何保证数据是如何复制到每个节点上面去的呢?又是如何保证在网络分区的情况下能正常工 ...
- 浅入深出之Java集合框架(中)
Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 浅入深出之Java集合框架(下)
Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 浅入深出Vue:环境搭建
浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
- 浅入深出Vue:工具准备之WebStorm安装配置
浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...
- 浅入深出Vue系列
浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...
随机推荐
- linux磁盘空间满了 但是没有大文件
很常见的一个问题 linux磁盘空间满了 但是没有大文件 解决思路: 1.用df 检查发现/根目录可用空间为0 [root@/]#df -h 2.用du检查发现各目录占用的空间都很少,有约3G的空间莫 ...
- maven nexus 私服搭建 Windows版
准备工作 已安装jdk,并配置好了环境变量 已安装maven,并配置好了环境变量 下载Nexus Repository OSS:https://www.sonatype.com/download-os ...
- Layout POJ - 3169
题目链接:https://vjudge.net/problem/POJ-3169 题意:有一些奶牛,有些奶牛相互喜欢,他们之间的距离必须小于等于一个K. 有些奶牛相互讨厌,他们之间的距离必须大于等于一 ...
- 【使用DIV+CSS重写网站首页案例】CSS引入方式
CSS引入方式(3种) *就近原则:行内引入可以覆盖内部引入的效果 内部引入: * type="text/css" 为默认可以不写 例子: <!DOCTYPE h ...
- linux使用useradd创建的用户没有目录的解决办法
转载请注明来源https://www.cnblogs.com/sogeisetsu/p/11401562.html或https://blog.csdn.net/suyues/article/detai ...
- mysql毫秒数引发的问题
起因:最近同事在做定时打卡的东西,遇到一个诡异的问题,端只是传了一个开始时间跟打卡周期,剩下的打卡时间都是由服务端自己生成的,显示的截止时间有的变成==23:59:59==. 有时候又变成了 ==00 ...
- sublime设置代码缩进
打开sublime的首选项(Preferences)下的设置-用户(Setting-User) ,配置如下代码 , "translate_tabs_to_spaces": true ...
- javascript学习3、数据类型、数据类型转换、运算符
数据类型包括:基本数据类型和引用数据类型 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值 ...
- php怎么实现多态?
在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值.字符串.对象.资源等.我们无法说PHP5中多态的是变量. 我们只能说在PHP5中,多态应用在方法参数的类型提示位置. 一个类的任何子 ...
- ruby中的整数、浮点数、字符串之间的相互转换
D:\learnProg\Ruby>irb#浮点数转换成整数,会强行去掉小数点后面的数字 irb(main):017:0> 123.45.to_i => 123 #整数转换成浮点数, ...