
分布式存储etcd
1.服务发现
服务发现
- 架构演进
- 分治
- 解耦
- 消除单点故障
- 动态切换
服务的两种状态:
- 无状态服务(容易水平扩容)
- 有状态服务(业务的核心)
etcd概述
- KV存储,按目录结构
- 集群支持,一致性算法raft
- follower,candidate,leader
- 选举
- 值更新,复制(两阶段提交)
- Watch机制
2.raft选举算法
选举机制:
- leader
- candidate
- follower
选举流程:
flollower -> candidate -> leader
raft数据更新
第一阶段:
leader记录log(uncommitted)
日志复制到follower
多少follower响应,操作成功,响应客户端
第二阶段:
leader commit
通知follower
raft原理演示:
etcd测试命令:
ETCDCTL_API=3 .\etcdctl # 查看所有命令 ETCDCTL_API=3 .\etcdctl put "hello" "world" ETCDCTL_API=3 .\etcdctl get "hello" # 顺序存储的键可以使用前缀模糊查询 ETCDCTL_API=3 .\etcdctl put "/users/user1" "zs" ETCDCTL_API=3 .\etcdctl put "/users/user2" "ls" ETCDCTL_API=3 .\etcdctl get "/users/" --prefix # 查询全部该 ETCDCTL_API=3 .\etcdctl del "/users/user2" 前缀 ETCDCTL_API=3 .\etcdctl watch "/users/" --prefix # 监听该前缀数据变化,此时另起命令行操作数据,则当前命令行能监听到
3.CAP介绍
- 分区容错,总是需要支持(2台server)
一致性,在全部节点写完成之前,不能返回
- etcd实现了一致性(raft算法)
可用性,要求任一节点立刻返回数据
- 大部分组件,支持可用性
说明:
ap:两台独立的服务器,网线断掉 ac:单机 cp:etcdetcd实现了分布式(集群)和一致性(算法)
4.etcd环境准备
下载etcd
https://github.com/etcd-io/etcd/releases
安装etcd
解压文件,添加路径到环境变量PATH
下载安装etcd-manager
安装etcd go package
go get go.etcd.io/etcd/clientv3注意,etcd官方包的vendor,有个冲突,需要禁用官方目录,使用我们电脑上本机的trace包,具体做法是
删除
src\go.etcd.io\etcd\vendor\golang.org\x\net下的trace目录,从而使用到src\golang.org\x\net\tracego module 环境下解决etcd和grpc版本冲突,参考
https://github.com/etcd-io/etcd/pull/11564/files
获得demo源代码(grpcdemo)
etcd相关地址
https://etcd.io/ https://github.com/etcd-io/etcd/releases https://etcd.io/docs/v3.4.0/integrations/ https://etcdmanager.io/
5.Go接入etcd
Golang package
go get github.com/coreos/etcd/clientv3Server端:
命令行参数 .\server.exe -EtcdAddr 127.0.0.1:2379 注册到etcd 监听操作系统信号(中断)etcd注册服务:
连接etcd服务器 循环心跳检测 心跳发生器 KeepAlive 创建租约(Lease) 自动续租(KeepAlive) 清空续租响应消息Client端:
创建etcd解析器(Resolver) 解析器注册到grpc/resolver 使用名称拨号 scheme://authority/endpoint_name 应用负载均衡策略 获取服务端连接 改造代码,无限循环调用服务etcd resolver:
类成员设计,全局变量 实现Build方法 连接etcd服务器 保存连接给watch使用 启动watchWatch:
初始化 监控指定目录 获取服务器列表 添加地址列表到gRPC连接 监控变化 服务记录添加 服务记录删除
