部署步骤
1.安装etcd
git clone -b v3.5.0 https://github.com/etcd-io/etcd.git cd etcd ./build.sh export PATH="$PATH:`pwd`/bin" etcd --version
2.组建集群
在每个etcd节点上,指定集群成员
TOKEN=token-01 CLUSTER_STATE=new NAME_1=machine-1 NAME_2=machine-2 NAME_3=machine-3 HOST_1=192.168.135.133 HOST_2=192.168.135.134 HOST_3=192.168.135.135 CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
在对应的机器上运行对应指令
# For machine 1 THIS_NAME=${NAME_1} THIS_IP=${HOST_1} etcd --data-dir=data.etcd --name ${THIS_NAME} \ --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \ --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} # For machine 2 THIS_NAME=${NAME_2} THIS_IP=${HOST_2} etcd --data-dir=data.etcd --name ${THIS_NAME} \ --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \ --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN} # For machine 3 THIS_NAME=${NAME_3} THIS_IP=${HOST_3} etcd --data-dir=data.etcd --name ${THIS_NAME} \ --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \ --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
3. 现在etcd准备好了,使用etcdctl连接到etcd
export ETCDCTL_API=3 HOST_1=192.168.135.133 HOST_2=192.168.135.134 HOST_3=192.168.135.135 ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379 etcdctl --endpoints=$ENDPOINTS member list
Golang实现CRUD
package main import ( "context" "fmt" "go.etcd.io/etcd/client/v3" "time" ) func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"192.168.135.133:2379", "192.168.135.134:2379", "192.168.135.135:2379"}, DialTimeout: 5 * time.Second, }) if err != nil { fmt.Printf("connect to etcd failed, err:%v\n", err) return } defer cli.Close() fmt.Println("connect to etcd success") defer cli.Close() go Watch(cli) Create(cli) Read(cli) Delete(cli) Update(cli) select {} } func Watch(cli *clientv3.Client) { rch := cli.Watch(context.Background(), "name") // type WatchChan <-chan WatchResponse for wresp := range rch { for _, ev := range wresp.Events { fmt.Printf("Type: %s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value) } } fmt.Println("out") } func Create(cli *clientv3.Client) { // put ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) _, err := cli.Put(ctx, "name", "wxf") cancel() if err != nil { fmt.Printf("put to etcd failed, err:%v\n", err) return } } func Read(cli *clientv3.Client) { //get ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) resp, err := cli.Get(ctx, "name") cancel() if err != nil { fmt.Printf("get from etcd failed, err:%v\n", err) return } for _, ev := range resp.Kvs { fmt.Printf("Type: %s Key:%s Value:%s\n", "READ", ev.Key, ev.Value) } } func Update(cli *clientv3.Client) { // put ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) _, err := cli.Put(ctx, "name", "xyy") cancel() if err != nil { fmt.Printf("put to etcd failed, err:%v\n", err) return } } func Delete(cli *clientv3.Client) { //del ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) _, err := cli.Delete(ctx, "name") cancel() if err != nil { fmt.Printf("delete from etcd failed, err:%v\n", err) return } }
参考链接
安装etcd
click me
部署etcd
click me
Golang clientv3API
click me