Consul

内容纲要

功能

实现分布式系统的服务发现与配置

特点

分布式、高可用、可横向扩展

角色

  • Server
    • 维护 Cluster 信息(建议至少 3 个节点以上)
    • 多节点选举使用 Raft 协议
  • Client
    • 维护自身状态
    • 将 DNS 、HTTP 接口请求转发给服务端

Cluster

由部署了 Consul Agent 的节点组成;Cluster 由 Server 和 Client 组成

特性

  • 服务发现
    • 通过 DNS 或 HTTP 的方式来注册或发现服务
  • 健康检测
    • Client 提供健康检查
  • K/V 存储
    • 动态配置、功能标记、领袖选举
  • 多数据中心

优点

  • 简单易用、不需集成SDK
  • 自带健康检查
  • 支持多数据中心
  • 提供 Web 管理界面

缺点

  • 不能实时获取服务信息变化的通知

使用

端口

  • Server RPC:8300
  • Serf LAN:8301
  • Serf WAN:8302
  • HTTP API:8500
  • DNS Interface:8600

Docker 部署、使用

开启第1台Server
[-p=8900:8500]把8500端口映射到外部主机的8900端口,使用http://ip:8900/ui访问
[-p=10080:80]把80端口映射到外部主机的10080端口,使用http://ip:80访问等会使用的nginx测试,这一步不是必须的
[-client=0.0.0.0]表示响应所有外部请求,不开启的话会导致webgui无法访问

$ docker run -d --name=server_1 -p=8900:8500 -p=10080:80 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -bootstrap-expect=3 -client=0.0.0.0 -ui

# 查看所有docker的ip地址
$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

# 启动第2台 Server,join 上面得到的 server_1 的IP地址
$ docker run -d --name=server_2 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -ui -join=172.17.0.2 -client=0.0.0.0

# 启动第3台 Server
$ docker run -d --name=server_3 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -ui -join=172.17.0.2 -client=0.0.0.0

# 启动第1台 Client
$ docker run -d --name=client_1  -e CONSUL_BIND_INTERFACE=eth0 consul agent -ui -join=172.17.0.2 -client=0.0.0.0

# 检查 Consul 集群状况
$ docker exec -t server_1 consul members

####################
# 集群2
$ docker run -d --name=consul5 -e CONSUL_BIND_INTERFACE='eth0' consul agent -server -bootstrap-expect 3 -datacenter=dc2

$ docker run -d --name=consul6 -e CONSUL_BIND_INTERFACE=eth0 consul agent --datacenter=dc2 --server=true --client=0.0.0.0 --join 172.17.0.6
$ docker run -d --name=consul7 -e CONSUL_BIND_INTERFACE=eth0 consul agent --datacenter=dc2 --server=true --client=0.0.0.0 --join 172.17.0.6
$ docker run -d --name=consul8 -e CONSUL_BIND_INTERFACE=eth0 consul agent --datacenter=dc2 --server=false --client=0.0.0.0 --join 172.17.0.6
# 多数据中心关联
$ docker exec -it consul6 consul join -wan 172.17.0.2

使用说明

Environment Variable(环境变量)

指令功能
CONSUL_BIND_INTERFACE=eth0在容器启动时,自动绑定eth0端口的IP地址
CONSUL_UI_LEGACY使用旧版ui

Command(命令)

指令功能
aclInteract with Consul’s ACLs
agent运行Consul agent
catalogInteract with the catalog
connectInteract with Consul Connect
debug记录操作者的错误日志
event构建一个事件
execExecutes a command on Consul nodes
force-leaveForces a member of the cluster to enter the "left" state
info向操作者提供错误信息
intentionInteract with Connect service intentions
join告诉Consul agent加入哪个簇
keygenGenerates a new encryption key
keyringManages gossip layer encryption keys
kv启用顶层KV键值功能
leaveGracefully leaves the Consul cluster and shuts down
lockExecute a command holding a lock
maintControls node or service maintenance mode
membersLists the members of a Consul cluster
monitorStream logs from a Consul agent
operatorProvides cluster-level tools for Consul operators
reloadTriggers the agent to reload configuration files
rttEstimates network round trip time between nodes
servicesInteract with services
snapshotSaves, restores and inspects snapshots of Consul server state
tlsBuiltin helpers for creating CAs and certificates
validateValidate config files/directories
versionPrints the Consul version
watchWatch for changes in Consul

Args(参数)

Docker参数功能
-e将时区信息传入到容器内部。
-dDaemon模式
-p绑定端口
–name指定实例名称
Consul参数功能
-data-dir指定agent储存状态的数据目录
-config-dir指定service的配置文件和检查定义所在的位置;通常会指定为"某一个路径/consul.d"(通常情况下,.d表示一系列配置文件存放的目录)
-config-file指定一个要装载的配置文件;选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖)
-dev创建一个开发环境下的server节点;该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
-bootstrap-expect该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。
-node指定节点在集群中的名称;该名称在集群中必须是唯一的(默认采用机器的host);推荐直接采用机器的IP
-bind指明节点的IP地址
-server指定节点为server;每个数据中心(DC)的server数推荐为3或5(理想的是,最多不要超过5)
-clientconsul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
-join将节点加入到集群
-domain绑定域名
-dc指定加入哪个数据中心
–retry-join[Server A的IP地址] 通过连接Server A加入集群
–ui开启网页GUI

权限控制

架构图

图片标题
图片标题

Tags:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注