目录
说明
简介
了解 Consul
Consul 使用场景
Consul 优势
Consul 中的概念
安装
准备 Consul 镜像
安装单个 Consul
组装集群 Consul
总结
引用和附件
说明
本文主要介绍怎么使用 Docker https://www.docker.com/ 在 Linux 环境部署 Consul https://www.consul.io/ 集群, 如果你对 Docker 不了解的同学, 请先学习一下 Docker. 推荐一本学习 Docker 在线书籍 :[Docker 入门到实践] https://docker_practice.gitee.io/ .
本文介绍 Consul 部署已经在准备好 Docker 环境好前提下开始的.
- CentOS 7.3
- Docker CE 18.09.2
简介
了解 Consul https://www.consul.io/
Consul https://www.consul.io/ 是一个支持多数据中心分布式高可用的 服务发现 和 配置共享 的服务软件, 由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持 健康检查, 并允许 HTTP ,GRPC 和 DNS 协议调用 API 存储键值对.
命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.
一致性协议采用 Raft 算法, 用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.
Consul 使用场景
Docker 实例的注册与配置共享
Coreos 实例的注册与配置共享
SaaS 应用的配置共享, 服务发现和健康检查.
vitess 集群
与 confd 服务集成, 动态生成 nginx 和 haproxy 配置文件
Consul 优势
市面现在有很多类似的软件比如: zookeeper ,Etcd,doozerd,eureka,Consul 相比这些软件有什么优势呢?
官方出了相比较这些软件区别的一篇 Consul vs. ZooKeeper,doozerd,etcd https://www.consul.io/intro/vs/zookeeper.html 文章.
下面总结一下 Consul 的优势有那几点:
使用 Raft https://www.jdon.com/artichect/raft.html 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
支持 多数据中心, 内外网的服务采用不同的端口进行监听. 多数据中心集群可以避免单数据中心的单点故障, 而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
支持 健康检查. etcd 不提供此功能.
支持 HTTP,DNS 和 GPRS 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
官方提供 web 管理界面, etcd 无此功能.
综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究.
Consul 中的概念
Client: 表示 Consul 客户端模式, 是 Consul 节点的一种模式, 所有注册到 Client 节点的服务会被转发到 Server . 本身无状态不持久化如何数据. Client 通过 HTTP,DNS,GRPC 接口请求转发给局域网内的服务端集群.
Server: 表示 Consul 的服务端模式, Server 功能和 Client 都一样, 不同的是 Server 持久化数据到本地. 在局域网内与本地 Client 通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 Server 数量推荐为 3 个或是 5 个.
Server-Leader : 表示这个 Server 是它们的老大, 它和其它 Server 不一样的一点是, 它需要负责同步注册的信息给其它的 Server 节点, 同时也要负责各个节点的健康监测. 如果 Leader 宕机了, 通数据中心的所有 Server 内部会使用 Raft https://www.jdon.com/artichect/raft.html 算法来在其中选取一个 Leader 出来.
Agent :Agent 是 Consul 的核心进程, Agent 的工作是维护成员关系信息, 注册服务, 健康检查, 响应查询等等. Consul 集群的每一个节点都必须运行 agent 进程.
其它
需要了解 Consul 原理, 的通信方式, 协议信息, 算法, 帮助文档等. 有兴趣可以前往官方查看 官方文档 https://www.consul.io/docs/agent/basics.html .
文档: https://www.consul.io/docs/agent/basics.html
官网: https://www.consul.io/
安装
准备 Consul 镜像
拉取 Consul 镜像到本地, 我本次讲解的是 Consul V1.4.4 版本.
- $ docker pull consul:1.4.4
- 1.4.4: Pulling from library/consul
- 5d20c808ce19: Pull complete
- ded83912d17e: Pull complete
- a7fbb7ddd3ea: Pull complete
- 6cdcd1f7ea42: Pull complete
- a0ea9ef64acd: Pull complete
- 267ee3fb0b30: Pull complete
- Digest: sha256:9113b1043308b4193d2be8516c64fcdc2e9740e3c626be058076de697c407be7
- Status: Downloaded newer image for consul:1.4.4
Consul 镜像提供了几个个常用环境变量
CONSUL_CLIENT_INTERFACE
: 配置 Consul 的
-client=<interface ip>
命令参数.
CONSUL_BIND_INTERFACE
: 配置 Consul 的
-bind=<interface ip>
命令参数.
CONSUL_DATA_DIR : 配置 Consul 的数据持久化目录.
CONSUL_CONFIG_DIR: 配置 Consul 的配置文件目录.
Consul 镜像的详细说明请前往官方使用文档.
安装单个 Consul
先启动一个单机版 Consul, 由于单机肯定需要安装 Server 模式的 Consul.
启动 Consul 和 Web 管理器
我们启动一个命名为 consul_server_1 的 Docker 容器来运行 Consul , 启动的 Consul 的版本是 1.4.4.CONSUL_BIND_INTERFACE 设置为默认桥接网络 eth0 并且主机上不显示任何服务.
- $ docker run -d -p 8500:8500 -v /data/consul:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul:1.4.4 agent -server -Bootstrap -ui -node=1 -client='0.0.0.0'
- 9e86237f42d3c2cefab5de0dc9888d2bd4ed3e7a1aa2ca8e1ebc54cef9ea47b7
提示:/consul/data 是 Consul 持久化地方, 如果需要持久化那 Dooker 启动时候需要给它指定一个数据卷 -v /data/consul:/consul/data.
Consul 命令简单介绍
agent : 表示启动 Agent 进程.
-server: 表示启动 Consul Server 模式.
-client: 表示启动 Consul Cilent 模式.
-Bootstrap: 表示这个节点是 Server-Leader , 每个数据中心只能运行一台服务器. 技术角度上讲 Leader 是通过 Raft 算法选举的, 但是集群第一次启动时需要一个引导 Leader, 在引导群集后, 建议不要使用此标志.
-ui: 表示启动 Web UI 管理器, 默认开放端口
8500
, 所以上面使用 Docker 命令把 8500 端口对外开放.
-node: 节点的名称, 集群中必须是唯一的.
-client: 表示 Consul 将绑定客户端接口的地址, 0.0.0.0 表示所有地址都可以访问.
-join: 表示加入到某一个集群中去. 如:-JSON=192.168.1.23
Web 管理器
上面命令已经启动了 Consul 和 Web 管理器, 我们现在打开 Web 管理器来看一下是否启动成功. 通过浏览器浏览 Http://{serverIp}:8500 .
上图显示已经启动成功了, 启动了一个节点名称为 -node=1 的节点 , 并且可以通过管理器管理 Node 节点, Key/Value 功能等.
这里就不讲怎么使用 Consul , 我在附件中引用几篇文章你可以去看看, 更细化怎么使用可以去查相关资料.
组装集群 Consul
上面完成了一个单机版的 Consul 部署, 下面我们将实现图中的的集群架构 Consul 部署.
Server 加入集群
我们在上面单机版的基础上面来拓展集群, 这样可以模拟集群的一步一步发展. 下面我将加入二个 Server 模式的 Consul 到集群中, Server 模式在集群中建议是 三个以上, 这样更好的避免因为 Server 的宕机导致整个集群挂掉的风险.
通过命令查一下当前运行 Consul 集群信息
- $ docker exec consul_server_1 consul members
- Node Address Status Type Build Protocol DC Segment
- 1 172.17.0.2:8301 alive server 1.4.4 2 dc1 <all>
加入到集群, 命名为 -node=2 ,-node=3.
上面通过命令获取到引导 Consul 的 Ip 地址 172.17.0.2 ,
- // -node=2
- $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_2 consul:1.4.4 agent -server -node=2 -join='172.17.0.2'
- 5d999ade4f96e04b5a1dbbcb69dc117fafa11d450fd17268884b1254971a7450
- // -node=3
- $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_3 consul:1.4.4 agent -server -node=3 -join='172.17.0.2'
- 459948e6bd26e2b0b556ac6b4c5593b5dba2e4dc2b79d506d6ba4644f4ab0970
通过 Web 管理器查看是否成功加入集群中
Client 加入集群
Client 在 Consul 集群中起到了代理 Server 的作用, Client 模式不持久化数据. 一般情况每台应用服务器都会安装一个 Client , 这样可以减轻跨服务器访问带来性能损耗. 也可以减轻 Server 的请求压力.
加入集群
- $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_4 consul:1.4.4 agent -client -node=4 -join='172.17.0.2' -client='0.0.0.0'
- 6e0604490eb49363d28249a5277c03173b258aa55965d70eb5b5438a0a6b7eea
- $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_5 consul:1.4.4 agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
- 25e9792c6d5949ba3fcf73432ed2933568726d214d6819ab52d2b6eaa00d7842
- $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_6 consul:1.4.4 agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
- c7333068c1679f8f9e8c8c0be0fcf68f93f85b2c45dd177e4757217bdfa55d7a
检查 Client 是否加入集群中
$ docker exec consul_server_1 consul members Node Address Status Type Build Protocol DC Segment 1 172.17.0.2:8301 alive server 1.4.4 2 dc1 <all> 2 172.17.0.3:8301 alive server 1.4.4 2 dc1 <all> 3 172.17.0.4:8301 alive server 1.4.4 2 dc1 <all> 25e9792c6d59 172.17.0.6:8301 alive client 1.4.4 2 dc1 <default> 6e0604490eb4 172.17.0.5:8301 alive client 1.4.4 2 dc1 <default> c7333068c167 172.17.0.7:8301 alive client 1.4.4 2 dc1 <default>
总结
Docker 部署 Consul 其实很简单, Consul 集群的配置主要是 Consul 的命令需要了解, 建议多看看 Consul 的官方文档.
引用和附件
Consul 原理和使用简介 : https://blog.coding.net/blog/intro-consul?type=hot
Consul 镜像仓库地址 :https://hub.docker.com/\_/consul https://hub.docker.com//_/consul
Consul 镜像使用文档:
Consul 官方文档 : https://www.consul.io/docs/agent/basics.html
使用 Consul 和 Registration 对 Docker 容器进行服务发现
基于 Consul+Registrator+Nginx 实现容器服务自动发现的集群框架
http://www.mamicode.com/info-detail-2222200.html
.NET Core 微服务之基于 Consul 实现服务治理
https://www.cnblogs.com/edisonchou/p/9124985.html
来源: https://www.cnblogs.com/lfzm/p/10633595.html