分布式架构学习-Consul集群配置
简介
之前公司用的是Consul进行服务发现以及服务管理,自己一直以来只是用一下,但是没有具体的深入,觉得学习不可以这样,所以稍微研究了一下。
网上有很多关于Consul的介绍和对比,我这里也不献丑了,大家搜索的时候可能会经常看到这么一个表格,此表格采摘自:https://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/
| Feature | Consul | zookeeper | etcd | euerka | 
|---|---|---|---|---|
| 服务健康检查 | 服务状态,内存,硬盘等 | (弱)长连接,keepalive | 连接心跳 | 可配支持 | 
| 多数据中心 | 支持 | — | — | — | 
| kv存储服务 | 支持 | 支持 | 支持 | — | 
| 一致性 | raft | paxos | raft | — | 
| cap | ca | cp | cp | ap | 
| 使用接口(多语言能力) | 支持http和dns | 客户端 | http/grpc | http(sidecar) | 
| watch支持 | 全量/支持long polling | 支持 | 支持 long polling | 支持 long polling/大部分增量 | 
| 自身监控 | metrics | — | metrics | metrics | 
| 安全 | acl /https | acl | https支持(弱) | — | 
| spring cloud集成 | 已支持 | 已支持 | 已支持 | 已支持 | 
下载并配置Consul
我这里是直接使用的虚拟机进行配置Consul,系统是CentOS 7,Consul的安装和配置其实网上也是有一堆教程,这里简单的介绍一下,Consul的下载地址(https://www.consul.io/downloads.html),根据需要选择不同的包:
下载Consul的ZIP包以及使用unzip进行解压,这里简单贴几个命令:
$ wget https://releases.hashicorp.com/consul/1.2.0/consul_1.2.0_linux_amd64.zip
$ yum install unzip
$ unzip consul_0..2_linux_amd64.zip
$ mv consul /usr/local/bin/consul
到此,就可以在控制台中输入consul,然后看到有如下打印结果,即代表正常:

开始配置,consul默认有如下几种Mode:
- dev ,快捷配置,一般用于调试模式
 - server,服务器
 - client,客户端
 
学习Consul的时候,会有很多教程可能为了快速的入门,所以在配置Consul的时候,直接使用了dev模式,我个人觉得使用这个模式没什么意思,因为使用这个dev效果就跟单机模式是一样的,我们这里是学习分布式架构的,所以不采用。
剩下的还有server模式以及client模式,server模式好理解,在我们搭建的集群中,都是使用此模式。可是client模式主要是用来做什么呢?先看一眼下面的图片:

(图片摘自:https://andyyoung01.github.io/2016/09/27/%E4%BD%BF%E7%94%A8Consul%E8%BF%9B%E8%A1%8C%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/)
上面的图片大致的意思就是有一个server集群,然后如果我们的服务想要加入server集群,就必须要通过client来进行rpc调用。(这个是我的理解,大家可以进行补充)
大致理解了这么一个结构之后,我们开始进行集群的配置,我这里通过虚拟机进行模拟,有如下几台机器:
- 192.168.125.118 server1(集群服务器)
 - 192.168.125.121 server2(集群服务器)
 - 192.168.125.120 server3(集群服务器)
 - 192.168.125.119 client(客户端)
 
三个做集群服务器,还有一个是客户端,集群服务器是由一个CentOS的虚拟机以及其两个拷贝组成,客户端我是在我的笔记本上装了一个Ubuntu的操作系统来实现的。
大致结构了解了之后,我们开始进行配置:
集群服务器的配置分别为:
$ consul agent -server -ui -bootstrap-expect= -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118
$ consul agent -server -ui -bootstrap-expect= -data-dir=/tmp/consul -node=server2 -client=0.0.0.0 -bind=192.168.125.121
$ consul agent -server -ui -bootstrap-expect= -data-dir=/tmp/consul -node=server3 -client=0.0.0.0 -bind=192.168.125.120
简单说一下几个配置:
- agent Consul的核心命令,主要作用有维护成员信息、运行状态检测、声明服务以及处理请求等
 - -server 就是代表server模式
 - -ui 代表开启web 控制台
 - -bootstrap-expect 代表想要创建的集群数目,官方建议3或者5
 - -data-dir 数据存储目录
 - -node 代表当前node的名称
 - -client 应该是一个客户端服务注册的地址,可以和当前server的一致也可以是其他主机地址,系统默认是127.0.0.1
 - -bind 集群通讯地址
 
上述命令执行完成之后,开始将这些分散的服务器组成集群,命令如下,分别在192.168.125.121和192.168.125.120机器上执行:
$ consul join 168.168.125.118
这里我执行了这个命令之后,得到报错信息,信息大致如下:

Failed to join 192.168.125.118:dial tcp 192.168.125.118::connect:no route to host(这里大致文字描述一下,方便搜索)
查询了一下,之所以出现这个情况是因为CentOS的防火墙,将8301端口加入防火墙就好了,命令大致如下:
$ firewall-cmd --zone=public --add-port=/tcp --permanent
$ firewall-cmd --reload /*必须添加,否则重启之后会失效*/
再次执行加入集群命令,出现以下问题:

consul: Failed to confirm peer status for server2: rpc error getting client: failed to get conn: dial tcp 192.168.125.120:->192.168.125.121:: connect: no route to host. Retrying in 1s...
产生这个的原因和上面的一致,加入集群需要和8300端口进行通讯,所以再次将8300端口加入防火墙,这里再说一下,再把8500端口也加入防火墙,因为这个端口是web控制台使用的。
再次执行加入集群命令,再次报错,因为是虚拟机,而且我是克隆的,后面发现在执行这些命令之后,会有如下提示:
* Failed to join 192.168.125.118: Member 'server1' has conflicting node ID 'b76ff298-accd-05ff-8c64-5d79d866dfa9' with this agent's ID
通过查询,网上给出的两个解决办法分别如下:
一是在启动agent的时候加入-disable-host-node-id参数,禁止生成node-id。类似这样:
$ consul agent -server -ui -bootstrap-expect= -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118 -disable-host-node-id
二是可以用-node-id生成一个新的node-id,类似这样:
$ consul agent -server -ui -bootstrap-expect= -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118 -node-id=$(uuidgen | awk '{print tolower($0)}')
上面两种方法我都试过,但是都不好使,应该是因为这个node-id已经存在于数据存储目录(即/tmp/consul),名字就叫node-id,使用vi或者vim打开之后可以看到一个guid格式的信息,这里保存的就是node ID的信息,无奈,我只能删除这个文件,然后重新启动命令,得到正常的反馈信息。

至此服务器集群搭建以及配置完成,打开WEB界面如下:

后续再继续client的配置以及编写一个net core的web api并加入consul集群,以及使用fabio进行负载均衡测试,未完待续~~~
参考链接:
https://blog.csdn.net/chenchong08/article/details/77885989(consul分布式集群搭建&简单功能测试&故障恢复)
http://www.cnblogs.com/xishuai/p/macos-ubuntu-install-consul.html(Mac OS、Ubuntu 安装及使用 Consul)
http://www.10tiao.com/html/357/201705/2247485185/1.html(Consul集群部署)
https://havee.me/linux/2015-01/using-firewalls-on-centos-7.html(CentOS 7 下使用 Firewall)
分布式架构学习-Consul集群配置的更多相关文章
- java架构之路-(分布式zookeeper)zookeeper集群配置和选举机制详解
		
上次博客我们说了一下zookeeper的配置文件,以及命令的使用https://www.cnblogs.com/cxiaocai/p/11597465.html.我们这次来说一下我们的zookeepe ...
 - redis学习五 集群配置
		
redis集群配置 0,整体概述 整体来说就是: 1,安装redis 2,配置多个redis实例 3,安装 ruby和rubygems 4,启动red ...
 - Hadoop学习11--Ha集群配置启动
		
理论知识: http://www.tuicool.com/articles/jameeqm 这篇文章讲的非常详细了: http://www.tuicool.com/articles/jameeqm 以 ...
 - kafka学习之-集群配置及安装
		
1.软件版本 kafka2.10_0.9.0.0 zookeeper_3.4.6 2.集群节点 一共有3台机器. 192.168.14.100 slave-01 192.168.14.105 slav ...
 - consul集群配置
		
consul agent -server -bootstrap-expect 1 -data-dir /etc/consul -node=consul1 -bind=ip1 -ui -client=0 ...
 - nginx给consul集群配置负载均衡
		
upstream consul { server 127.0.0.1:8501; server 127.0.0.1:8502; server 127.0.0.1:8503; } server { li ...
 - 庐山真面目之四微服务架构Consul集群和Nginx版本实现
		
庐山真面目之四微服务架构Consul集群和Nginx版本实现 一.简介 在上一篇文章<庐山真面目之三微服务架构Consul版本实现>中,我们已经探讨了如何搭建基于单节点Consu ...
 - 庐山真面目之六微服务架构Consul集群、Ocelot网关集群和Nginx版本实现
		
庐山真面目之六微服务架构Consul集群.Ocelot网关集群和Nginx版本实现 一.简介 在上一篇文章<庐山真面目之五微服务架构Consul集群.Ocelot网关和Nginx版本实 ...
 - 庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现
		
庐山真面目之七微服务架构Consul集群.Ocelot网关集群和IdentityServer4版本实现 一.简介 在上一篇文章<庐山真面目之六微服务架构Consul集群.Ocelot网 ...
 
随机推荐
- Python3.7安装Geenlet
			
1.首先再python文件下的Scripts文件夹下有这几个文件: 2.打开Scripts文件夹下可能你会发现是空的,这时候就要先安装setuptools了,安装完后Script文件下就出现上图的文件 ...
 - JSTL总结摘要
			
一 概述 1.什么是JSTL? JSP Standard Taglib,一个定义了一系列标签的标签库,以取代在JSP页面中嵌套的java代码,经常与EL结合使用,使页面风格统一,维护方便. JSTL标 ...
 - toast, 警告窗
			
//浮动提示框 1秒后消失 toast(msg, isError, sec) { var div = $('#toast'); div.html(msg); div.css({visibility: ...
 - 我为什么用docker-compose来打包开发环境
			
BUILD, SHIP, RUN Docker is the world's leading software containerization platform Docker的出现,让虚拟技术更上一 ...
 - 新年开篇-ERP和OA集成步骤
			
1.备份要升级帐套的数据库 6点 - 6点10分完成 重启 服务器 2.升级数据库 6点30 - 7点 3.配置ERP电子表单和EasyFlow表单 7点 - 7点30分 录入多公司信息(电子签核), ...
 - Nginx采用yum安装方式及安装后的目录
			
第一次写博客就不讲究格式了,纯文字了吧 开始 第一步先执行 rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release- ...
 - forkjoin框架疑问记录
			
今天在看jdk1.7的forkjoin框架时候,里面有个例子如下: product类: public class Product { private String name; private doub ...
 - jsonp和ajax的区别
			
一.Ajax工作原理 相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化.对于用户请求ajax引擎会做一些数据验证和数据处理,不是所有请求都提交给服务器,当需要从服务 ...
 - Python文件基础操作(IO入门1)
			
转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...
 - Linux CPU的中断【转载】
			
中断其实就是由硬件或软件所发送的一种称为IRQ(中断请求)的信号. 中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU. 一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且 ...