go-etcd实战

etcd 简介

etcd is a strongly consistent, distributed key-value store that provides a reliable way to store data that needs to be accessed by a distributed system or cluster of machines. It gracefully handles leader elections during network partitions and can tolerate machine failure, even in the leader node.
贴了官网的介绍。大致的意思就是etcd 是一个强一致性的分布式kv存储。提供了可信赖的手段去保证分布式系统中的数据存储。在网络抖动分裂和机器坏死的情况下,都可以优雅的处理leader选举问题。

学习参考的资料
官网
中文文档
本文代码收录

环境搭建

本文是伪分布式集群的方式搭建etcd集群,3个server结点。etcd集群结点之间通讯使用的是grpc协议。启动一个etcd实例需要占用两个端口号,一个端口号用于对外提供服务的(2379),另外一个端口号用于集群内部之间进行通讯的(2380)

说明

本文的实操环境是基于虚拟机完成的,虚拟机通过静态ip与本机进行连接,虚拟机局域网 ip地址固定为 10.248.174.155。etcd的版本为 v3.5.0。

下载安装

etcd 直接下载对应的二进制包进行解压即可使用。

# 下载
wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
# 解压
tar -zxvf etcd-v3.5.0-linux-amd64.tar.gz

解压后的目录如下所示

root@n248-174-155:~/file/etcd-v3.5.0-linux-amd64$ ll
total 56304
drwxr-xr-x 3 root root     4096 Jun 16  2021 Documentation
-rwxr-xr-x 1 root root 23560192 Jun 16  2021 etcd
-rwxr-xr-x 1 root root 17969152 Jun 16  2021 etcdctl
-rwxr-xr-x 1 root root 16048128 Jun 16  2021 etcdutl
-rw-r--r-- 1 root root    42066 Jun 16  2021 README-etcdctl.md
-rw-r--r-- 1 root root     7359 Jun 16  2021 README-etcdutl.md
-rw-r--r-- 1 root root     9394 Jun 16  2021 README.md
-rw-r--r-- 1 root root     7896 Jun 16  2021 READMEv2-etcdctl.md

命令实战

一般来说,官方提供各种语言相关的sdk都与原生提供的命令有相似之处,而etcd使用go语言编写的,原生api对go的支持更为友好。先了解一下基本的一些操作命令。

本 地 e t c d 相 关 的 操 作 命 令 都 是 在 解 压 后 的 根 目 录 下 进 行 的 \color{#FF0000}{本地etcd相关的操作命令都是在解压后的根目录下进行的} etcd

cd  /home/root/etcd-v3.5.0-linux-amd64/

启动etcd集群

启动参数说明
  • listen-peer-urls: 集群内部通讯的端点
  • listen-client-urls: 集群对外提供服务的端点
  • initial-cluster-token:三个结点都是一个集群 etcd-cluster-1
  • initial-cluste:集群中的node信息
  • 最后以 nohup 后台的方式启动三个实例,并指定了日志的输出目录
nohup etcd --name etcd01 --initial-advertise-peer-urls http://10.248.174.155:2370 \
--listen-peer-urls http://0.0.0.0:2370 \
--listen-client-urls http://0.0.0.0:2371 \
--advertise-client-urls http://10.248.174.155:2371 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd01=http://10.248.174.155:2370,etcd02=http://10.248.174.155:2380
,etcd03=http://10.248.174.155:2390 \
--initial-cluster-state new > /home/root/etcd-v3.5.0-linux-amd64/etcd01.etcd/etcd01.log 2>&1 &

nohup etcd --name etcd02 --initial-advertise-peer-urls http://10.248.174.155:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2381 \
--advertise-client-urls http://10.248.174.155:2381 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd01=http://10.248.174.155:2370,etcd02=http://10.248.174.155:2380
,etcd03=http://10.248.174.155:2390 \
--initial-cluster-state new > /home/root/etcd-v3.5.0-linux-amd64/etcd02.etcd/etcd02.log 2>&1 &

nohup etcd --name etcd03 --initial-advertise-peer-urls http://10.248.174.155:2390 \
--listen-peer-urls http://0.0.0.0:2390 \
--listen-client-urls http://0.0.0.0:2391 \
--advertise-client-urls http://10.248.174.155:2391 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd01=http://10.248.174.155:2370,etcd02=http://10.248.174.155:2380
,etcd03=http://10.248.174.155:2390 \
--initial-cluster-state new > /home/root/etcd-v3.5.0-linux-amd64/etcd03.etcd/etcd03.log 2>&1 &

三个结点都启动成功

root@n248-174-155:~/file/etcd-v3.5.0-linux-amd64$ netstat -ntpl|grep etcd
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::2370                 :::*                    LISTEN      3785847/etcd
tcp6       0      0 :::2371                 :::*                    LISTEN      3785847/etcd
tcp6       0      0 :::2380                 :::*                    LISTEN      3785815/etcd
tcp6       0      0 :::2381                 :::*                    LISTEN      3785815/etcd
tcp6       0      0 :::2390                 :::*                    LISTEN      3785781/etcd
tcp6       0      0 :::2391                 :::*                    LISTEN      3785781/etcd

测试命令

# 查看etcd版本
root@n248-174-155:~/file/etcd-v3.5.0-linux-amd64$ etcdctl version
etcdctl version: 3.5.0
API version: 3.5
# 查看集群的成员
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 member list -w table
# 查看集群的状态
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 endpoint status -w table 

kv操作命令

添加key
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 put services/svr-user/001 192.168.3.2:5780 
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 put services/svr-user/002 192.168.3.3:5643 
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 put services/svr-user/003 192.168.172.8:3456
查询key
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 get services/svr-user/003
根据前缀查询
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 get --prefix services/svr-user/
获取所有key
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 get --from-key ''
删除单个key
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 del services/svr-user/003
删除所有的key
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 del --prefix ""
创建一个租约60s 得到一个租约id
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 lease grant 60 

lease 600f7e04ffa10330 granted with TTL(60s)

查询某个租约的具体信息
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 lease timetolive 738c7e05014d164d 

lease 600f7e04ffa10330 granted with TTL(60s), remaining(45s)

将租约绑定到具体的键值对上,时间过期后,k,v也就失效了
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 put k1 v1 --lease=600f7e04ffa10330
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 put k2 v2 --lease=600f7e04ffa10330
查询这个租约绑定了哪些key
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 lease timetolive 26a37e0501d46f26 --keys

lease 600f7e04ffa10330 granted with TTL(60s), remaining(14s), attached keys([k1 k2])

查询当前被激活的所有租约
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 lease list

found 4 leases
738c7e05014d161f
26a37e0501d46f20
26a37e0501d46f22
26a37e0501d46f24

一直续约租约

比如一开始是60,续约后将租约又刷新到60,不过是每隔20s刷新一次,实际测试这个刷新间隔时间会根据你的租约时间而改变,测试租约20s的时候,10s刷新间隔, 租约10s,5s刷新间隔, 租约5s,3s刷新间隔。 保证一定能续约上。

etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 lease keep-alive 26a37e0501d46f28 lease

26a37e0501d46f26 keepalived with TTL(60)
lease 26a37e0501d46f26 keepalived with TTL(60)
lease 26a37e0501d46f26 keepalived with TTL(60)
lease 26a37e0501d46f26 keepalived with TTL(60)
lease 26a37e0501d46f26 keepalived with TTL(60)

只续约一次
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 lease keep-alive 26a37e0501d46f28 --once
监听某个前缀的key的改变

终端会一直卡住接收事件,删除和新增都能收到,如果是key绑定了租约,租约到期了,会接收到一个删除事件

etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 watch --prefix aa/
PUT
aa/002
192.168.4.2:5780
PUT 
aa/002 
192.168.4.2:5780 
DELETE 
aa/002 
PUT 
aa/002 
192.168.4.2:5780 
DELETE 
aa/002
终端一直卡在这里,监听某一个key的改变,每次改变,会将key之前的值和最新的值都推送过来
etcdctl --endpoints=10.248.174.155:2371,10.248.174.155:2381,10.248.174.155:2391 watch --prev-kv aa/

go-etcd 实战

etcd 的常用应用场景是微服务体系中的注册中心,维护服务的注册信息,提供服务发现能力。下面做一个服务注册与发现的例子,仅供参考。

服务注册发

你可能感兴趣的:(golang,实战演练,golang,etcd,服务发现,服务注册,微服务)