docker 搭建etcd集群/单机
前言
- 基于docker环境和docker-compose
- 当前etcd 3.3.8
目录结构
etcd1,2,3 组成集群
etcd0 单机
deltaprojects/etcdkeeper etcd可视化管理工具
docker-compose.yml 如下
# cd etcd/
docker compose up .
version: '3.8'
networks:
etcd_net:
name: etcd_net
services:
etcd0:
image: quay.io/coreos/etcd
container_name: etcd0
command: etcd -name etcd0 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380
ports:
- 2379:2379
- 2479:2380
volumes:
- ./etcd0/data:/etcd-data
networks:
- etcd_net
etcd1:
image: quay.io/coreos/etcd
container_name: etcd1
command: etcd -name etcd1 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
ports:
- 2380:2379
- 2480:2380
volumes:
- ./etcd1/data:/etcd-data
networks:
- etcd_net
etcd2:
image: quay.io/coreos/etcd
container_name: etcd2
command: etcd -name etcd2 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
ports:
- 2381:2379
- 2481:2380
volumes:
- ./etcd2/data:/etcd-data
networks:
- etcd_net
etcd3:
image: quay.io/coreos/etcd
container_name: etcd3
command: etcd -name etcd3 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
ports:
- 2382:2379
- 2482:2380
volumes:
- ./etcd3/data:/etcd-data
networks:
- etcd_net
etcdkeeper:
image: deltaprojects/etcdkeeper
container_name: etcdkeeper
ports:
- 8088:8080
links:
- etcd0
- etcd1
- etcd2
- etcd3
networks:
- etcd_net
golang测试代码
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/client/v3"
"time"
)
func main() {
cli := InitEtcd([]string{"http://127.0.0.1:2482", "http://127.0.0.1:2480", "http://127.0.0.1:2481"})
defer cli.Close()
ctx0, _ := context.WithTimeout(context.Background(), time.Second*10)
go Watch(cli, ctx0, "/node")
time.Sleep(time.Second)
ctx, _ := context.WithTimeout(context.Background(), time.Second*5)
err := Put(cli, ctx, "/node", "1")
if err != nil {
panic(err)
}
ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
err = Read(cli, ctx, "/node")
if err != nil {
panic(err)
}
ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
err = Put(cli, ctx, "/node", "2")
if err != nil {
panic(err)
}
ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
err = Read(cli, ctx, "/node")
if err != nil {
panic(err)
}
ctx, _ = context.WithTimeout(context.Background(), time.Second*5)
err = Delete(cli, ctx, "/node")
if err != nil {
panic(err)
}
select {
case <-ctx0.Done():
}
}
func InitEtcd(addr []string) *clientv3.Client {
cli, err := clientv3.New(clientv3.Config{
Endpoints: addr,
DialTimeout: 5 * time.Second,
})
if err != nil {
panic(fmt.Sprintf("connect to etcd failed, err:%v\n", err))
}
fmt.Println("connect to etcd success")
return cli
}
func Watch(cli *clientv3.Client, ctx context.Context, key string) {
rch := cli.Watch(ctx, key, clientv3.WithPrefix()) // 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)
}
}
}
func Put(cli *clientv3.Client, ctx context.Context, key string, value string) error {
defer ctx.Done()
_, err := cli.Put(ctx, key, value)
return err
}
func Read(cli *clientv3.Client, ctx context.Context, key string) error {
defer ctx.Done()
resp, err := cli.Get(ctx, key)
if err != nil {
return err
}
for _, ev := range resp.Kvs {
fmt.Printf("Type: %s Key:%s Value:%s\n", "READ~~~~", ev.Key, ev.Value)
}
return nil
}
func Delete(cli *clientv3.Client, ctx context.Context, key string) error {
defer ctx.Done()
_, err := cli.Delete(ctx, key)
return err
}
/*
GOROOT=/Users/zyj/go/go1.16 #gosetup
GOPATH=/Users/zyj/go #gosetup
/Users/zyj/go/go1.16/bin/go build -o /private/var/folders/18/c2k36qyx3hl6d3dg8ccs876r0000gn/T/___go_build_lib_demo_etcd lib_demo/etcd #gosetup
/private/var/folders/18/c2k36qyx3hl6d3dg8ccs876r0000gn/T/___go_build_lib_demo_etcd #gosetup
connect to etcd success
Type: PUT Key:/node Value:1
Type: READ~~~~ Key:/node Value:1
Type: PUT Key:/node Value:2
Type: READ~~~~ Key:/node Value:2
Type: DELETE Key:/node Value:
Process finished with exit code 0
*/
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiagfkh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22