ETCD是一个开源的、分布式键值(Key/Value)存储系统,首先是一个存储仓库,其次是以键值对的形式存储数据。它被设计之初是在Linux平台中使用的,不过现在也推出了Windows版本(处于试验阶段)。官方文档说ETCD的主要用途是“配置共享和服务发现”,关于这两个主要用途,在后面项目中如果有接触到再慢慢探究其具体的应用。现在主要还是将ETCD用于数据存储(这个行为有种将它当做Redis使用的感觉,但是作为云计算开发方面的数据存储,通常都会涉及到分布式存储,因此使用ETCD是一个不错的选择,从介绍就知道了:它是一个分布式存储系统)。
ETCD的安装与配置直接百度搜一堆。
转载:ETCD的安装预配置
tip:下面的命令有v2也有v3版本的,属于哪个版本的命令有标注,v2和v3的一些命令是有明显区别的,如:使用etcdctl set key value(v2写法)在v2版本的环境中可以正常读取,但是在v3版本中却读取不到内容,因为v2版本和v3版本不能完全兼容,数据存储的位置发生了变化,因此无法成功读取。
安装完毕之后你可以打开etcd.json(在Linux可以使用find / -name etcd.json命令查到位置)这个配置文件看看内容:具体的字段作用网上一堆。
{
"name": "cvm_0",
"auto-compaction-mode": "periodic",
"auto-compaction-retention": "1",
"initial-advertise-peer-urls": "http://10.30.12.211:2380",
"listen-peer-urls": "http://10.30.12.211:2380",
"listen-client-urls": "http://127.0.0.1:2379,http://10.30.12.211:2379",
"advertise-client-urls": "http://10.30.12.211:2379",
"initial-cluster": "cvm_2=http://10.30.12.213:2380,cvm_1=http://10.30.12.212:2380,cvm_0=http://10.30.12.211:2380",
"data-dir": "/var/data/etcd/cvm_0.etcd",
"heartbeat-interval": 100,
"election-timeout": 1000,
"initial-cluster-state": "new",
"max-request-bytes": 33554432,
"quota-backend-bytes": 8589934592
}
上面的10.30.12.211是当前这台机的ip地址,在“initial-cluster”字段中可以看到配置了3对ip,这个就是集群中的3个节点,也就是打算将这三个节点配置在同一个集群中,cvm_xxx这个就是第一个字段name对应的名字。另外两台主机也需要按照这个配置文件配置一份,只不过需要把name字段和配置文件中的ip配置成本机ip,对照着改就可以了。
如下:
{
"name": "cvm_1",
"auto-compaction-mode": "periodic",
"auto-compaction-retention": "1",
"initial-advertise-peer-urls": "http://10.30.12.212:2380",
"listen-peer-urls": "http://10.30.12.212:2380",
"listen-client-urls": "http://127.0.0.1:2379,http://10.30.12.212:2379",
"advertise-client-urls": "http://10.30.12.212:2379",
"initial-cluster": "cvm_2=http://10.30.12.213:2380,cvm_1=http://10.30.12.212:2380,cvm_0=http://10.30.12.211:2380",
"data-dir": "/var/data/etcd/cvm_1.etcd",
"heartbeat-interval": 100,
"election-timeout": 10000,
"initial-cluster-state": "new",
"max-request-bytes": 33554432,
"quota-backend-bytes": 8589934592
}
配置完成后就试着启动三台主机的etcd服务吧。
重载配置(重新加载配置)
systemctl daemon-reload
设置允许使用etcd服务(第一次使用的时候可以设置,后面的话基本就不需要了)
systemctl enable etcd
启动etcd(根据需要选择)
systemctl start etcd
停止etcd(根据需要选择)
systemctl stop etcd
重启etcd(根据需要选择)
systemctl restart etcd
查看服务状态
systemctl status etcd
如果启动成功则会显示这些信息:
在节点服务启动过程中可能会遇到各总各样的问题,像:
或
或
或
或
或
总之可能会爆出各种各样的问题,这时候 :①首先查看一下你的etcd.json配置文件中的内容有没有问题,比如配置信息有没有写错,或者多一个双引号之类的小问题也会造成配置信息读取错误;②在配置文件中可以查看到一个字段“data_dir”,根据该字段指向的字段找到/var/data/etcd/cvm_0.etcd(目录名字根据你节点的etcd.json配置文件定),将这个目录删除,里面保存的是你通过命令操作etcd时保存的一些信息,因为我们现在没办法正常启动服务,而且etcd里面也没有存些什么重要的信息,因此最省事的办法就是将整个集群下所有的节点内的该目录删除,然后所有节点都先停止服务,然后启动服务,再查看状态。如果所有的节点都没有报错误信息或者是连接失败的信息,再使用etcdctl member list查看集群中所有的节点信息,如果所有的几点都连接成功则会显示所有节点的基本信息,包括选举出的主节点(即Leader节点,这里的选举是指我们集群中有若干个节点,需要推举出一个主节点用来协调其他从节点以及节点之间的通信。这个选举要求至少有3台主机,否则2台的话没办法构成选举,这个和现实中的选举是一个道理)
使用etcdctl member list查看集群中所有的成员:
介绍命令之前先给一个ETCD命令大全
tip:有一点要注意,下面的命令中除了标注“版本2写法”之外,一些通过curl访问的地址里面涉及到v2字段的也是属于版本2的数据操作范畴,使用版本3的操作去做可能不会得到结果,因为版本2和版本3数据存储的位置不同,因此他们会从各自的位置查找数据,这样一来版本2和版本3的数据不会相互影响,彼此也无法找到对方的数据去操作。
0.查看etcdctl内部的命令:etcdctl --help
1.查看版本(版本2写法): etcd -version 或者 etcdctl -version(这个可查看api版本,这个可执行文件通常在etcd-v3.3.13-linux-amd64目录下【3.3.13是我这个etcd的版本,自己的版本键入etcd -verision命令可知】,该目录下一般是有etcd和etcdctl这两个可执行文件)
2. 查看成员列表(版本2写法):etcdctl member list(查看集群中的成员)
3. 查看集群状态(版本2写法):etcdctl cluster-health
4. curl(CommandLine Uniform Resource Locator):通过命令行访问url地址,并将内容下载到本地(文件、图片等),如果是文本形式的则直接输出到终端(tip:这只是一个命令行请求url的方式,不属于ETCD的内容)。
5. 查看集群leader的状态:curl http://127.0.0.1:2379/v2/stats/leader(v2是指ETCD的api版本是version2,如果是version3的应该改成v3,下同)
6. 查看自己的状态:curl http://127.0.0.1:2379/v2/stats/self
7. 使用curl设置键值对:curl http://127.0.0.1:2379/v2/keys/键 -XPUT -d value=值(若key不存在则创建value,若key存在则修改value)
8. 使用curl通过key获取value:curl http://127.0.0.1:2379/v2/keys/键 -XGET
9. 使用curl通过key删除value:curl http://127.0.0.1:2379/v2/keys/键 -XDELETE
10. 修改ETCDCTL的api版本:export ETCDCTL_API=3
11. 查看ETCDCTL的api版本(版本3写法):etcdctl version(后面不再是-v或者-verison,这些是版本2的操作符,在改成api版本3之后单纯一个version即可,否则报错)
12. 设置键值对(版本2写法):etcdctl set key value(作用同7)(若key不存在则创建value,若key存在则修改value)
13. 通过key获取value(版本2和版本3写法相同):etcdctl get key(作用同8)
14. 通过key删除value(版本2写法):etcdctl rm key(作用同9)
15. 设置key/value的过期时间(版本2写法):etcdctl set key value -ttl 10 (ttl是time to live-表示生存时间,10表示10秒,即这个key/value的生存期是10秒,在10秒后将被删除)
16. 查看集群中存储的数据(不管在哪个节点中更新数据,在同一个集群内所有的节点都能共享最新的数据状态,因为处于同一个集群内的所有节点是数据共享的,这就是所谓的分布式):
①curl http://127.0.0.1:2379/v2/keys(查看所有的键值对数据)
②curl http://127.0.0.1:2379/v2/keys/key(通过具体的key找到对应的键值对数据)
17.观察者:通过让某个节点处于等待状态(即作为观察者,设定观察某个值得状态,当其他节点对其发生修改的时候将会收到修改(增、删、改)后的信息,当然如果观察的key因为设置超时时间而被删除了,则不会返回任何信息,而只是处于等待状态)
某节点作为观察者方(处于阻塞状态,观察指定数据的变化,一旦发生变化就会收到修改后的信息):
curl http://127.0.0.1:2379/v2/keys/key?wait=true
其他节点操作被观察数据:可直接对该数据做增、删、改,均会让观察者收到修改后的数据信息
18.原子操作(涉及到prevIndex、prevValue、prevExist),在执行增、删、改、查的时候通过这三个字段进行选择判断,如果成立则执行操作,否则爆出操作失败信息。例:
curl http://127.0.0.1:2379/v2/keys/键?prevExist=true -XPUT -d value=值(当键存在时修改其值)
curl http://127.0.0.1:2379/v2/keys/键?prevValue=foo -XDELETE(当键对应的值为foo得时候删除该键值对)
curl http://127.0.0.1:2379/v2/keys/键?prevIndex=100 -XGET(当最新的修改操作的索引为100的时候获取键值对信息)
19.设置键值对(版本3写法):etcdctl put key value(因为版本2和版本3并非完全兼容,因此数据存储的位置不一样,如果使用版本2命令存数据,使用版本3操作数据是操作不到的,因为找不到数据;反之亦然)
20.通过key获取value(版本2和版本3相同):etcdctl get key
21.通过key删除value(版本3写法):etcdctl del key
22.事务操作:在操作之前先设立一个条件,并要求设置成功场景和失败场景,当条件成立时进入成功场景,反之进入失败场景(场景中的操作为get、put、del)
步骤(下面是版本3的写法,版本2的以后遇到事务操作再补充):
①进入事务操作:etcdctl txn --interactive(或者etcdctl txn -i)
②输入判断条件(通过键拿到值,然后与等号右侧的值做相等判断,若相等则进入成功分支,不相等则进入失败分支):value(“键”) = “值”(此时会在一个空行等待再次输入判断条件,如果没有判断条件了直接回车进入成功分支设置)
③成功分支(和失败分支2选1):有(get、put、del选项),例:get key、put key value、del key
③失败分支(和成功分支2选1):操作同成功分支
23.查看成员列表(版本3写法,作用同2):etcdctl --endpoints=$ENDPOINTS member list
24.观察者(版本3写法,作用同17,但17的是版本2的写法,只能监听一次数据的变化,收到数据变化信息之后退出监听状态;版本3可以一直监听下去,即使收到一次变化结果了依然能够监听下去):让某节点处于阻塞状态,从而监控某个键值对的变化:etcdctl watch 键
25.租约(版本3的概念–这里的租约就相当于一个容器,可以添加若干个键值对,一旦租约到期则所有的键值对将被销毁,表示到期了。简单来说租约设置了一个有效期,即ttl-生存时间,将键值对添加至租约中,就可以由一个租约来约定这些键值对的生存时间。一旦租约到期,则所有的键值对将被统一销毁)
①创建一个租约:etcdctl lease grant 10(lease表示租约,是操作租约的命令,10表示生存时间10秒)
②查看租约列表:etcdctl lease list(查看当前存活的租约)
③查看租约的信息:etcdctl lease timetolive leaseID(查看租约信息,主要是租约的设置时间以及剩余时间,leaseID是租约的id)
④删除某个租约:etcdctl lease revoke leaseID(删除指定id的租约)
⑤租约保活:etcdctl lease keep-alive leaseID(让租约恢复到设置的生存时间重新开始倒计时,但并不是只有一次,而是无限次,只要到期就重新刷新生存时间重新开始倒计时)
⑥往租约内注册一个键值对:etcdctl put key value --lease=leaseID(key即键值对的键,value即键值对的值,leaseID即租约id)