Consul 入门-集群搭建

集群搭建

通过 Docker 来搭建一个由3个 Server 组成的数据中心集群,再启动一个 Client 容器来做服务注册和发现的入口,开模拟看看

Consul 入门-集群搭建

Server 启动命令

拉取最新镜像
$ docker pull consul

启动 server1,将容器的8500端口映射到主机的8900端口,提供UI界面
$ docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui
076d7658951753309e2b052315190921aa89ddf9e63b7055558867769747a954

查看容器 server1 的IP地址
$ docker inspect cunsul1
[
    {
        ...

        "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "1cf2fe7613c4b319b47058da0f61460f6d70c9829645741d0c9eadc23f7846af",
                    "EndpointID": "18840278673f45308e2b0333f054aeb89e817af0d53a1a5bcd84202017937cdf",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:32:ac:10:00:03",
                    "DriverOpts": null
                }
         }
    }

]

启动 server2,并加入集群
$ docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3
2543282e512bf6150bf340dde19460f85166568dc706bcd9b797eb66bbe9437a

启动 server3,并加入集群
$ docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3
cd333ecbb37d828560c4fdb4b65b103fa343565408e1d1e62eaf8a8f61711263

启动完成后,通过命令查看三个 server 间的交互

$  docker logs -f consul1 | grep "agent.server"
$  docker logs -f consul2 | grep "agent.server"
$  docker logs -f consul3 | grep "agent.server"

Consul 入门-集群搭建
通过日志可以看到,server2、server3 加入到了集群中,并且认定server1是 leader

登录任意一台 server,查看以集群 member 情况,三个 server 已经

$ docker exec -it consul1 sh
/ # consul members
Node          Address          Status  Type    Build   Protocol  DC   Segment
076d76589517  172.17.0.3:8301  alive   server  1.10.1  2         dc1
2543282e517b  172.17.0.4:8301  alive   server  1.10.1  2         dc1
cd333ecbb37d  172.17.0.5:8301  alive   server  1.10.1  2         dc1

通过 server1 暴露的端口来访问 web ui 界面

Consul 入门-集群搭建

除了 Services、Nodes 面板,还可以看到 Key/Value 面板,不要忘记,Consul 还支持简单的 KV 存储。

Client 启动命令

$ docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2
313r3d7ab14f021c335b0b4e7d4c5bdcad890531d80fa13273a3657702233112

Consul 入门-集群搭建

再次查看 consul 集群成员情况

$ docker exec -it consul2 consul members
Node          Address          Status  Type    Build   Protocol  DC   Segment
782b20094c63  172.17.0.4:8301  alive   server  1.10.2  2         dc1  <all>
b404b70879a2  172.17.0.2:8301  alive   server  1.10.2  2         dc1  <all>
e5f114c8c4df  172.17.0.3:8301  alive   server  1.10.2  2         dc1  <all>
3134cd7ab14f  172.17.0.5:8301  alive   client  1.10.2  2         dc1  <default>
</default></all></all></all>

现在一套完整的 Consul 集群搭建完成。

服务注册

编写一个redis服务的配置文件 redis-service.json

$ cat < redis-service.json
{
  "service": [
    {
    "name": "redis",
    "tags": ["master"],
    "address": "127.0.0.1",
    "port": 6379
    }
  ]
}
EOF

上传到 client 容器即 consul4 的/consul/config目录,并重新加载consul

$ docker cp redis-service.json consul4:/consul/config
$ docker exec -it consul4 consul reload
Configuration reload triggered

再次查 web ui,可以发现我们的服务中多了 redis

Consul 入门-集群搭建

健康检查

修改redis服务的配置,增加健康检查

$ cat < redis-service.json
{
  "service": [
    {
    "name": "redis",
    "tags": ["master"],
    "address": "172.17.0.6",
    "port": 6379,
    "check": {
        "name": "nc",
        "args": ["nc", "172.17.0.6", "6379"],
        "interval": "3s"
      }
    }
  ]
}
EOF

在重新上次reload,发现报错

$ docker exec -it consul4 consul reload
Error reloading: Unexpected response code: 500 (Failed reloading services: Failed to register service "redis": Scripts are disabled on this agent; to enable, configure 'enable_script_checks' or 'enable_local_script_checks' to true)

原来需要在启动client时开启 &#x811A;&#x672C;&#x68C0;&#x67E5;功能

$ docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 -e CONSUL_LOCAL_CONFIG='{"enable_script_checks": true}' consul agent --server=false --client=0.0.0.0 --join 172.17.0.2

从log中可以看到已经开启健康检查,再查看下web ui,监看检查是通过的

Consul 入门-集群搭建

此时如果我们将redis服务关闭(这里使用Docker Desktop 控制redis容器),以此来模拟redis服务故障的情况。

Consul 入门-集群搭建
查看一下log和web ui
Consul 入门-集群搭建
Consul 入门-集群搭建

此时redis服务经过consul的健康检查,已经认得为不健康,我们使用client提供的HTTP服务发现接口去查询,过滤健康的服务,返回为空,符合预期:

$ docker exec -it consul4 curl http://127.0.0.1:8500/v1/health/service/redis\?passing\=true
[]

将redis服务开启,再来对比一下:

$ docker exec -it consul4 curl http://127.0.0.1:8500/v1/health/service/redis\?passing\=true
[{"Node":{"ID":"8a73e872-c378-7197-0cf8-9f6f08c529ea","Node":"5f9387a8e3af","Address":"172.17.0.5","Datacenter":"dc1","TaggedAddresses":{"lan":"172.17.0.5","lan_ipv4":"172.17.0.5","wan":"172.17.0.5","wan_ipv4":"172.17.0.5"},"Meta":{"consul-network-segment":""},"CreateIndex":412,"ModifyIndex":412},"Service":{"ID":"redis","Service":"redis","Tags":["master"],"Address":"172.17.0.6","TaggedAddresses":{"lan_ipv4":{"Address":"172.17.0.6","Port":6379},"wan_ipv4":{"Address":"172.17.0.6","Port":6379}},"Meta":null,"Port":6379,"Weights":{"Passing":1,"Warning":1},"EnableTagOverride":false,"Proxy":{"Mode":"","MeshGateway":{},"Expose":{}},"Connect":{},"CreateIndex":416,"ModifyIndex":416},"Checks":[{"Node":"5f9387a8e3af","CheckID":"serfHealth","Name":"Serf Health Status","Status":"passing","Notes":"","Output":"Agent alive and reachable","ServiceID":"","ServiceName":"","ServiceTags":[],"Type":"","Interval":"","Timeout":"","ExposedPort":0,"Definition":{},"CreateIndex":413,"ModifyIndex":413},{"Node":"5f9387a8e3af","CheckID":"service:redis","Name":"nc","Status":"passing","Notes":"","Output":"","ServiceID":"redis","ServiceName":"redis","ServiceTags":["master"],"Type":"script","Interval":"","Timeout":"","ExposedPort":0,"Definition":{},"CreateIndex":416,"ModifyIndex":662}]}]

再看看其他场景

  1. 如果在再启动一个client consul5,consul4的数据会同步过来
$ docker run -d --name=consul5 -e CONSUL_BIND_INTERFACE=eth0 -e CONSUL_LOCAL_CONFIG='{"enable_script_checks": true}' consul agent --server=false --client=0.0.0.0 --join 172.17.0.2

$ docker exec -it consul5 curl http://127.0.0.1:8500/v1/health/service/redis\?passing\=true
返回redis信息
  1. 如果我们将consul1(即server端的Leader)关掉,剩余的两个 server 会重新进行选举consul2为新的leader
    Consul 入门-集群搭建

从 consul4 和 consul5 仍可访问到 redis 服务信息

$ docker exec -it consul4 curl http://127.0.0.1:8500/v1/health/service/redis\?passing\=true
返回redis信息
$ docker exec -it consul5 curl http://127.0.0.1:8500/v1/health/service/redis\?passing\=true
返回redis信息

总结

本篇讲述了通过 Docker 搭建一个高可用 Consul 集群的方式,通过日志理解 Consul 集群里,Server间、Client间、Server和Client间通信的过程。尝试以一个 Redis 服务为例,配置服务注册和健康检查,查看其实际效果。

Original: https://www.cnblogs.com/Zioyi/p/15225525.html
Author: Zioyi
Title: Consul 入门-集群搭建

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575868/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • DRF使用缓存

    在做项目的时候,有时很多数据都是经常被访问的而且数据是基本不变的,比如省市区的数据是经常被用户查询使用的,而且数据基本不变化,所以我们可以将省市区数据进行缓存处理,减少数据库的查询…

    数据库 2023年6月14日
    072
  • 12 用最有效率的方法计算 2 乘以 8

    2 << 3 左移是位运算符,直接操作内存中整数对应的二进制位,效率高; 左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方。 Original: https:…

    数据库 2023年6月6日
    075
  • 项目的部署和环境搭建

    项目的部署和环境搭建 cd /opt (一般项目部署的文件代码都放在/opt目录下) 3.进入项目跟目录下的docker目录: cd crm _pro/docker 4.执行doc…

    数据库 2023年6月16日
    0107
  • MySQL中实现中文转拼音

    — 插入数据 INSERT INTO t_base_pinyin ( pin_yin_, code_ ) VALUES ( "a", 20319 ),( &q…

    数据库 2023年6月14日
    099
  • vue部署在nginx后刷新404,nginx.conf一行代码解决掉

    直接 vim conf/nginx.conf文件 server {listen 8081;server_name localhost; charset koi8-r; access…

    数据库 2023年6月14日
    0104
  • Test post from Metablog Api

    This is the body of the post posted on2011-02-06 17:25 迷你软件 阅读(328 ) 评论() 编辑 本网站绝大部分资源来源于I…

    数据库 2023年6月11日
    091
  • 设计模式之(7)——装饰设计模式

    定义:装饰设计模式允许向一个现有的对象添加功能,而不改变其结构(这就很符合程序设计的” 开闭原则“),重点突出类功能的增强,属于结构型创建模式,这种模式创建…

    数据库 2023年6月14日
    081
  • 我的创作纪念日

    机缘 2018 年 08 月 07 日是我的创作一周年纪念日。大三刚过完,我还是一名 IT 小白,也并没有考研的想法,当时应该是在实习,偶尔一次上网搜索代码问题的时候看到了 CSD…

    数据库 2023年6月6日
    097
  • 从零开始搭建高可用的k8s集群

    一、环境准备 使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0…

    数据库 2023年6月14日
    091
  • 多商户商城系统功能拆解24讲-平台端分销会员

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    095
  • Sencha Cmd 常用命令

    1、获取帮助 sencha help generate app 2、创建应用程序 sencha -sdk e:\ext\ext6 generate app -classic Sim…

    数据库 2023年6月9日
    089
  • MySQL实战45讲 18

    18 | 为什么这些SQL语句逻辑相同,性能却差异巨大? 在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数…

    数据库 2023年6月14日
    081
  • 为什么我选择MySQL Workbench・一

    一、官方 官方提供的工具必然有其优势。 MySQL Workbench有两个版本,社区版和商业版。社区版是免费的。 二、第一个选择 使用MySQL之前用的是SQL Server而微…

    数据库 2023年6月9日
    072
  • mysql常用操作汇总

    工作中经常用会遇到这种情况,可以访问mysql所在的服务器,但是服务器端口不对外暴露(通常因为安全原因)。这时,操作数据库只能通过命令行和 mysql client窗口来实现。我对…

    数据库 2023年5月24日
    080
  • MySQL45讲之幻读

    前言 本文介绍了什么是虚读,虚读存在的问题和解决方法,以及间隙锁带来的麻烦。 [En] This paper introduces what is phantom reading,…

    数据库 2023年5月24日
    085
  • ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@’localhost’

    发现网上很多帖子都是互相抄袭的,关键是不能解决执行后的问题,在这里分享我的解决方案。 [En] Found a lot of posts on the Internet are c…

    数据库 2023年5月24日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球