etcd

加上一台服务器,然后 修改网关服务器的配置表 加上 新加的 服务器的IP 和端口,然后重启网关。还有就是 当 后面的 服务器万一 down 了,网关是不知道的,还会把 流量转发到 down的 服务器上,造成 服务的不可用。



etcd的简单介绍:
因为前面说的问题我们就需要etcd 这类产品了,etcd 是一个 分布式 的高一致性的 键值存储系统。我们每次网关 后面加一个服务,只需要向etcd 注册 该服务(其实就是 存一个值)然后向etcd 发送心跳,当etcd 没有检测到心跳就会 把这个键值对 删了(这整个动作是etcd里的租约模式),网关那边 就只需要 watch 这个 key ,就能够知道 所有服务的所有动态了。



etcd的 租约模式:客户端申请 一个租约 并设置 过期时间,每隔一段时间 就要 请求 etcd 申请续租。客户端可以通过租约存key。如果不续租 ,过期了,etcd 会删除这个租约上的 所有key-value。类似于心跳模式。
一般相同的服务存的 key 的前缀是一样的 比如 “server/001”=> “127.0.0.1:1212” 和 ”server/002”=>”127.0.0.1:1313” 这种模式,然后 客户端 就直接 匹配 “server/” 这个key。



1.创建一个client 连到etcd。
2.匹配到所有相同前缀的 key。把值存到 serverList 这个map里面。
3 watch这个 key前缀,当有增加或者删除的时候 就 修改这个map。
4所以这个map就是 实时的 服务列表



https://github.com/mistaker/etcdTool

etcd是什么?



A highly-available key value store for shared configuration and service discovery.是一个键值存储仓库,用于配置共享和服务发现



概念:高可用的分布式key-value存储,可以用于配置共享和服务发现。



类似项目:zookeeper和consul



开发语言:Go



接口:提供restful的http接口,使用简单



实现算法:基于raft算法的强一致性、高可用的服务存储目录



简单:基于HTTP+JSON的API让你用curl命令就可以轻松使用。
安全:可选SSL客户认证机制。
快速:每个实例每秒支持一千次写操作。
可信:使用Raft算法充分实现了分布式。
应用场景:



服务发现和服务注册
配置中心
分布式锁
master选举
和ZK类似,ETCD有很多使用场景,包括:



配置管理
服务注册于发现
选主
应用调度
分布式队列
分布式锁
ETCD集群是一个分布式系统,由多个节点相互通信构成整体对外服务,每个节点都存储了完整的数据,并且通过Raft协议保证每个节点维护的数据是一致的。



服务发现(Service Discovery)



要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。从本质上说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以进行查找和连接。



消息发布与订阅
在分布式系统中,最为适用的组件间通信方式是消息发布与订阅机制。具体而言,即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦相关主题有消息发布,就会实时通知订阅者。通过这种方式可以实现分布式系统配置的集中式管理与实时动态更新。



负载均衡



在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。这样的实现虽然会导致一定程度上数据写入性能的下降,但是却能实现数据访问时的负载均衡。因为每个对等服务节点上都存有完整的数据,所以用户的访问流量就可以分流到不同的机器上。



etcd搭建
a. 下载etcd release版本:https://github.com/coreos/etcd/releases/ b. ./bin/etcd即可以启动etcd c. 使用etcdctl工具更改配置



https://github.com/coreos/etcd/releases/download/v3.3.0/etcd-v3.3.0-linux-amd64.tar.gz



[root@greg02 etcd3.3]#ls
default.etcd Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
[root@greg02 etcd3.3]#etcdctl set test asdf
asdf
[root@greg02 etcd3.3]#etcdctl get test
asdf



~$brew search etcd
==> Formulae
etcd netcdf



==> Casks
qlnetcdf



$brew install etcd



#执行etcd即可启动服务



etcd



etcdserver: name = default name表示节点名称,默认为default
data-dir保存日志和快照的目录,默认为当前工作目录default.etcd/
在http://localhost:2380和集群中其他节点通信
在http://localhost:2379提供HTTP API服务,供客户端交互。等会配置webui就是这个地址
etcdserver: heartbeat = 100ms leader发送心跳到followers的间隔时间
etcdserver: election = 1000ms 重新投票的超时时间,如果follow在该时间间隔没有收到心跳包,会触发重新投票,默认为1000ms



安装etcd webui
记得启动Etcd服务。
先安装node,git环境,然后clone



git clone https://github.com/henszey/etcd-browser.git
cd etcd-browser/
vim server.js

编辑server.js,修改内容如下:



var etcdHost = process.env.ETCD_HOST || ‘127.0.0.1’; # etcd 主机IP
var etcdPort = process.env.ETCD_PORT || 4001; # etcd 主机端口
var serverPort = process.env.SERVER_PORT || 8000; # etcd-browser 监听端口
然后启动



node server.js
访问:http://127.0.0.1:8000/



etcd命令行操作key
除了 HTTP API 外,etcd 还提供了 etcdctl 命令行工具和 etcd 服务交互。
etcdctl get / –prefix –keys-only 查看所有key
etcdctl –endpoints=[172.31.22.xxx:2379] get / –prefix –keys-only 查看所有key(参数加上etcd服务地址)
etcdctl get /mechat/websocket/service/mapping 查看某个key的值
etcdctl –endpoints=[172.31.22.142:2379] get /mechat/websocket/service/mapping 查看某个key的值



etcdctl del /mechat/websocket/service/mapping 删除某个key
etcdctl put /mechat/websocket/service/mapping ‘io.test.baidu.com:443->172.31.19.xxx:8085’ 修改某个key的值


Category golang