go操作etcd

[TOC]

Etcd介绍

​ etcd高可用的分布式key-value存储系统,可以用于共享和服务的注册和发现

etcd的特点

  • 完全复制:集群中的每个节点都可以使用完整的存档
  • 高可用性:etcd可用于避免硬件的单点故障或网络问题
  • 一致性:每次读取都会返回跨多主机的最新写入
  • 简单:包括一个定义良好、面向用户的api(grpc)
  • 安全:实现了带有可选的客户端证书身份验证的自动化TLS
  • 快速:每秒10000此写入的基准速度
  • 可靠:使用raft算法实现了强一致、高可用的服务存储目录

使用场景

  • 服务发现

  • 配置中心

  • 分布式锁

    因为etcd使用raft算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有俩种使用方式,一是保持独占,二是控制时序

    1. **保持独占即所有获取锁的用户最终只有一个可以得到。**etcd为此提供了一套实现分布式锁,原子操作CAS的api,通过设置 prevExist值,可以保证在多个节点同时去创建魔鬼目录时,只有一个成功。而创建成功的用户就可以认为是获取到锁了。
    2. 控制时序,即所有想要获得锁的用户都会被安排执行,但是获得锁的顺序也是全局唯一的,同时决定了执行顺序。etcd为此提供了一套api(自动创建有序键),对一个目录键值时指定为post动作,这样etcd会自动在目录下生成一个当前最大的值为键,存储这个新的值(客户端编号)。同时还可以使用api按顺序列出所有当前目录下的键值。此项这些键值就是客户端的时序,而这些键中存储的值可以是代表的客户端的编号

etcd架构

image-20190923212147634

从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表示存储的具体日志内容

etcd集群部署

TOKEN=token-01  #集群之间通信的token
CLUSTER_STATE=new #集群状态
CLUSTER=n1=http://10.240.0.17:2380,n2=http://10.240.0.18:2380,n3=http://10.240.0
.19:2380  #集群的节点名称和通信地址

#每个节点的启动配置
etcd --data-dir=data.etcd \
		--name n1 \ #节点名称
    --initial-advertise-peer-urls http://10.240.0.17:2380 \ #通信监听地址和端口
    --listen-peer-urls http://10.240.0.17:2380 \
    --advertise-client-urls http://10.240.0.17:2379 \ #客户端监听地址和端口
    --listen-client-urls http://10.240.0.17:2379 \
    --initial-cluster ${CLUSTER} \
    --initial-cluster-state ${CLUSTER_STATE} \
    --initial-cluster-token ${TOKEN}

官方支持外网访问集群

# 通过获取一个密钥串
curl https://discovery.etcd.io/new?size=3
# 返回的结果:
https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92


#在每个节点上都加上这个密钥串
DISCOVERY=https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92
 --discovery ${DISCOVERY} \

客户端基本操作

export ETCDCTL_API=3
HOST_1=10.240.0.17
HOST_2=10.240.0.18
HOST_3=10.240.0.19
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
etcdctl --endpoints=$ENDPOINTS member list

# put:
etcdctl.exe --endpoints=http://127.0.0.1:2379 put key value
# get:
etcdctl.exe --endpoints=http://127.0.0.1:2379 GET key
# del:
etcdctl.exe --endpoints=http://127.0.0.1:2379 DEL key

操作etcd

go.etcd.io/etcd/clientv3

raft协议

选举

日志复制

异常处理(脑裂处理)

对比zk的zad协议区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值