Etcd
Etcd
etcd是什么
etcd是基于Raft协议,存放键值对的分布式数据存储,可以作为我们业务的配置中心,可以作为简单的kv存储,消费端能够检测etcd的配置变化。
应用场景
服务发现
消息发布和订阅
负载均衡
分布式锁
etcd安装
日志
起来服务以后,通过journalctl -f -t etcd或者journalctl -u etcd查看
集群搭建
https://etcd.io/docs/v3.3/demo/ 建议看下这里的配置 这里我以三台服务器搭建为例,注意两台无法实现分布式集群搭建,etcd支持最大断掉(N-1)/2的掉线, 如果用2台,任意一台掉线都无法正常工作
大家可以减配,扩到3台或者5台
这里一定要注意,如果用镜像或者clone的话,可能会有各种各样的错误,比较好的办法是克隆机器上执行
|
|
这里简单贴下我的配置,配置完以后systemctl start etcd, 可能会卡一会,等其他的都上来就不卡了
如果出现报错等信息,可以从这里查看journalctl -f -t etcd和journalctl -u etcd里面查看
|
|
[root@terraform-server ~]# etcdctl member list 52b8eb31b4811ac, started, terraform-server-bak, http://172.31.253.75:2380, http://172.31.253.75:2379 e526595207a29ee6, started, terraform-server, http://172.31.253.73:2380, http://172.31.253.73:2379
etcd常用命令
请确认你的etcd正在运行,etcd的命令主要是etcdctl相关
简要看下命令行
通过etcdctl执行看下有哪些命令
|
|
etcd和不少软件都一样,存在v2和v3版本的较大差异,而默认是etcdv2的,所以记得/etc/profile增加一行
|
|
下面部分来源于官方文档,大家也可以按照官方文档操作一遍, 可参考官方demo
集群健康度查询
|
|
增加一个key
|
|
查询一个key
|
|
查看后端
etcdctl endpoint status -w table
获取当前revision版本
etcdctl get revisiontestkey -w json
如何获取历史的值
etcdctl get –rev=REVISION KEY 先看一组例子
|
|
可以得到如下结论
- revision是每一次库发生变化的时候都有一个版本
- –rev=NUMBER 0代表最新的,如果之前做过compact就会无法获取提示被compact,如果是在compact以后的revsion,如果a还没被创建,
默认为空值,如果a被创建后,为当时的revision+1的时候的值 那么问题来了,如何拿到kv的上一次历史的值,我觉得有两个思路
- 服务端增加watch etcdctl watch –prev-kv KEY或者etcdctl watch –rev=xx KEY把历史rev watch并写入log,取上次的值只需要向上检索匹配这个值即可
- 用etcdctl获取当前revsion+1然后向上遍历,获取一个不一样的值
- etcdctl是否有自己的逻辑能拿到上一个version的值
当key不存在时候创建
etcdctl mk KEY VALUE 如果 key 的值是 "hello, etcd",就把它替换为 "goodbye, etcd" etcdctl set –swap-with-value "hello, world" /message "goodbye, etcd"
可能出现的问题
cluster ID mismatch
|
|
这个时候master那边需要备份下数据目录,删掉 这个时候就能注册上去了
etcdctl member list总是不出另外一个
原因比较多,
- 检查安全组
- 日志检查journalctl -u etcd
- 检查配置和官网的是否一致, 哪里是否写错了,端口2380,2379都尝试下,是否监听localhost了
执行put的时候Error: dial tcp 127.0.0.1:2379: connect: connection refused
因为没有监听在127.0.0.1,所以telnet localhost 2379也是不通的,
解决办法是改成0.0.0.0:2379(不建议)或者写两个(建议)http://your_ip:2379,http://localhost:2379
Failed at step CHDIR spawning /bin/bash: No such file or directory
目录备份不要太过火了,mv /var/lib/etcd下面的member为bak就好了,如果mv /var/lib/etcd /var/lib/etcd.bak则会报错
实在无法的终结办法
几个节点都rm -rf /var/lib/etcd/default.etcd,然后同时systemctl start etcd