consul特性
consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:
- service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
- health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
- key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
- multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
Consul架构
Consul的微服务一般都是集群,集群由一个个的Consul节点组成,在这些Consul节点里面,分为两种角色,Server 以及 Client。
Consul节点在启动时可以定义自身角色,Client、Server两种。
Client节点只负责转发外部请求,所有注册到当前节点的服务会被转发到server节点,向server节点进行键值对的读/写,本身是不持久化这些信息,是无状态的;
Server节点的职责是使用raft协议保证数据一致性,响应客户端的请求,维护集群状态,与其他数据中心交互,另外所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
节点之间通过gossip广播协议(谣言协议),进行节点之间的数据交互,最终大家达到一致。
consul概念
- Agent:Consul集群中长时间运行的守护进程,以consul agent 命令开始启动. 在客户端和服务端模式下都可以运行,可以运行DNS或者- - - HTTP接口, 它的主要作用是运行时检查和保持服务同步。
- Client:客户端, 无状态, 以一个极小的消耗将接口请求转发给局域网内的服务端集群.
- Server:服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
- Datacenter:数据中心,多数据中心联合工作保证数据存储安全快捷
- Consensus:一致性协议使用的是Raft Protocol
- RPC:远程程序通信
- Gossip:基于 Serf 实现的 gossip 协议,负责成员、失败探测、事件广播等。通过 UDP 实现各个节点之间的消息。分为 LAN 上的和 WAN 上的两种情形。
consul安装及测试安装
window下安装
开发模式部署
- 进入consul官网找到自己开发平台对应的安装包下载https://www.consul.io/downloads.html
- 下载完后,解压,得到一个可执行文件consul
- 随便找个地方放着
- 启动consul,这里我们先启动一个开发模式,该模式不能用于生产环境,因为该模式下不会持久化任何状态,该启动模式仅仅是为了快速便捷的启动单节点consul,-node结点名为=xxx,-ui可以用界面访问,默认能访问。 测试地址:http://localhost:8500。命令如下:
consul agent -dev -ui -node =xxx:
集群部署
三个节点或五个server节点组一个集群,不建议超过五个节点,为什么是单数,因为集群需要选举一个leader来保证数据一致性。票数要超过半数以上才能选举为leader。
基本的命令为:
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=172.16.2.100 -bind=172.16.2.100 -client=0.0.0.0 -datacenter=firstDataCenter -ui
-server 表示是以服务端身份启动
-bootstrap-expect=3 表示server集群最低节点数为3,低于这个值将工作不正常(注:类似zookeeper一样,通常集群数为奇数,方便选举,consul采用的是raft算法)
-data-dir 表示指定数据的存放目录(该目录必须存在)
-node 表示节点在web ui中显示的名称
-bind 表示绑定到哪个ip(有些服务器会绑定多块网卡,可以通过bind参数强制指定绑定的ip)
-client 指定客户端访问的ip(consul有丰富的api接口,这里的客户端指浏览器或调用方),0.0.0.0表示不限客户端ip
-datacenter 设置数据中心,这是配置代理运行的数据中心。每个节点都必须设置其它向数据中心报告
-ui
-join 选定一个IP加入集群
现在我们使用四台机器创建集群:172.16.2.100 172.16.0.118 172.16.3.190 172.16.3.69
- 启动server端,分别在上述三台服务器执行如下命令,我们下面只展示172.16.2.100,其他机器执行同样操作,注意-node,-bind,-data-dir三个参数根据实际来
consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=172.16.2.100 -bind=172.16.2.100 -client=0.0.0.0 -datacenter=firstDataCenter -ui
执行consul members可以查看当前节点信息
- 启动client端,在190机器上执行如下命令
consul agent -data-dir F:\consul -node=c1 -bind=172.16.3.190 -datacenter=firstDataCenter
同理,执行 consul members可查看当前节点信息
- 组建cluster
现在我们有了3个server node + 1个client node,当前每个节点都是独立存在的
要让节点加入集群,先瞄定其中任意一个节点IP(假设:其它3个节点,都加入172.16.xx.190),可以运行以