当前位置: 代码迷 >> 综合 >> Consul 原理和使用简介
  详细解决方案

Consul 原理和使用简介

热度:6   发布时间:2023-12-18 05:59:54.0

说明

本文介绍了一个服务发现和配置共享的软件,简单介绍了 Consul 的原理和使用, 一篇小文抛砖引玉,希望能吸引感兴趣的童鞋一起探讨研究。

Consul 是什么

Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.
命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.
一致性协议采用 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 作为服务注册和配置管理的新星, 比较值得关注和研究.

Consul 的角色

client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.

<img src="https://www.consul.io/assets/images/consul-arch-b2478674.png" alt="consul-arch" class="bubble-markdown-image" target="_blank" rel="nofollow" "="" style="text-size-adjust: none; -webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); outline: 0px; max-width: 99%; height: auto; vertical-align: top; border: 1px solid rgb(222, 232, 239); margin: 10px 0px;">

安装 Consul

mac os x:

brew cask install consul

Linux 64bit:

wget https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
unzip 0.4.1_linux_amd64.zip
sudo mv consul /bin

其他系统的安装步骤,请参考官网文档.

初体验

启动:
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node Litao-MacBook-Pro -dc sz-1

查看成员:

consul members

查看节点:

curl 127.0.0.1:8500/v1/catalog/nodes

使用DNS协议查看节点信息:

dig @127.0.0.1 -p 8600 Litao-MacBook-Pro.node.consul

注册服务

注册两个 Mysql 服务的实例, 数据中心在 sz-1, 端口都是 3306. 具体为以下命令:

curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-1", "Address": \
"mysql-1.node.consul","Service": {"Service": "mysql", "tags": ["master","v1"], \
"Port": 3306}}' http://127.0.0.1:8500/v1/catalog/register
curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-2", "Address": \
"mysql-2.node.consul","Service": {"Service": "mysql", "tags": ["slave","v1"],\
"Port": 3306}}' http://127.0.0.1:8500/v1/catalog/register

curl http://127.0.0.1:8500/v1/catalog/service/mysql

 [
 {
    
 "Address": "mysql-1.node.consul",
 "Node": "mysql-1",
 "ServiceID": "mysql",
 "ServiceName": "mysql",
 "ServicePort": 3306,
 "ServiceTags": [
 "master",
 "v1"
 ]
 },
 {
    
 "Address": "mysql-2.node.consul",
 "Node": "mysql-2",
 "ServiceID": "mysql",
 "ServiceName": "mysql",
 "ServicePort": 3306,
 "ServiceTags": [
 "slave",
 "v1"
 ]
 }
]

dig @127.0.0.1 -p 8600 mysql.service.consul SRV

; <<>> DiG 9.10.0-P2 <<>> @127.0.0.1 -p 8600 mysql.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12821 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2 ;; WARNING: recursion requested but not available;; QUESTION SECTION: ;mysql.service.consul. IN SRV;; ANSWER SECTION: mysql.service.consul. 0 IN SRV 1 1 3306 mysql-2.node.sz-1.consul. mysql.service.consul. 0 IN SRV 1 1 3306 mysql-1.node.sz-1.consul.;; ADDITIONAL SECTION: mysql-2.node.sz-1.consul. 0 IN CNAME mysql-2.node.consul. mysql-1.node.sz-1.consul. 0 IN CNAME mysql-1.node.consul.;; Query time: 0 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Tue Dec 02 16:42:38 CST 2014 ;; MSG SIZE rcvd: 280 

参考链接

https://www.consul.io
http://txt.fliglio.com/2014/05/encapsulated-services-with-consul-and-confd/

  相关解决方案