=============================
consul 命令行工具
=============================
consul 支持 Windows/Linux 等多种平台, 一般生产环境部署在 Linux, 下载包中仅有一个可执行程序, 所有的服务都通过命令行开启.

D:\my_program\consul\consul_1.2.3_windows_amd64>consul
Usage: consul [--version] [--help] <command> [<args>] Available commands are:
agent Runs a Consul agent
catalog Interact with the catalog
connect Interact with Consul Connect
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators.
intention Interact with Connect service intentions
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
kv Interact with the key-value store
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
operator Provides cluster-level tools for Consul operators
reload Triggers the agent to reload configuration files
rtt Estimates network round trip time between nodes
snapshot Saves, restores and inspects snapshots of Consul server state
validate Validate config files/directories
version Prints the Consul version
watch Watch for changes in Consul

常用的命令有:
consul agent #开启 server agent 或 client agent
consul reload #在不重启本机的 agent 的情况下, 让 agent 重新加载配置文件.
consul members #查看集群中的成员节点
consul join #将指定的agent加到指定的集群中
consul leave #将指定的agent从所属的集群中退出, 同时关闭该agent

--------------------------
consul agent 命令
--------------------------
consul agent 参数也有很多, 下面是一些重要参数:

-server 参数, 节点作为 server 角色, 不加该参数的话, 表明节点工作在 client 模式下.

-bootstrap-expect=<int> 参数, 表明该 datacenter 中期望的引导节点个数,当设定该参数后, consul 直到 server 数量到达该设定值后, 才会引导整个集群,该标记不能和 bootstrap 共用, 引导节点不需要太多, 1 到 3 个就可以了.

-bootstrap 参数, 参数"-bootstrap"表示在 datacenter 中只能有一个 server 处于 bootstrap 模式并使自己成为 leader 角色, 该参数不能和 bootstrap-expect 参数公用.

-bind=<IP> 参数, 输入本节点的IP, 该IP用于集群内部的通讯, 集群中所有节点都应能访问该 IP, 默认为 0.0.0.0. 一般不需要修改. 如果有多张网卡的话, consul 将不允许使用 0.0.0.0, 需要我们指定一个真实的网卡 IP.

-node=<节点名称>, 用来设定 agent 在集群中的名称, 默认为该节点的 hostname

-join=<IP>, 将节点加到指定的集群, IP地址为集群中其他agent的IP, 可以传入多个 -join 参数. 默认agent启动时不会加入任何节点, 后续需要使用 consul join 命令加入到集群中.

-config-dir=<目录>, 设定配置文件目录, 其下所有的.json 文件都会被自动加载.

-data-dir=<目录>, 设定 data 存放路径, client和server类的agent都需要指定.

-client=<IP>, 参数后面接一个 ip 地址, 代表将来开放给客户端访问的地址, 用来提供 Http/DNS/RPC 服务, 默认是 127.0.0.1, 只运行本地访问, 如果要开放访问, 需要设定为 0.0.0.0

-ui 参数, 开启默认的 Web UI

-advertise-wan=<IP>, 用于多数据中心集群, 边缘节点server agent需要设置一个公网IP, 这样多个数据中心集群可以相互通讯.

-dev 参数, 代表运行在开发模式下, 在该模式下, consul不做任何数据持久化, 非常适合做 demo.

-retry-join="IP list" 参数,  加入集群失败后, 持续尝试加入集群,  可以设置多个IP, 比如 -retry-join="192.168.1.11 192.168.1.12"

consul除了支持命令行参数的方式外, 还支持json格式的参数, consul json 配置文件的详细说明, 可参考:
https://deepzz.com/post/the-consul-of-discovery-and-configure-services.html#toc_9 和 https://www.tuicool.com/articles/EzE7NfY

两个示例:
示例1: 开启一个server agent 的示例, 192.168.1.1 为一个Windows 机器.
consul agent -server -bootstrap-expect=1 -node=s1 -bind=192.168.1.1 -client=0.0.0.0 -data-dir=D:\consul_data -ui
说明: -bind 参数一般情况下取值为 0.0.0.0, 如果有多张网卡的话, consul 将不允许使用 0.0.0.0, 需要我们指定一个真实的网卡 IP.

示例2: 在第一个 server 启动后, 其他 agent 启动的时候, 可以使用 -join 参数加入到集群中.
比如下面是在 192.168.1.200 Windows机器上, 启动一个客户端 agent, 并加入到上述 server 集群中.
consul agent -node=c1 -bind=192.168.1.200 -join 192.168.1.1 -data-dir=D:\consul_data -ui

--------------------------
consul leave 和 join 命令
--------------------------
一个 consul agent 可以加到一个或多个consul集群中, 如果一个agent 没有加入到任何一个集群中, 它将是一个孤立的节点, 也就是说它是一个孤立的集群. 想加入一个存在的集群, 只需要知道一个存在的节点, 这个存在的节点既可以是server类agent, 也可以是client类 agent.

consul leave -http-addr=192.168.1.11:8500
# 上面命令是将 192.168.1.11 agent 优雅地关闭, 也就是 192.168.1.11 agent将退出参与的所有集群,
# 这个操作不需要在 192.168.1.11 本机执行. consul join -http-addr=192.168.1.11:8500 192.168.1.12,
# 上面命令将 192.168.1.11 agent 加到 192.168.1.12 所处的集群中,这个操作不需要在 192.168.1.11 本机执行.

--------------------------
consul catalog 命令
--------------------------
consul catalog datacenters, 列出数据中心
consul catalog nodes , 列出节点
consul catalog nodes -service=redis ,列出指定服务的节点
consul catalog services , 列出服务

=============================
Windows 下的开发环境
=============================
Windows 下开发环境的命令如下, 非常简单.

consul agent -dev -client 0.0.0.0

-dev 参数, 代表运行在开发模式下, 在该模式下, consul不做任何数据持久化.
-client 参数后面接一个 ip 地址, 代表将来开放给客户端访问的地址, 用来提供 Http/DNS/RPC 服务, 默认是 127.0.0.1, 只运行本地访问, 如果要开放访问, 需要设定为 0.0.0.0

命令执行后, consul 将监听多个端口, 其中 8500 端口是 webUI 服务, 可以通过 http://127.0.0.1:8500 验证 consul 运行的的情况.

=============================
Linux 下的开发环境
=============================
在 Linux 下, 我使用 docker 容器运行 consul, 下载次新版 1.2.3

# pull image
docker pull consul:1.2. # 验证一下版本信息
docker run --rm consul:1.2. consul version # 开启开发模式
docker run -d \
--name consul_dev \
--net=host \
-p : \
-p : \
-p : \
-p : \
consul:1.2. \
consul agent -dev -client 0.0.0.0

因为是通过容器来运行, 所以需要将端口都暴露出来, 容器网络模式选用 host 模式, 并开放其他机器访问该 consul 服务.

=============================
consul 集群
=============================
consul 集群中至少一个 server 角色的 agent, 但显然这个集群本身并不是高可用架构. 正常集群需要 3~5 个 server, 我分别在三台虚拟机通过 docker 容器开启 server agent. Windows 主机工作在 client agent 模式下.

下面是集群的规划清单:
Linux | vm1 | server 模式 | 192.168.1.11
Linux | vm2 | server 模式 | 192.168.1.12
Linux | vm3 | server 模式 | 192.168.1.13

--------------------------
vm1 server agent 启动
--------------------------
在 vm1 上 启动一个server, 特别说明的为容器分配一个匿名的 volume 用来映射容器中的 /consul/data 目录, 该目录保存 consul 的 data, 脚本文件如下:

#file: /var/lib/boot2docker/consul_vm1.sh
docker rm consul_vm1
docker run -d \
--name consul_vm1 \
--net host \
-p : \
-p : \
-p : \
-p : \
-v /consul/data \
consul:1.2. \
consul agent \
-server \
-ui \
-datacenter=dc1 \
-bootstrap-expect= \
-data-dir=/consul/data \
-node=consul_vm1 \
-bind=192.168.1.11 \
-client=0.0.0.0

通过 ui 检查
http://192.168.1.11:8500/

# 通过 consul members 命令检查:
docker run --rm consul:1.2. consul members -http-addr=192.168.1.11:

docker run --rm consul:1.2.3 consul members
直接执行不带参数的consul members 会报错, 因为默认情况下, consul 会通过 127.0.0.1:8500 获取成员清单, 而我们用的是 eth1 这个网卡IP 192.168.1.11启动的consul, 所以不能用 loopback lo 网卡的 127.0.0.1 IP 查询, 上面命令会报错"tcp 127.0.0.1:8500: connect: connection refused", 需要使用下面命令查询:

--------------------------
vm2 server agent 启动
--------------------------
在 vm2 启动 consul 容器的命令基本和 vm1 相同, 不同的地方有:
* 增加了 -join 参数, 加入的 vm1 的集群中.
* 删除了 -bootstrap-expect=1
* 修改了 对应了 -bind 参数IP
* 修改了容器名 和 consul node 名

#file: /var/lib/boot2docker/consul_vm2.sh
docker rm consul_vm2
docker run -d \
--name consul_vm2 \
--net host \
-p : \
-p : \
-p : \
-p : \
-v /consul/data \
consul:1.2. \
consul agent \
-server \
-ui \
-datacenter=dc1 \
-data-dir=/consul/data \
-node=consul_vm2 \
-bind=192.168.1.12 \
-client=0.0.0.0 \
-join=192.168.1.11

--------------------------
vm3 server agent 启动
--------------------------
在 vm3 启动 consul 容器的命令基本和 vm2 相同, 除了IP和名称不同外, 仅仅是删除了 -join 参数, 我们将在后面通过join命令加入集群.

#file: /var/lib/boot2docker/consul_vm3.sh
docker rm consul_vm3
docker run -d \
--name consul_vm3 \
--net host \
-p : \
-p : \
-p : \
-p : \
-v /consul/data \
consul:1.2. \
consul agent \
-server \
-ui \
-datacenter=dc1 \
-data-dir=/consul/data \
-node=consul_vm3 \
-bind=192.168.1.13 \
-client=0.0.0.0 \
# 手工将 192.168.1.13 agent 加到 192.168.1.12 所在的集群中:
docker run --rm consul:1.2. consul join -http-addr=192.168.1.13: 192.168.1.12 # 另外, 手工关闭 192.168.1.13 agent 的命令为:
docker run --rm consul:1.2. consul leave -http-addr=192.168.1.13:

=============================
参考
=============================
Consul -- 分布式配置中心
https://340starobserver.github.io/2018/03/08/Consul-Cluster/

Consul 使用手册
http://www.liangxiansen.cn/2017/04/06/consul/

consul 支持多数据中心的服务发现与配置共享工具
https://deepzz.com/post/the-consul-of-discovery-and-configure-services.html

搭建 consul 集群的更多相关文章

  1. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  2. vagrant+docker搭建consul集群开发环境

    HashiCorp 公司推出的Consul是一款分布式高可用服务治理与服务配置的工具.关于其配置与使用可以参考这篇文章 consul 简介与配置说明. 一般,我们会在多台主机上安装并启动 consul ...

  3. Docker学习-Docker搭建Consul集群

    1.环境准备 Linux机器三台 网络互通配置可以参考 https://www.cnblogs.com/woxpp/p/11858257.html 192.168.50.21 192.168.50.2 ...

  4. 搭建consul 集群

    1.   准备工作 a)      启动三台虚拟机 s1:10.1.7.141 s2:10.1.7.139 s3:10.1.7.138 b)      每台机器上在 /home新建文件夹 mkdir ...

  5. CentOS7 搭建 Consul 集群

    环境准备: ssh shell工具: 远程连接 三个CentOS示例: 部署集群 配置好各个实例之间的网络访问,以及ssh免密登录. 下载&上传: 1.下载 Consul: Download ...

  6. docker上搭建consul集群全流程

    consul简介: consul是提供服务发现.简单配置管理.分区部署的服务注册发现解决方案.主要特性:服务发现\健康检查\基于Key-Value的配置\支持TLS安全通讯\支持多数据中心部署 con ...

  7. 使用Docker搭建consul集群+registrator实现服务自动注册。

    准备工作:10.173.16.83 master10.172.178.76 node110.171.19.139 node210.162.204.252 node3 一.安装consul-cluste ...

  8. 微服务之:从零搭建ocelot网关和consul集群

    介绍 微服务中有关键的几项技术,其中网关和服务服务发现,服务注册相辅相成. 首先解释几个本次教程中需要的术语 网关 Gateway(API GW / API 网关),顾名思义,是企业 IT 在系统边界 ...

  9. Linux中Consul集群部署

    分配三台虚拟机: 192.168.5.125 192.168.5.128 192.168.5.129 在每台虚拟机上创建  /usr/consul 文件件  命令: mkdir /usr/consul ...

随机推荐

  1. SQL查询语句的进阶使用

    MySQL的进阶使用 sql语句一些功能的使用 导入现有大量数据文件步骤 1) 把*.sql文件拷贝到Linux某一位置(例如Desktop) 2) Linux命令行进入该位置 cd ~/Deskto ...

  2. MongoDB常用操作命令

    查看所有数据库: > show dbs; 选定数据库: > use ECommerce; 查看当前数据库状态: > db.stats(); 查看当前数据库中所有集合: > sh ...

  3. QML学习笔记(二)-纯qml画图实现canvas画板-鼠标画图

    作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载请获取授权和联系作者 用纯qml实现canvas画板功能,用鼠标进行画图,可以画直线,画圆,画矩形,画弧线. 由于canvas画图会有延迟和 ...

  4. 【洛谷P2042】维护数列

    题目大意:维护一个序列,支持区间插入,区间删除,区间翻转,查询区间元素和,查询区间最大子段和操作. 题解:毒瘤题...QAQ打完这道题发现自己以前学了一个假的 Splay.. 对于区间操作,用 spl ...

  5. 使用visual C++测试

    背景:学习一门语言最好的方式就是实际动手敲一遍.现在敲一遍的障碍是不能熟练的使用工具,特此记录下来 新建工程 新建——项目——Windows 控制台应用程序 如何新建测试用例呢? OJ试题在VS201 ...

  6. java List<String> 转换成带逗号的字符串

    使用commons-lang3-3.3.2.jar org.apache.commons.lang3.StringUtils.join(applyNameList, ",");

  7. bash 5

    1)bash支持一维数组(不支持多维数组),并且没有限定数组的大小. 类似于 C 语言,数组元素的下标由 0 开始编号.获取数组中的元素要 利用下标,下标可以是整数或算术表达式,其值应大于或等于 0. ...

  8. Mybatis项目中不使用代理写法【我】

    首先 spring 配置文件中引入 数据源配置 <?xml version="1.0" encoding="UTF-8"?> <beans x ...

  9. Go语言(IDEA下+Eclipse下)Hello World

    第一步,去下载Go环境 然后安装即可. IDEA 先安装GO插件: ..点击Browse... ..搜索GO ..点击安装,安装完之后重启 ..重启完之后,New~(IDEA已经自动识别出系统中安装的 ...

  10. JS学习笔记Day4

    一.什么是函数 将反复使用的功能代码,封装成一独立的模块,这个模块叫做函数 二.封装函数的好处 1.一次封装,多次使用 2.使程序可控 三.函数的分类:内置()函数和自定义函数 四.函数的数据类型(f ...