etcd介绍
etcd是使用Go语言开发的一个开源的、高可用的分布式key—value存储系统,可以用于配置共享和服务的注册和发现,基于raft算法实现具有强一致性
etcd中涉及了数据一致性、多版本并发控制、watch监控、磁盘IO读写等知识点
etcd的特性:
1.简单:etcd的安装简单,为用户提供了HTTP的接口,使用也很简单
2.存储:etcd的基本功能,基本信息存储在文件中
3.Watch机制:watch指定的键的更改会通知
4.安全通信:SSL证书验证
5.高性能:2K/s读操作,提供了基准测试的工具
6.一致可靠:raft一致性算法
类似的项目有zookeeper和consul。
etcd具有以下的特点:
1.完全复制:集群中的每个节点都可以使用完整的存档
2.高可用性:Etcd可用于避免硬件的单点故障或网络问题
3.一致性:每次读取都会返回跨多主机的最新写入
4.简单:包括一个定义良好、面向用户的API(gRPC)
5.安全:实现了带有可选的客户端证书身份验证的自动化TLS
6.快速:每秒10000次写入的基准速度
7.可靠:使用Raft算法实现了强一致、高可用的服务存储目录
etcd的常见分布式场景:
1.键值对存储
2.服务注册与发现
3.消息订阅与发布
4.分布式锁
go语言操作etcd
首先在后台启动etcd
写一段go代码
package main import ( "context" "fmt" clientv3 "go.etcd.io/etcd/client/v3" "time" ) func main() { // 创建客户端,连接etcd cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"127.0.0.1:2379"}, DialTimeout: 5 * time.Second, }) if err != nil { fmt.Printf("connect to etcd failed, err:%v\n", err) return } fmt.Println("connect to etcd success") defer cli.Close() str := `[{"path":"d:/logs/s4.logs","topic":"s4_logs"},{"path":"d:/logs/web.logs","topic":"web_logs"}` // put操作 _, err = cli.Put(context.TODO(), "collect_log_conf", str) if err != nil { fmt.Printf("put to etcd failed, err:%v\n", err) return } get操作 resp, err := cli.Get(context.TODO(), "collect_log_conf") // 获取指定Key的值 if err != nil { fmt.Printf("get to etcd failed") return } for _, ev := range resp.Kvs { fmt.Printf("key:%s,value:%s\n", ev.Key, ev.Value) } delete 删除key //if _,err = cli.Delete(context.TODO(), "testetcd");err != nil{ // fmt.Println("delete key failed") //}else{ // fmt.Println("delete key success") //} }
也可以直接使用ectdctl工具查看key
etcdctl.exe --endpoints=127.0.0.1:2379 get collect_log_conf