Consul入门04 - Consul集群

Part 1:转载自:https://segmentfault.com/a/1190000005040904

我们已经启动了我们的第一个代理并且在这个代理上注册和查询了服务。这些显示了使用Consul是多么的容易但是并没有展示Consul的可扩展性以及可用于产品级别的服务发现的基础设施。在本篇向导中,我们将建立我们第一个多成员的真实的集群。

当一个Consul代理启动后,它对任何其他的节点都一无所知:它是个单独的隔离集群。为了让它感知其他的集群成员,代理必须加入一个现有的集群中去。为了加入一个现有的集群,它只需要知道一个单个的现有成员。它加入后,代理将广播该成员,并且快速发现集群中的其它成员。一个Consul代理能够加入任何其它的代理,不仅仅是那些运行在服务模式下的代理。

启动代理

为了模拟一个相对真实的集群,我们将通过Vagrant启动两个节点的集群。接下来使用的Vagrantfile可以在Consul仓库demo中找到。

我们首先启动两个节点:

$ vagrant up

一旦该系统可用了,我们就能通过ssh登录到该系统,并开始配置我们的集群。我们开始登录到第一个节点:

$ vagrant ssh n1

在我们以前的例子里,我们使用 *-dev 标志来快速地设置一个开发服务器。无论如何它并不能用于一个集群的环境下。我们将移除 -dev* 标志,而是替换成指定的用于集群的标志,下面就回涉及该标志。

每个集群节点都必须有一个唯一的名称。默认下Consul使用计算机的主机名,不过我们可以使用 -node 命令行选项手动地覆盖它。

我们也可以指定 绑定地址:Consul将在该地址侦听,并且改地址可以被集群中所有其它的节点访问到。虽然一个 绑定 的地址不是一个严格需要的(Consul将默认侦听在系统中第一个私有的IP),不过最好提供一个。一个生产环境下的服务通常有多个网络接口,所以指定一个 绑定 地址将保证你不会把Consul绑定到错误的网络接口上。

第一个节点现在将作为我们集群中的唯一服务器,我们指定它运行在server模式下。

-bootstrap-expect 标志暗示Consul服务器我们会有其它的服务节点将会加入。这个标志的目的是延迟复制日志的引导直到预期的服务节点成功加入。你可以在引导教程里查阅到更多的信息。

最后,我们增加 config-dir,指定将在哪里可以找到服务以及检查定义。

所有的标志都指定后,将这些设置加入 consul ageng 命令行:

[email protected]:~$ consul agent -server -bootstrap-expect 1     -data-dir /tmp/consul -node=agent-one -bind=172.20.20.10     -config-dir /etc/consul.d
...

现在,在另一终端里,我们连接到第二个节点:

$ vagrant ssh n2

这次,我们设置 绑定地址 是第二个节点的IP地址。因为该节点将不会是一个Consul的服务器,所以我们不指定它启动为服务器模式。

所有的标志都指定后,将这些设置加入 consul ageng 命令行:

[email protected]:~$ consul agent -data-dir /tmp/consul -node=agent-two     -bind=172.20.20.11 -config-dir /etc/consul.d
...

这时,我们已经有了两个Consul代理在运行:一个服务器和一个客户端。这两个Consul代理现在还对彼此没有任何感知,它们都为两个单节点的集群。你可以运行 consul members 来验证它们,每个集群都仅包含一个成员。

加入集群

现在,我们将告知第一个代理加入第二个代理,在一个新的终端中运行下列命令:

$ vagrant ssh n1
...
[email protected]:~$ consul join 172.20.20.11
Successfully joined cluster by contacting 1 nodes.

你应该可以在各自的代理日志中看到一些日志的输出。如果你仔细的查看,你将会看到有节点加入的日志信息。如果你再次运行consul members,你会看到两个代理都已经感知到了另一个节点的存在。

[email protected]:~$ consul members
Node       Address            Status  Type    Build  Protocol
agent-two  172.20.20.11:8301  alive   client  0.5.0  2
agent-one  172.20.20.10:8301  alive   server  0.5.0  2

记住:为了加入一个集群,一个Consul代理只需要知道一个现有的成员。在加入指定的集群后,各个代理会互相传播完整的成员信息。

启动时自动加入一个集群

理想情况下,无论什么时候一个新的节点加入了你的数据中心中,它应该自动地加入Consul集群而无需手动操作。为了达到这个目的,你可以使用Atlas
by HashiCorp
并且指定 -atlas-join 标志。下面就是一个配置例子:

$ consul agent -atlas-join   -atlas=ATLAS_USERNAME/infrastructure   -atlas-token="YOUR_ATLAS_TOKEN"

这需要一个Atlas的用户名和token,在这里创建帐号,然后在你的Consul配置中使用你认证信息的替换各自的值。现在,无论何时一个通过Consul代理启动的节点加入,它将自动加入你的Consul集群而无需硬编码任何的配置信息。

另一个可以选择的是,你可以在启动的时候使用 -join 标志或者 start_join 指定一个已知Consul代理的地址来加入一个集群。

查询节点

就像查询服务一样,Consul有一个API用户查询节点信息。你可以通过DNS或者HTTP API来查询。

对于DNS API,名称结构是 NAME.node.consul 或者 NAME.node.DATACENTER.consul。 如果数据中心被移除,Consul将仅仅查询本地数据中心。

例如,从“agent-one”,我们可以查询节点"agent-two"的地址:

[email protected]:~$ dig @127.0.0.1 -p 8600 agent-two.node.consul
...

;; QUESTION SECTION:
;agent-two.node.consul. IN  A

;; ANSWER SECTION:
agent-two.node.consul.  0 IN    A   172.20.20.11

这种查找节点的能力对于系统管理任务而言是非常有用的。例如知道了节点的地址,我们可以使用ssh登录到该节点并且可以非常容易地使得该节点成为Consul集群中的一部分并且查询它。

离开集群

为了离开指定的集群,你可以优雅地退出一个代理(使用 Ctrl-C)或者强制杀死代理进程。优雅地离开可以使得节点转换成离开状态;其它情况下,其它的节点检测这个节点将失败。其不同的地方在这里有详细的描述。

下一步

现在有了一个多节点的Consul集群已经启动并且运行着。让我们通过[健康检测]()使我们的服务具有更强的鲁棒性。

Part 2:根据Part1、Windows安装Linux虚拟机(CentOS7)及Consul入门01-03,我们使用虚拟机来实现集群(三台:三台机器才能满足基础的集群,当有一台主服务退出时,另外两台重新选举新的主服务)。

一、启动三台虚拟机,为了方便演示,我这边使用PUTTY来分别连接这三台机器,并统一使用root登录。

二、为了方便演示,我们分别将三台机器上的web.json中的serviceName重新命名为web、web1、web2(可以一开始的时候就这么命名或者使用vi编辑器),并分别在三台机器上运行consul:

我们先将consul定义为server(服务器模式):

consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul/ -node=web -bind=192.168.240.129 -config-dir /etc/consul.d/

另外两台机器使用如下命令启动(不将他们定义为服务器模式):

consul agent -data-dir /tmp/consul/ -node=web1 -bind=192.168.240.130 -config-dir /etc/consul.d/ 
consul agent -data-dir /tmp/consul/ -node=web2 -bind=192.168.240.131 -config-dir /etc/consul.d/

启动好之后,我们会发现,非server的两台机器web1和web2会时不时的在控制台输出信息,这是因为还没有加入到web的server中,没有找到集群的主服务,不用担心,我们继续看:

三、再打开三个putty客户端(上下匹配:左上1是web的consul server,左下1是新开的web putty客户端),并分别在里面运行consul members查看集群内成员,此时只能分别查看到本机的信息,type分别为server和client:

四、加入集群:

一个consul agent就是一个独立的程序。一个长时间运行的守护进程,运行在concul集群中的每个节点上。

启动一个consul agent ,只是启动一个孤立的node,如果想知道集群中的其他节点,应该将consul agent加入到集群中去 cluster。

agent有两种模式:server与client。server模式包含了一致性的工作:保证一致性和可用性(在部分失败的情况下),响应RPC,同步数据到其他节点代理。

client 模式用于与server进行通信,转发RPC到服务的代理agent,它仅保存自身的少量一些状态,是非常轻量化的东西。本身是相对无状态的。

agent除去设置server/client模式、数据路径之外,还最好设置node的名称和ip。

在web1和web2的client机器上,使用consul join IP加入consul server,我这里是这样的:

consul join 192.168.240.129

五、加入集群后,再次使用consul members 我们发现,集群中的机器已经可以互相发现了。一个server,其它是client:

Part 3:Server之间的leader自动选举功能:这次我们需要4台机器,其中web、web1、web2都定义为server,一台client。(虚拟机安装及基本配置请看:Windows安装Linux虚拟机(CentOS7)及Consul入门01-03)

一开始学习consul, 我们需要让consul 运行起来。consul server推荐至少在3~5个之间,推荐的方法是一开始启动其中一台server,并且配置到bootstrap的模式,该模式node可以指定自己作为leader,而不用进行选举。然后再依次启动其他server,配置为非bootstrap的模式。最后把第一个serverbootstrap模式停止,重新以非bootstrap模式启动,这样server之间就可以自动选举leader。

web:

consul agent -server -bootstrap -data-dir /tmp/consul -node=web

web1、web2:用以下命令启动consul,不需要带bootstrap 选项:

consul agent -server -data-dir /tmp/consul -node=web1
	consul agent -server -data-dir /tmp/consul -node=web2

PS:三台server都启动之后,会发现web1和web2在控制台也会有消息更新,提示NO cluster leader,说明无法选举leader,分别查看各自的集群信息时,也是无法互相查看的。

web1、web2需要加入到web的集群中:consul join 192.168.240.129:

当三台server都加入到集群,我们需要配置这三台机子为同等的server,并且让它们自己选择leader,这时可以停止第一台(web)的consul,然后运行如下命令:

consul agent -server -data-dir /tmp/consul -node=web
consul join 192.168.240.130

PS:此时,我们在每台机子上输入consul info,我们会发现此时的leader是web2;我们并没有指定,是集群自己选择的:

这时,我们模拟异常或者服务器退出,将web2关闭,这时我们再次输入consul info会发现,web和web1自动选举了web作为leader:

最后,将client机器连入集群,就是一个小型的完整集群了。

参考文章:http://www.cnblogs.com/yatingyang/p/4495098.html

Part 4:已经组建过的集群服务器,在退出集群之后,将无法加入之前的cluster中,而是依旧如第一次启动那样,看不到peers。

参考地址:http://tonybai.com/2015/07/06/implement-distributed-services-registery-and-discovery-by-consul/?utm_source=tuicool&utm_medium=referral

问题描述:我这边因为电脑重启了,所以集群就都退出了,但是按照上面的步骤,无法重新组建集群,无法选出leader,通过info命令看,两个节点都变成了Follower,集群仍然处于无leader状态。

问题解释:这个问题在consul的github repository issues中被对人次提及,但作者似乎不将此作为bug。产生这个问题的原因是当server退出时,consul会将/tmp/consul/raft/peers.json的内容由["192.168.240.129:8300","192.168.240.130:8300","192.168.240.131:8300"]=====改为=====》》》》null.当server重启后,该文件并未改变,依旧为null,所以无法重新弄自动join到cluster中,也就无法选取leader了。

问题解决:打开对应的serve中/tmp/consul/raft/peers.json文件,将内容统一修改为["192.168.240.129:8300","192.168.240.130:8300","192.168.240.131:8300"],然后重启,使用-rejoin命令加入集群或者重复Part3中的步骤即可。

时间: 2024-10-16 04:18:27

Consul入门04 - Consul集群的相关文章

入门初探+伪集群部署

Kafka入门初探+伪集群部署 Kafka是目前非常流行的消息队列中间件,常用于做普通的消息队列.网站的活性数据分析(PV.流量.点击量等).日志的搜集(对接大数据存储引擎做离线分析). 全部内容来自网络,可信度有待考证!如有问题,还请及时指正. 概念介绍 在Kafka中消息队列分为三种角色: producer,即生产者,负责产生日志数据. broker,存储节点,负责按照topic中的partition分区,均匀分布式的存储分区. consumer,即消费者,负责读取使用broker中的分区.

consul系列二之集群

集群中的每个节点必须有位置名称,默认情况下consul使用主机名作为名称,我们也可以使用-node命令指定 构建集群 启动首个节点 [[email protected] ~]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -bind=192.168.0.149 -config-dir /etc/consul.d/ ==> WARNING: BootstrapExpect Mode i

k8s 入门系列之集群安装篇

关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 ?Kubernetes集群组件: - etcd 一个高可用的K/V键值对存储和服务发现系统 - flannel 实现夸主机的容器网络的通信 - kube-apiserver 提供kubernetes集群的API调用 - kube-controller-manager 确保集群服务 - kube-scheduler 调度容器,分配到Node - kubelet 在Node节点上按

Spark新手入门——3.Spark集群(standalone模式)安装

主要包括以下三部分,本文为第三部分: 一. Scala环境准备 查看二. Hadoop集群(伪分布模式)安装 查看三. Spark集群(standalone模式)安装 Spark集群(standalone模式)安装 若使用spark对本地文件进行测试学习,可以不用安装上面的hadoop环境,若要结合hdfs使用spark,则可以参考上面的步骤搭建hadoop. 1. 下载安装包并解压(如:~/tools/spark-2.3.1-bin-hadoop2.7): 2. 启动服务 a.启动master

activeMQ从入门到简单集群指南

1.什么是amq MQ是消息中间件,基于JAVA的JMS消息服务机制来传递信息. 2.mq的作用 MQ给程序之间提供了一个缓冲,避免了在程序交互频繁的情况下,提高程序性能瓶颈和数据的可靠性 3.mq怎么用 一个producer基于JMS的机制,写好信息,通过MQ的服务地址和传输端口,建立通信,把poducer的信息发送到MQ中,MQ接收到队列等待消费者程序来消费掉刚队列接收的数据,消费者同样基于JMS机制的消费机制开发,消费端程序根据已配置好的生产队列名称,通过一个监听机制,队列中是否有可消费数

ubuntu16.04 tomcat集群

一.创建容器 1.Dockerfile 版本指定7.0 from tomcat:7.0.82 COPY sources.list /etc/apt/sources.list EXPOSE 8080 2.sources.list 源 # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted deb-src http://archive.ubuntu.com/u

基于Docker的Consul服务发现集群搭建

原文:基于Docker的Consul服务发现集群搭建 在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架构示范,也会更加贴近于实际应用环境. 一.示例整体架构 此示例会由一个API Gateway, 一个Consul Client以及三个Consul Server组成,有关Consul的Client和Server这两种模式的Agent的背景知识,请

Consul集群Server模式

Consul集群Server模式 架构示意图 Consul在生产环境下运行模式分为两种:Server模式和Client模式(dev模式属于开发模式不在这里讨论),我们先用Server模式搭建一个Consul集群,示意图如下: Consul Server A.B.C是启动的三个Consul服务运行于Server模式下,其中Consul Server C 是"总指挥",他们的Leader,Consul Server A和B是Follower当"替补",他们都可以提供注册

Docker 集群环境实现方式

Docker 集群环境实现的新方式 近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技术更新的步伐,导致企业架构要随时更改以适合业务需求.当前,越来越多的公司都已将以 Docker 为代表的容器技术用于企业级业务平台,比如:腾讯,京东,美团,新浪,阿里巴巴等互联网公司.数据的安全.Docker 容器的稳定运行是众多用户关注的,这就要求我们提供一套行