Consul注册中心高可用集群搭建(Consul HA)

                           

序言:

一些常识
Server负责组成 cluster 的复杂工作(选举、状态维护、转发请求到 lead),以及 consul 提供的服务(响应 RCP 请求)。考虑到容错和收敛,一般部署 3 ~ 5 个比较合适。

什么是ACL?
  ACL技术在路由器中被广泛采用,它是一种基于包过滤的流控制技术。控制列表通过把源地址、目的地址及端口号作为数据包检查的基本元素,并可以规定符合条件的数据包是否允许通过。
什么是Gossip协议? **
  这个协议就是模拟人类中传播谣言的行为而来。首先要传播谣言就要有种子节点。种子节点每秒都会随机向其他节点发送自己所拥有的节点列表,以及需要传播的消息。任何新加入的节点,就在这种传播方式下很快地被全网所知道。
什么是服务注册?
  一个服务将其位置信息在“中心注册节点”注册的过程。该服务一般会将它的主机IP地址以及端口号进行注册,有时也会有服务访问的认证信息,使用协议,版本号,以及关于环境的一些细节信息。
什么是服务发现?
  服务发现可以让一个应用或者组件发现其运行环境以及其它应用或组件的信息。用户配置一个服务发现工具就可以将实际容器跟运行配置分离开。常见配置信息包括:ip、端口号、名称等。
  当一项服务存在于多个主机节点上时,client端如何决策获取相应正确的IP和port。在传统情况下,当出现服务存在于多个主机节点上时,都会使用静态配置的方法来实现服务信息的注册。而当在一个复杂的系统里,需要较强的可扩展性时,服务被频繁替换时,为避免服务中断,动态的服务注册和发现就很重要。

相关开源项目:Zookeeper,Doozer,Etcd,强一致性的项目,这些项目主要用于服务间的协调,同时又可用于服务的注册。
什么是强一致性协议?
  按照某一顺序串行执行存储对象读写操作, 更新存储对象之后, 后续访问总是读到最新值。 假如进程A先更新了存储对象,存储系统保证后续A,B,C进程的读取操作都将返回最新值。强一致性模型有几种常见实现方法, 主从同步复制, 以及quorum复制等。

==================Centos7 搭建Consul注册中心=====================

consul简介
Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:

1.服务发现: Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.

2.健康检查: Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.
3.Key/Value存储: 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.

4.多数据中心: Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.
Consul面向DevOps和应用开发者友好.是他适合现代的弹性的基础设施.

Consul基础架构:

               

每个提供服务给Consul的阶段都运行了一个Consul agent . 发现服务或者设置和获取 key/value存储的数据不是必须运行agent.这个agent是负责对节点自身和节点上的服务进行健康检查的.

Agent与一个和多个Consul Server 进行交互.Consul Server 用于存放和复制数据.server自行选举一个领袖.虽然Consul可以运行在一台server , 但是建议使用3到5台来避免失败情况下数据的丢失.每个数据中心建议配置一个server集群.

你基础设施中需要发现其他服务的组件可以查询任何一个Consul 的server或者 agent.Agent会自动转发请求到server .

每个数据中运行了一个Consul server集群.当一个跨数据中心的服务发现和配置请求创建时.本地Consul Server转发请求到远程的数据中心并返回结果.

consul的搭建和配置
consul官网为我们提供了zip用于consul的安装,其加压后是一个可以直接运行的文件,非常方便

*consul解压即用

================详细安装:【root账号安装】========================

https://releases.hashicorp.com/consul/   下载地址

下载安装包

wget https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_amd64.zip

1: 解压缩Consul包到/usr/local/bin/ 

unzip consul_1.5.2_linux_amd64.zip -d /usr/local/bin

2:  编辑 /etc/profile 文件,添加环境变量

方式一:
   vi /etc/profile
          export CONSUL_HOME=/usr/local/bin/consul
          export PATH=$PATH:CONSUL_HOME

// 使环境变量配置立马生效
source /etc/profile

方式二:
   vi /etc/profile.d/consul.sh
          export CONSUL_HOME=/usr/local/bin/consul
          export PATH=$PATH:CONSUL_HOME

保存退出,然后给consul.sh分配权限:chmod 755 /etc/profile.d/consul.sh

3: 验证consul可以使用

4: 检查consul版本

5: 防火墙开放8500端口(或者systemctl disable firewalld)

firewall-cmd --zone=public --add-port=8500/tcp --permanent
firewall-cmd --reload

6: 启动Consul服务

[root@centoshadoop4 tools]#

consul agent -server -client=0.0.0.0 -bind=192.168.227.143 -bootstrap -ui -data-dir=/usr/local/consuldata &

/usr/local/consuldata目录会自动创建

启动成功的日志如下:

查看/usr/local/consuldata目录下启动后生成的目录及文件数据

查看是否启动

[root@centoshadoop4 ~]# netstat -anp|grep 8500 

访问 http://centoshadoop4:8500/  如下图

访问 http://centoshadoop3:8500/

访问 http://centoshadoop2:8500/

访问 http://centoshadoop1:8500/

后台启动:consul agent -server -client=0.0.0.0 -bind=192.168.227.143 -bootstrap -ui -data-dir=/usr/local/consuldata &

参数解释:
-server 表示是以服务端身份启动
-bind 表示绑定到哪个ip(有些服务器会绑定多块网卡,可以通过bind参数强制指定绑定的ip)
-client 指定客户端访问的ip(consul有丰富的api接口,这里的客户端指浏览器或调用方),0.0.0.0表示不限客户端ip
-bootstrap-expect=3 表示server集群最低节点数为3,低于这个值将工作不正常(注:类似zookeeper一样,通常集群数为奇数,方便选举,consul采用的是raft算法)
-data-dir 表示指定数据的存放目录(该目录必须存在)
-node 表示节点在web ui中显示的名称
-ui 启动consul自带的web管理界面

7: 查看Consul服务状态

consul members

下面我们在此基础上搭建Consul集群

一个leader,多个follower,为了方便选举一般使用奇数台服务器。

一:准备三台机器

服务器ipconsul类型Node(主机名称)节点名称
192.168.227.141servercentoshadoop2server-01
192.168.227.142servercentoshadoop3server-02
192.168.227.143servercentoshadoop4server-03
192.168.227.140clientcentoshadoop1client-01

如果单机版有启动,则需要先删除其data目录,再做集群,否则集群报错 

[root@centoshadoop4 ~]# rm -rf /usr/local/consuldata/*

二:三台机器防火墙开放端口

firewall-cmd --zone=public --add-port=8300/tcp --permanent
firewall-cmd --zone=public --add-port=8301/tcp --permanent
firewall-cmd --zone=public --add-port=8500/tcp --permanent
firewall-cmd --zone=public --add-port=8600/tcp --permanent
firewall-cmd --reload
————————————————
三: 分发至其他节点(centoshadoop3,centoshadoop2)

[root@centoshadoop4 ~]# scp -r /usr/local/bin/consul root@centoshadoop3:/usr/local/bin/
[root@centoshadoop4 ~]# scp -r /usr/local/bin/consul root@centoshadoop2:/usr/local/bin/

[root@centoshadoop4 ~]# scp -r /usr/local/bin/consul root@centoshadoop1:/usr/local/bin/
[root@centoshadoop4 ~]# scp -r /etc/profile root@centoshadoop3:/etc/   
[root@centoshadoop4 ~]# scp -r /etc/profile root@centoshadoop2:/etc/

[root@centoshadoop4 ~]# scp -r /etc/profile root@centoshadoop1:/etc/
 分别在节点centoshadoop2,centoshadoop3,centoshadoop1执行consul version

[root@centoshadoop2 ~]# consul version
Consul v1.5.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)        说明配置生效

四:集群启动并加入集群

(1)centoshadoop4节点启动consul (server-01)

vi start-consul.sh

nohup consul agent -server -bootstrap-expect=3 -data-dir=/usr/local/consuldata  -bind=192.168.227.143 -client=0.0.0.0 -datacenter=consul-dashboard -ui -node=server-01 > /dev/null 2>&1 &

chmod 775 start-consul.sh

日志信息报错:在进行集群leader的选举,但是节点数不够,先别理

(2)centoshadoop3启动consul(join centoshadoop4)(server-02)

vi start-consul.sh

nohup consul agent -server -bootstrap-expect 3 -data-dir=/usr/local/consuldata  -bind=192.168.227.142 -client=0.0.0.0 -datacenter=consul-dashboard -ui -join 192.168.227.143 -node=server-02 > /dev/null 2>&1 &

chmod 775 start-consul.sh

查看是否启动

[root@centoshadoop3 kafka_2.11-2.1.0]#  netstat -anp|grep 8500
tcp6       0      0 :::8500                 :::*                    LISTEN      52032/consul      

(3)centoshadoop2启动consul(join centoshadoop4) (server-03)

vi start-consul.sh

nohup consul agent -server -bootstrap-expect 3 -data-dir=/usr/local/consuldata -bind=192.168.227.141 -client=0.0.0.0 -datacenter=consul-dashboard -ui -join 192.168.227.143 -node=server-03 > /dev/null 2>&1 &

chmod 775 start-consul.sh

[root@centoshadoop2 kafka_2.11-2.1.0]#  netstat -anp|grep 8500
tcp6       0      0 :::8500                 :::*                    LISTEN      52032/consul    

(4)centoshadoop1启动consul(join centoshadoop4)  (client-01)

vi start-consul.sh

nohup consul agent -client=0.0.0.0  -data-dir=/usr/local/consuldata -bind=192.168.227.140  -datacenter=consul-dashboard -ui -join 192.168.227.143 -node=client-01 > /dev/null 2>&1 &

chmod 775 start-consul.sh

访问任意一个节点,集群搭建成功,如下图:

 

随着节点进入组建集群完成:日志变化如下图:

 至此,Consul 3节点集群搭建完成..................

在任意一个节点查看集群的成员:

[root@centoshadoop1 ~]# consul members
Node       Address               Status  Type    Build  Protocol  DC                Segment
server-01  192.168.227.143:8301  alive   server  1.5.2  2         consul-dashboard  <all>
server-02  192.168.227.142:8301  alive   server  1.5.2  2         consul-dashboard  <all>
server-03  192.168.227.141:8301  alive   server  1.5.2  2         consul-dashboard  <all>
client-01  192.168.227.140:8301  alive   client  1.5.2  2         consul-dashboard  <default>

查看当前集群元数据信息:
[root@centoshadoop1 ~]# curl localhost:8500/v1/catalog/nodes
[{"ID":"7a3694b2-489b-43d9-6ec3-c9964e74b03e","Node":"client-01","Address":"192.168.227.140","Datacenter":"consul-dashboard","TaggedAddresses":{"lan":"192.168.227.140","wan":"192.168.227.140"},"Meta":{"consul-network-segment":""},"CreateIndex":532,"ModifyIndex":533},{"ID":"4e09343d-650a-2c4a-4d9d-d2c17a459e50","Node":"server-01","Address":"192.168.227.143","Datacenter":"consul-dashboard","TaggedAddresses":{"lan":"192.168.227.143","wan":"192.168.227.143"},"Meta":{"consul-network-segment":""},"CreateIndex":6,"ModifyIndex":8},{"ID":"d8f5ad28-272d-6012-8fd2-8b64e60f443b","Node":"server-02","Address":"192.168.227.142","Datacenter":"consul-dashboard","TaggedAddresses":{"lan":"192.168.227.142","wan":"192.168.227.142"},"Meta":{"consul-network-segment":""},"CreateIndex":7,"ModifyIndex":9},{"ID":"51d928d5-1498-7eae-1d40-7c8706292150","Node":"server-03","Address":"192.168.227.141","Datacenter":"consul-dashboard","TaggedAddresses":{"lan":"192.168.227.141","wan":"192.168.227.141"},"Meta":{"consul-network-segment":""},"CreateIndex":211,"ModifyIndex":410}][root@centoshadoop1 ~]# 

 

注:除centoshadoop4外,centoshadoop3、centoshadoop2,centoshadoop1均join centoshadoop4

访问集群的状态:

[root@centoshadoop2 consuldata]# consul operator raft list-peers
Node             ID                                    Address               State     Voter  RaftProtocol
192.168.227.141  bf3c7ff0-9474-babd-1d3c-57b51d707ec5  192.168.227.141:8300  leader    true   3
192.168.227.143  da3fab3f-18b0-01d1-5859-f7a6a769fcef  192.168.227.143:8300  follower  true   3
192.168.227.142  535d4499-e331-31a2-1d42-36d16b4196b9  192.168.227.142:8300  follower  true   3

停止agent代理服务(停止某一个节点)
[root@centoshadoop2 ~]# consul leave
    2020/05/25 18:22:50 [INFO] consul: server starting leave
    2020/05/25 18:22:51 [INFO] serf: EventMemberLeave: 192.168.227.141.consul-dashboard 192.168.227.141
    2020/05/25 18:22:51 [INFO] consul: Handled member-leave event for server "192.168.227.141.consul-dashboard" in area "wan"
    2020/05/25 18:22:55 [INFO] serf: EventMemberLeave: 192.168.227.141 192.168.227.141
    2020/05/25 18:22:55 [INFO] consul: Removing LAN server 192.168.227.141 (Addr: tcp/192.168.227.141:8300) (DC: consul-dashboard)
 

停掉某一个节点后,查看当前集群的选举状态

[root@centoshadoop3 consuldata]# consul operator raft list-peers
Node             ID                                    Address               State     Voter  RaftProtocol
192.168.227.143  da3fab3f-18b0-01d1-5859-f7a6a769fcef  192.168.227.143:8300  follower  true   3
192.168.227.142  535d4499-e331-31a2-1d42-36d16b4196b9  192.168.227.142:8300  leader    true   3
 

==============Consul Server配置===================

启动consul server
下面给大家带来的启动指令大全:
-bootstrap:
启动模式,此模式下,节点可以选举自己为leader,一个数据中心只能有一个此模式启动的节点。机群启动后,新启动的节点不建议使用这种模式。
-bootstrap-expect:
设定一个数据中心需要的服务节点数,可以不设置,设置的数字必须和实际的服务节点数匹配。consul会等待直到数据中心下的服务节点满足设定才会启动集群服务。初始化leader选举,不能和bootstrap混用。必须配合-server配置。
-bind:
绑定的内部通讯地址,默认0.0.0.0,即,所有的本地地址,会将第一个可用的ip地址散播到集群中,如果有多个可用的ipv4,则consul启动报错。[::]ipv6,TCP UDP协议,相同的端口。防火墙配置。
-client:
客户端模式,http dns,默认127.0.0.1,回环令牌网址
-config-file:
配置文件位置
-config-dir:
配置文件所在文件夹,会加载其下所有配置文件,.json或者.hcl文件,加载顺序为字母表顺序;可用配置多个此配置,从而加载多个文件夹,子文件夹的配置不会被加载。
-config-format:
配置文件格式,配置了,则加载相应个是的文件。不配置,则consul自动识别。
-data-dir:
状态数据存储文件夹,所有的节点都需要。文件夹位置需要不收consul节点重启影响,必须能够使用操作系统文件锁,unix-based系统下,文件夹文件权限为0600,注意做好账户权限控制,
-datacenter:
数据中心名称,默认dc1,一个数据中心的所有节点都必须在一个LAN中。
-dev:
开发模式,去掉所有持久化选项,内存服务器模式。
-disable-host-node-id:
不使用host信息生成node ID,适用于同一台服务器部署多个实例用于测试的情况。随机生成nodeID
-dns-port:
v7.0以后,自定义dns 端口,覆盖默认8600
-enable-script-checks:
是否允许使用脚本进行健康检查,默认false,最好配置enable acl
-encrypt:
consul网络通讯加密key,base64加密,16比特;consul keygen产生。集群中的每个实例必须提供相同的,只需提供一次,然后会保存到数据文件。重启自动加载。consul节点启动后提供,会被忽略。
-hcl:
添加hcl格式配置,和已有的配置合并。可以使用多个此配置。
-http-port:
http api端口,覆盖默认的8500。适用于云环境指定。
-log-file:
日志记录文件,如果没有提供文件名,则默认Consul-时间戳.log
-log-level:
日志级别,默认info,包含:trace,debug,info,warn,err;consul monitor监控
-log-rotate-bytes:
新日志文件生成大小阈值。
-log-rotate-rotation:
新日志生成时间阈值
-join:
需要加入的其它节点地址,可以多次使用,加入多个节点。
-retry-join:
会进行加入重试,适用于认定加入节点最终会正常的情况。ipv4,ipv6,dns
-retry-interval:
上述,重试间隔,默认30s
-retry-max:
重试次数,默认0,无限次重试
-join-wan, -retry-join-wan, -retry-interval-wan, -retry-max-wan
-node:
节点名称,默认主机名
-node-id:
节点ID,
-pid-file:
consul 存储 pid 的文件位置,用于主动发信号。如停止节点,重载配置等。
-protocol:
使用的协议,升级时使用。consul -v查看协议版本
-raft-protocol:
使用raft协议版本,默认3
-raft-snapshot-threshold:
raft执行快照,提交次数阈值。一般不需要设置,io密集型应用可以调高。避免所有的节点同一时间快照。此值过大,会造成相应日志文件变大,节点重启恢复会耗费更长时间。1.1.0后,默认16384,之前8192.
-raft-snapshot-interval:
执行快照间隔,影响类似上个配置,1.1.0后默认30s,之前5s。
-rejoin:
节点会尝试重新加入集群。
-server:
服务端节点模式。
-server-port:
服务端RPC端口,v1.2.2后提供。
-non-voting-server:
服务节点不参与选举,接受日志复制,用于横向扩展,服务查询请求。(类比zookeeper 观察者节点)
-syslog:
linux OSX系统,配置日志输出到系统日志。
-ui:
内置web ui界面。
-ui-dir:
web ui 资源文件夹,使用此配置,则不需也不能使用再-ui配置。

在启动时我选择了三台机器搭建server集群,给大家送上官网推荐的集群部署推荐

 

=================consul集群的使用:====================================

官方比较推荐的是三台以上的server,而client数量不做限制,网上大多数推荐的架构如下

当然服务也可以直接被注册在server上而不通过client也是可以的,这就要看具体的业务需求了兄弟们,但是每个节点的服务注册数量是有上限的,考虑到如果服务量级在将来有可能激增的情况下,还是推荐使用consul所推荐的下挂client的方案,毕竟consul的反熵设计也是经过了反复的推敲的

最后来给大家推荐一波,呃,灾后重建?

单个服务器集群(其实不太好意思叫自己集群T_T)的故障
如果你只有一台服务器但然后由于各种原因挂掉了,兄弟问题提不大,只需重新启动即可。单个服务器配置需要 -bootstrap或 -bootstrap-expect=1 标志。

如果你升级了协议?
升级服务器后 -raft协议 从版本2到3,服务器的运行筏协议版本3将不再允许运行的服务器的旧版本以复加。
在单服务器群集方案中,重新启动服务器可能导致服务器无法选择自己作为领导者,从而导致群集无法使用。要从中恢复,请转到 -data-dir就是那个挂掉的Consul服务器。在数据目录中有一个raft/ 子目录。raft/peers.json在raft/目录中创建一个文件。对于Raft协议版本3及更高版本,应将其格式化为包含节点ID,地址:端口和Consul服务器的选举权信息的JSON数组,如下所示:

确保替换Consul服务器node-id并node-ip使用正确的值。
最后,重新启动Consul服务器

多服务器群集中的服务器故障
官方是这么说的:
如果故障服务器是可恢复的,则最佳选择是将其重新联机并使其重新加入具有相同IP地址的群集。这将使群集恢复到完全健康状态。同样,如果您需要重建新的Consul服务器,要替换故障节点,你可能希望立即执行此操作。请注意,重建的服务器需要具有与故障服务器相同的IP地址(???????)。同样,一旦此服务器联机并重新加入,群集将返回完全正常状态。
上面说的两种,其实一点都不可行,修一定修很久,而提供相同的IP地址,也不太现实哈
通常,consul force-leave如果挂掉的服务器仍然是群集的成员,则可以发出命令以删除该服务器。以保证集群的正常选举

另一种方式则是使用peers.json手动恢复(靠谱一些)
在Consul 0.7及更高版本中,peers.json默认情况下该文件不再存在,仅在执行恢复时使用。Consul启动并摄取此文件后,将删除此文件。Consul 0.7还使用新的自动创建的raft/peers.info文件,以避免raft/peers.json在升级后第一次启动时摄取文件。务必留下raft/peers.info便于以后恢复备份
于Raft协议版本3及更高版本,应将其格式化为JSON数组,其中包含集群中每个Consul服务器的节点ID,地址:端口和选举权信息,如下所示:
————————————————

只需为所有服务器创建条目。必须确认此处未包含的服务器确实已经挂掉了,以后不会重新加入群集。确保所有其余服务器节点上的此文件相同。

此时,你可以重新启动所有剩余的服务器。在Consul 0.7及更高版本中,将看到它们的摄取恢复文件:

在Consul 0.7及更高版本中,可以使用该consul operator 命令检查Raft配置:

补充:
删除consul上不需要的服务:
http://xx.xx.xx.xx:8500/v1/agent/service/deregister/service-name
删除consul不需要的节点:
http://xx.xx.xx.xx:8500/v1/agent/force-leave/service-name
————————————————
关注下一篇

SpringCloud与Consul整合(Consul为注册中心)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值