consul集群搭建作为注册中心与高可用

Consul是什么

Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。

Consul server client模式介绍

client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个

集群中的consul节点都可以提供注册和查询微服务器的功能,Leader负责给其他Follower同步数据和监控各个节点的健康,一般建议注册到client模式consul
集群模式一般有至少3个server,若干client consul,需准备配置文件放在相应的目录下,需要建立data文件夹,集群server模式consul若超过半数挂掉,集群就挂掉了

下载安装 :
https://releases.hashicorp.com/consul/
linux下载安装:

unzip consul_xxx_linux_amd64.zip

cp consul /usr/local/bin/

查看是否安装成功:

consul

集群搭建 :

准备配置文件

Server配置文件config.json参考:
{
    "datacenter": "dc1",
    "data_dir": "/xxx/data", #consul数据存储位置
    "log_level": "INFO",
    "node_name": "server1", #集群中保证唯一
    "server": true,
    "ui": true,
    "bootstrap_expect": 3,
    "bind_addr": "192.xx.xx.106", #本机ip
    "client_addr": "0.0.0.0",
    "retry_join": ["192.xx.xx.106:8301"],
    "retry_interval": "5s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false,
    "discovery_max_stale": "10s",
    "performance": {
    "raft_multiplier": 2
  }
}
Server配置文件port.json参考:
{
  "ports": {
    "http": 8500,
    "dns": 8600,
    "serf_lan": 8301,
    "serf_wan": 8302,
    "server": 8300
  }
}
client配置文件config.json参考:
{
    "datacenter": "dc1",
    "data_dir": "/xxx/data", #consul数据存储位置
    "log_level": "INFO",
    "node_name": "client", #集群中保证唯一
    "server": false, #此节点为client模式
    "ui": true,
    "bootstrap_expect": 0,
    "bind_addr": "192.xxx.xxx.106", #本机ip
    "client_addr": "0.0.0.0",
    "retry_join": ["192.xxx.xxx.106:8301"],
    "retry_interval": "5s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false,
    "discovery_max_stale": "10s",
    "performance": {
    "raft_multiplier": 2
  }
}
client配置文件port.json参考:
{
  "ports": {
    "http": 8505,
    "dns": 8605,
    "serf_lan": 8351,
    "serf_wan": 8352,
    "server": 8350
  }
}

依次启动server consul :
注意修改配置文件路径

consul agent -config-dir /xxx/config/ > /dev/null 2>&1 &

注意事项:

  1. > /dev/null 2>&1 & 为静默后台启动,看consul启动日志时无需此命令
  2. -config-dir 为配置文件所在目录,consul默认加载所有.json结尾文件
  3. retry_join 的ip 端口为第一个启动的consul的ip, 端口与第一个启动的consul配置文件中的serf_lan端口一致,开启consul后自动加入cluster
  4. bind_addr 本机ip
  5. 配置文件中node_name 集群中保证唯一
  6. bootstrap_expect为集群server数量,数据中心中预期的服务器数。该值必须与集群中的其他服务器一致。提供后,Consul将等待指定数量的服务器可用,然后引导群集。
  7. 若不需要每个consul启动 ui界面,可将配置文件中的ui改为false
  8. serf_lan 内部通信端口
  9. port.json中http配置项为注册端口与ui端口
  10. raft_multiplier在生产中运行Consul 0.7及更高版本时建议将服务器性能参数配置回Consul的原始高性能设置,数值越小性能越高
  11. discovery_max_stale -为所有服务发现HTTP端点启用陈旧的请求。这等效max_stale于DNS请求的配置。如果该值为零(默认值),则所有服务发现HTTP终结点都转发给领导者。如果此值大于零,则任何Consul服务器都可以处理服务发现请求。如果Consul服务器落后于领导者多于discovery_max_stale,则查询将重新评估领导者以获取更多最新结果。领事代理还添加了一个新的X-Consul-Effective-Consistency响应头,用于指示代理是否进行了过时的读取。discover-max-stale是Consul 1.0.7中引入的一种方法,它是Consul操作员在代理级别强制来自客户端的过期请求的一种方法,默认为零,这与早期Consul版本中的默认一致性行为相匹配。

集群重启时建议删除所有data文件夹中内容,删除data后服务需要重新注册才能显示在UI上。
同一机器中测试集群时保证port.json内容唯一性。

集群主从状态查看:

consul operator raft list-peers -http-addr='ip:httpPort'
ip:httpPort 为任意confi.json的bind_addr和port.json中的http配置,默认请求127.0.0.1:8500

节点存活状态查看:

consul members -http-addr='ip:httpPort '
ip:httpPort 为任意config.json的bind_addr和port.json中的http配置,默认请求127.0.0.1:8500

部署结果:
consul集群搭建作为注册中心与高可用_第1张图片
使用springcloudconsul时代码配置文件适配:

Host: client consul ip 
Port: client consul http port
ip-address: 服务本机ip

spring:
  application:
    name: portalservice
  cloud:
    consul:
      host: 
      port: 
      discovery:
        instanceId: ${spring.application.name}xxx #保证集群中唯一
        prefer-ip-address: true #是否启用ip代替hostname注册
        ip-address: #服务所在机器ip,docker部署时需要填写宿主机ip
        serviceName: xxx

同一微服务注册为多个实例需代码中适配instanceId不同

高可用:

  1. 在Leader consul挂掉后,集群会重新选举Leader,在选举完成后服务注册发现与调用恢复正常, 重新选举时间为秒级
  2. 故障consul恢复后不会对现有集群产生影响,不会导致重新选举Leader
  3. 建议Server集群中加入client模式的consul,服务注册时全部注册到client模式consul中,client consul接受请求时会转发请求到server consul集群中处理
  4. client consul可部署多个,同一个服务的不同实例注册到不同的client consul,保证服务高可用
  5. 同一微服务注册为多个实例有负载均衡效果
    consul集群搭建作为注册中心与高可用_第2张图片

consul集群测试:

以下测试均为本人亲自测试,不上图见谅。

  1. Consul集群挂掉一个server模式节点,新的主consul被选出,服务调用正常
  2. Consul集群挂掉两个server模式节点,若server模式consul只有3个,如果挂掉2个会导致集群瘫痪,服务间调用仍可用,但是服务定期抛出consul连接异常
  3. Consul集群与client同时挂掉,服务间调用仍可用,但是服务定期抛出consul连接异常
  4. 重启集群server与client,服务不抛异常,服务间调用正常
  5. 同一服务注册为多个实例时有负载均衡效果

consul删除无用节点:

consul无法自动删除服务注册信息,必须手动删除
PUT方式请求集群中任意consul节点都可以
http://ip:port/v1/agent/service/deregister/CheckID
删除无用节点

consul agent 命令的常用选项

-data-dir
• 作用:指定agent储存状态的数据目录
• 这是所有agent都必须的
• 对于server尤其重要,因为他们必须持久化集群的状态
-config-dir
• 作用:指定service的配置文件和检查定义所在的位置
• 通常会指定为”某一个路径/consul.d”(通常情况下,.d表示一系列配置文件存放的目录)
-config-file
• 作用:指定一个要装载的配置文件
• 该选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖)
-dev
• 作用:创建一个开发环境下的server节点
• 该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
• 这种模式不能用于生产环境(因为第二条)
-bootstrap-expect
• 作用:该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。
-node
• 作用:指定节点在集群中的名称
• 该名称在集群中必须是唯一的(默认采用机器的host)
• 推荐:直接采用机器的IP
-bind
• 作用:指明节点的IP地址
• 有时候不指定绑定IP,会报Failed to get advertise address: Multiple private IPs found. Please configure one. 的异常
-server
• 作用:指定节点为server
• 每个数据中心(DC)的server数推荐至少为1,至多为5
• 所有的server都采用raft一致性算法来确保事务的一致性和线性化,事务修改了集群的状态,且集群的状态保存在每一台server上保证可用性
• server也是与其他DC交互的门面(gateway)
-client
• 作用:指定节点为client,指定客户端接口的绑定地址,包括:HTTP、DNS、RPC
• 默认是127.0.0.1,只允许回环接口访问
• 若不指定为-server,其实就是-client
-join
• 作用:将节点加入到集群
-datacenter(老版本叫-dc,-dc已经失效)
• 作用:指定机器加入到哪一个数据中心中

Client模式也提供服务的注册和查询,但Client模式不存储节点数据,Client将请求转发给Server进行处理,节点注册数据在Server端是持久化保存的,Client的数量可以无限多,Server的数量是受控制的。

你可能感兴趣的:(分布式)