Consul介绍
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
Consul 是什么
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public License 2.0 的协议进行开源。 Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对。一致性协议采用 Raft 算法,用来保证服务的高可用。 使用 GOSSIP 协议管理成员和广播消息,并且支持 ACL 访问控制。
Consul 的使用场景
- docker 实例的注册与配置共享
- coreos 实例的注册与配置共享
- vitess 集群
- SaaS 应用的配置共享
- 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
Consul 的优势
- 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。相比较而言,zookeeper 采用的是 Paxos,而 etcd 使用的则是 Raft。
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等。zookeeper 和 etcd 均不提供多数据中心功能的支持。
- 支持健康检查,etcd 不提供此功能。
- 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂,etcd 只支持 http 协议。
- 官方提供web管理界面, etcd 无此功能.
Consul 术语解释
- Agent: Consul集群中长时间运行的守护进程,以consul agent 命令开始启动. 在客户端和服务端模式下都可以运行,可以运行DNS或者HTTP接口, 它的主要作用是运行时检查和保持服务同步。
- Client: 客户端, 无状态, 以一个极小的消耗将接口请求转发给局域网内的服务端集群.
- Server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
- Datacenter: 数据中心,多数据中心联合工作保证数据存储安全快捷
- Consensus: 一致性协议使用的是Raft Protocol
- RPC: 远程程序通信
- Architecture of Consul: Consul的主要架构
- Gossip: 基于 Serf 实现的 gossip 协议,负责成员、失败探测、事件广播等。通过 UDP 实现各个节点之间的消息。分为 LAN 上的和 WAN 上的两种情形。
Consul主要架构图
Consul部署
下载consul 包
[root@snails ~]# wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
解压consul包
[root@snails ~]# unzip consul_0.6.4_linux_amd64.zip
[root@snails ~]# mv consul /usr/local
解压后只有唯一的一个consul文件,将其放到$PATH便可运行。
启动consul
[root@snails ~]# mkdir /opt/consul
[root@snails ~]# consul agent -server -bootstrap -data-dir=/opt/consul -node=consul -dc=consul -bind=10.0.40.159
一些常识
Server负责组成 cluster 的复杂工作(选举、状态维护、转发请求到 lead),以及 consul 提供的服务(响应 RCP 请求)。考虑到容错和收敛,一般部署 3 ~ 5 个比较合适。
第一个节点:
$ consul agent -data-dir=/tmp/consul -server -bootstrap-expect 1 -bind $IP
其他节点:
$ consul agent -data-dir=/tmp/consul -server -join $IP
什么是ACL?
ACL技术在路由器中被广泛采用,它是一种基于包过滤的流控制技术。控制列表通过把源地址、目的地址及端口号作为数据包检查的基本元素,并可以规定符合条件的数据包是否允许通过。
什么是Gossip协议? **
这个协议就是模拟人类中传播谣言的行为而来。首先要传播谣言就要有种子节点。种子节点每秒都会随机向其他节点发送自己所拥有的节点列表,以及需要传播的消息。任何新加入的节点,就在这种传播方式下很快地被全网所知道。
什么是服务注册?
一个服务将其位置信息在“中心注册节点”注册的过程。该服务一般会将它的主机IP地址以及端口号进行注册,有时也会有服务访问的认证信息,使用协议,版本号,以及关于环境的一些细节信息。
什么是服务发现?
服务发现可以让一个应用或者组件发现其运行环境以及其它应用或组件的信息。用户配置一个服务发现工具就可以将实际容器跟运行配置分离开。常见配置信息包括:ip、端口号、名称等。
当一项服务存在于多个主机节点上时,client端如何决策获取相应正确的IP和port。在传统情况下,当出现服务存在于多个主机节点上时,都会使用静态配置的方法来实现服务信息的注册。而当在一个复杂的系统里,需要较强的可扩展性时,服务被频繁替换时,为避免服务中断,动态的服务注册和发现就很重要。
相关开源项目:Zookeeper,Doozer,Etcd,强一致性的项目,这些项目主要用于服务间的协调,同时又可用于服务的注册。
什么是强一致性协议?
按照某一顺序串行执行存储对象读写操作, 更新存储对象之后, 后续访问总是读到最新值。 假如进程A先更新了存储对象,存储系统保证后续A,B,C进程的读取操作都将返回最新值。强一致性模型有几种常见实现方法, 主从同步复制, 以及quorum复制等。