etcd集群踩坑部署以及Go语言开发案例

本文详细介绍如何在三台服务器上安装并配置Etcd集群,包括集群启动脚本的编写及解决常见问题的方法。此外,还提供了两个Go语言示例程序,演示如何使用Etcd作为配置中心进行数据的发送与监听。

1 安装etcd

在两台服务器上执行下面的命令,安装etcd:

yum -y install etcd

执行下面的命令,查看etcd:

yum list installed |grep -i etcd

如果出现如下结果,表示安装成功:

etcd.x86_64                 3.3.11-2.el7.centos            @extras

 

三台机器都装一下

然后编写集群启动脚本

第一台服务器 node1

TOKEN=token-01
CLUSTER_STATE=new
CLUSTER=n1=http://192.168.0.102:2380,n2=http://192.168.0.103:2380,n3=http://192.168.0.104:2380

etcd --data-dir=data.etcd --name n1 \
	--initial-advertise-peer-urls http://192.168.0.102:2380 --listen-peer-urls http://192.168.0.102:2380 \
	--advertise-client-urls http://192.168.0.102:2379 --listen-client-urls http://192.168.0.102:2379 \
	--initial-cluster ${CLUSTER} \
	--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

启动

sudo sh /home/etcd/etcd_start.sh

第二台服务器 node2

TOKEN=token-01
CLUSTER_STATE=new
CLUSTER=n1=http://192.168.0.102:2380,n2=http://192.168.0.103:2380,n3=http://192.168.0.104:2380

etcd --data-dir=data.etcd --name n2 \
	--initial-advertise-peer-urls http://192.168.0.103:2380 --listen-peer-urls http://192.168.0.103:2380 \
	--advertise-client-urls http://192.168.0.103:2379 --listen-client-urls http://192.168.0.103:2379 \
	--initial-cluster ${CLUSTER} \
	--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

启动

sudo sh /home/etcd/etcd_start.sh

第三台服务器 node3

TOKEN=token-01
CLUSTER_STATE=new
CLUSTER=n1=http://192.168.0.102:2380,n2=http://192.168.0.103:2380,n3=http://192.168.0.104:2380

etcd --data-dir=data.etcd --name n3 \
	--initial-advertise-peer-urls http://192.168.0.104:2380 --listen-peer-urls http://192.168.0.104:2380 \
	--advertise-client-urls http://192.168.0.104:2379 --listen-client-urls http://192.168.0.104:2379 \
	--initial-cluster ${CLUSTER} \
	--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

启动

sudo sh /home/etcd/etcd_start.sh

 注意点

1 启动后互相之间无法通信,一般是因为防火墙的原因    执行这命令  systemctl stop firewalld
2 每一个节点里IP就是服务器IP

下边 写两份代码测试一下

第一份 发送/获取数据操作

基础操作.go

package main

import (
	"context"
	"fmt"
	"os"
	"time"

	"go.etcd.io/etcd/clientv3"
	//"github.com/coreos/etcd/clientv3"   //这里的话这两个库都是OK的
)

func main1() {
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"192.168.0.102:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		// handle error!
		fmt.Printf("connect to etcd failed, err:%v\n", err)
		return
	}
	fmt.Println("connect to etcd success")
	defer cli.Close()
	// put
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	_, err = cli.Put(ctx, "q1mi", "dsb")
	cancel()
	if err != nil {
		fmt.Printf("put to etcd failed, err:%v\n", err)
		return
	}
	// get
	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
	resp, err := cli.Get(ctx, "qimi")
	cancel()
	if err != nil {
		fmt.Printf("get from etcd failed, err:%v\n", err)
		return
	}
	for _, ev := range resp.Kvs {
		fmt.Printf("%s:%s\n", ev.Key, ev.Value)
	}
}

func main() {
	etcdCli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"192.168.0.104:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		fmt.Println("clientv3.New", err)
		os.Exit(-1)
	}
	defer etcdCli.Close()
	fmt.Println("etcd runing...")

	//发送数据
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	_, err = etcdCli.Put(ctx, "张三", "50个W")
	cancel()
	if err != nil {
		fmt.Println("etcdCli.Put", err)
		os.Exit(-1)
	}

	//读取指定数据
	ctx, cancel = context.WithTimeout(context.Background(), time.Second)
	resp, err := etcdCli.Get(ctx, "张三")
	if err != nil {
		fmt.Println("etcdCli.Get", err)
		os.Exit(-1)
	}
	cancel()
	fmt.Println(resp)

}

 

监听数据.go

package main

import (
	"context"
	"fmt"
	"github.com/coreos/etcd/clientv3"
	"time"
)

func main() {
	fmt.Println("wach...")

	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"192.168.0.102:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		// handle error!
		fmt.Printf("connect to etcd failed, err:%v\n", err)
		return
	}
	fmt.Println("connect to etcd success")
	defer cli.Close()

	wachChan := cli.Watch(context.Background(),"张三")

	for wachdata := range wachChan{
		for _,ev := range wachdata.Events{
			fmt.Printf("Type: %s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
		}
	}

}

 

这里也有几个问题需要注意

1  ectd  这个包你可能不好下载导下来  这里建议你直接    go get go.etcd.io/etcd/clientv3

2 这个时候会又发生另一个问题 他会报个错说个版本啥的 其实就是因为grpc版本不一致导致的  在 go.mod 设置一下就行     在最下面加一行这个    replace google.golang.org/grpc => google.golang.org/grpc v1.26.0     备注 问题URL  报错和这个一样 http://blog.jwcode.cn/index/blog/reading?rd=43

 

下面说一下  这份代码应用场景

我们将etcd 当成配置中心
第一份代码 发送数据到  104 的服务器上

104的服务器收到就会通知到第二份代码 

 

同时因为我们链接的服务器IP 但是数据是同步的 这样我们也同时验证了这个集群是OK的

 

.

.

.

.

.

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JwCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值