etcd 简单使用以及通过Go进行操作

173 阅读2分钟

1. etcd是什么?

参考官网:etcd.io/

分布式、可靠的键值存储,用于存储分布式系统中最关键的数据

2、安装etcd

参考github的链接:github.com/etcd-io/etc…

Linux
ETCD_VER=v3.5.3
​
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
​
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
​
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
/tmp/etcd-download-test/etcdutl version
# start a local etcd server
/tmp/etcd-download-test/etcd
​
# write,read to etcd
/tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
/tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
macOS (Darwin)
ETCD_VER=v3.5.3
​
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
​
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf /tmp/etcd-${ETCD_VER}-darwin-amd64
​
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
/tmp/etcd-download-test/etcdutl version
Docker

etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
  docker rmi gcr.io/etcd-development/etcd:v3.5.3 || true && \
  docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
  --name etcd-gcr-v3.5.3 \
  gcr.io/etcd-development/etcd:v3.5.3 \
  /usr/local/bin/etcd \
  --name s1 \
  --data-dir /etcd-data \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://0.0.0.0:2379 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --initial-advertise-peer-urls http://0.0.0.0:2380 \
  --initial-cluster s1=http://0.0.0.0:2380 \
  --initial-cluster-token tkn \
  --initial-cluster-state new \
  --log-level info \
  --logger zap \
  --log-outputs stderr
​
docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcd --version"
docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl version"
docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl get foo"
docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdutl version"

3、如何使用etcd

采用:pkg.go.dev/go.etcd.io/…

Go在倒包的时候存在一些问题,需要修改一下依赖。参考地址:

www.cnblogs.com/zanyouxin/p…

成功导入依赖的go.mod 文件(版本供参考)。

module etcd-go
​
go 1.17
​
replace github.com/coreos/bbolt v1.3.4 => go.etcd.io/bbolt v1.3.4
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
require go.etcd.io/etcd v3.3.27+incompatible
​
require (
  github.com/coreos/bbolt v1.3.4 // indirect
  github.com/coreos/etcd v3.3.27+incompatible // indirect
  github.com/coreos/go-semver v0.3.0 // indirect
  github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect
  github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
  github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
  github.com/dustin/go-humanize v1.0.0 // indirect
  github.com/gogo/protobuf v1.3.2 // indirect
  github.com/golang/protobuf v1.5.2 // indirect
  github.com/google/uuid v1.3.0 // indirect
  github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
  github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
  github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
  github.com/jonboulle/clockwork v0.3.0 // indirect
  github.com/pkg/errors v0.9.1 // indirect
  github.com/prometheus/client_golang v1.12.1 // indirect
  github.com/soheilhy/cmux v0.1.5 // indirect
  github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect
  github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
  go.uber.org/atomic v1.7.0 // indirect
  go.uber.org/multierr v1.6.0 // indirect
  go.uber.org/zap v1.21.0 // indirect
  golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
  golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect
  golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
  golang.org/x/text v0.3.6 // indirect
  google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect
  google.golang.org/grpc v1.33.1 // indirect
  google.golang.org/protobuf v1.26.0 // indirect
  gopkg.in/yaml.v2 v2.4.0 // indirect
  sigs.k8s.io/yaml v1.3.0 // indirect
)

Go文件:

package main
​
import (
  "context"
  "fmt"
  "time""go.etcd.io/etcd/clientv3"
)
​
func main() {
  // 初始化
  cli, err := clientv3.New(clientv3.Config{
    Endpoints: []string{"http://127.0.0.1:2379"},
    DialTimeout: 2 * time.Second,
  })
  if err != nil {
    panic(err)
  }
  defer cli.Close()
​
  // put数据
  resp, err := cli.Put(context.Background(), "mytaowu", "hi tencent!")
  if err != nil {
    panic(err)
  }
​
  fmt.Printf("put resp: %v\n", resp)
​
  // get数据
  getResp, err := cli.Get(context.Background(), "mytaowu")
  if err != nil {
    panic(err)
  }
​
  fmt.Printf("put resp: %v\n", getResp)
}

运行结果:

put resp: &{cluster_id:14841639068965178418 member_id:10276657743932975437 revision:4 raft_term:3  <nil> {} [] 0}
put resp: &{cluster_id:14841639068965178418 member_id:10276657743932975437 revision:4 raft_term:3  [key:"mytaowu" create_revision:4 mod_revision:4 version:1 value:"hi tencent!" ] false 1 {} [] 0}

成功获取到对应的数据值,可以根据业务进行定制化开发。