命令记不住

登陆

分布式存储 etcd 简介

分布式存储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原理演示:

https://raft.github.io/

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:etcd
etcd实现了分布式(集群)和一致性(算法)

etcd

4.etcd环境准备

下载etcd

https://github.com/etcd-io/etcd/releases

安装etcd

解压文件,添加路径到环境变量PATH

下载安装etcd-manager

https://etcdmanager.io/

安装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\trace

go 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/clientv3 
Server端:
命令行参数
.\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使用
    启动watch
Watch:
初始化
    监控指定目录
    获取服务器列表
    添加地址列表到gRPC连接
监控变化
    服务记录添加
    服务记录删除
推荐阅读