golang-etcd系列(一)--初识
source link: https://studygolang.com/articles/25212
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
etcd
是一个 golang
编写的分布式、高可用的一致性键值存储系统,是目前容器编排领域火热的 Kubernetes(k8s)
内置的服务发现与节点一致性中间件,用于提供可靠的分布式键值( key-value
)存储、配置共享和服务发现等功能。 etcd
可以用于存储关键数据和实现分布式调度,在现代化的集群运行中能够起到关键性的作用。
etcd
基于 Raft
协议,通过复制日志文件的方式来保证数据的强一致性。在 etcd
之前,常用的是基于 Paxos
协议的 ZooKeeper
。
etcd
主要特性有:
- 简单:基于 HTTP+JSON 的 API 让你用 curl 就可以轻松使用。
- 安全:可选 SSL 客户认证机制。
- 快速:每个实例每秒支持一千次写操作。
- 可信:使用 Raft 算法充分实现了分布式。
1. 安装
1.1 下载可执行文件: https://github.com/etcd-io/et...
下载最新发行版打包文件、解压、执行即可运行:
$ tar zxvf etcd-v3.3.18-linux-amd64.tar.gz $ cd etcd-v3.3.18-linux-amd64/ $ ./etcd # 运行 etcd 服务端 $ ./etcdctl # 运行 etcd 客户端
1.2 下载源代码编译
$ git clone https://github.com/etcd-io/etcd.git $ cd etcd $ ./build
1.3 查看运行情况
$ netstat -anp | grep etcd tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 20537/etcd tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 20537/etcd tcp 0 0 127.0.0.1:2379 127.0.0.1:50902 ESTABLISHED 20537/etcd tcp 0 0 127.0.0.1:50902 127.0.0.1:2379 ESTABLISHED 20537/etcd unix 2 [ ] 数据报 220389 20537/etcd @0002f unix 2 [ ] 数据报 220388 20537/etcd
通过端口查看可以看出,本地的 etcd-server
集群内节点通信端口 2380, etcd-client
服务端-客户端通信端口 2379 都已建立、监听中,说明 etcd
守护进程已成功开启。
1.4 常用命令
kv
键值存储最常用命令是: put
、 get
和 del
./etcdctl put hello world # 设置 k-v OK $ ./etcdctl get hello # 获取 k-v hello world $ ./etcdctl del hello # 删除 k-v 1 $ ./etcdctl get hello # 删除后获取为空 $
2. golang
使用 demo
新建 kv_demo.go
文件如下:
package main import ( "context" "fmt" "time" "github.com/coreos/etcd/clientv3" ) func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, DialTimeout: 5 * time.Second, }) if err != nil { fmt.Println("connect failed, err:", err) return } // 建立客户端成功 fmt.Println("connect succ") defer cli.Close() // 设置1秒超时,访问 etcd 有超时控制 ctx, cancel := context.WithTimeout(context.Background(), time.Second) // 设置 key _, err = cli.Put(ctx, "hello", "world") //操作完毕,取消 etcd cancel() if err != nil { fmt.Println("put failed, err:", err) return } // 取值,设置超时为 1 秒 ctx, cancel = context.WithTimeout(context.Background(), time.Second) resp, err := cli.Get(ctx, "hello") cancel() if err != nil { fmt.Println("get failed, err:", err) return } for _, ev := range resp.Kvs { fmt.Printf("%s : %s\n", ev.Key, ev.Value) } }
运行 go run kv_demo.go
:
$ go run kv_demo.go connect succ hello : world
demo
源码: https://github.com/astraw99/etcd_go
可以看到,上面的 demo
成功进行 key-value
设置与获取。当然 etcd
的命令还有很多,今天初步使用就简单使用这个 kv
存储,其他后面慢慢解析。
3. 小结
本文对 etcd
进行了简单认识和了解,对其最常用的 key-value
分布式存储进行了 golang-demo
演示,可以看出 etcd
的部署、使用是很简单的,客户端命令也很明晰,下一步将深入源码一步一步去探索 etcd
的实现细节。
ectd
作为分布式服务发现、一致性存储领域的后起之秀,在分布式集群、云部署、云应用方面具有举足轻重的作用,从其官方 GitHub
可以看到代码更新迭代快速、从版本 v2 => v3
,随着 CoreOS
和 Kubernetes
等项目在开源社区日益火热,相信在不久的将来将会得到更为广泛的应用。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK