返回顶部
首页 > 资讯 > 数据库 >基于Docker的Consul集群实现服务发现
  • 131
分享到

基于Docker的Consul集群实现服务发现

基于Docker的Consul集群实现服务发现 2015-11-26 15:11:31 131人浏览 绘本
摘要

  服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的。比如说一个数据集群中,可以

基于Docker的Consul集群实现服务发现

 

服务发现

其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,
以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的。
比如说一个数据集群中,可以分为读节点或者写节点,写节点和读节点都是相对的,不是硬绑定的,某一个逻辑节点,随着故障转移及恢复,是可以变换身份的(写变读,读变写;主降从,从升主等等)
集群对外提供服务的时候,对于外界来说,集群中节点身份变换的时候需要对外透明,外界无需因为集群节点的身份变换而更改配置,这就需要一个解耦合的服务。
Consul,ZooKeeper中间件,就是做这个透明转换的,也就是服务发现。这里简单测试consul作为服务发现的实现。 Consul是一种服务解耦解决方案(service mesh solution,纠结了好久不知道怎么翻译提供具有服务发现配置和分段功能的全功能控制系统(control plane)
这些功能中的每一个都可以根据需要单独使用也可以一起使用以构建完整的服务解耦 即便是用了谷歌翻译的情况下,这段翻译纠结了半天,不知道怎么翻译合适。

如下是按照自己对consul做服务发现的理解,简单整理的逻辑结构图,其原理还是比较容易理解的。
Consul is a service mesh solution providing a full featured control plane with service discovery, configuration, and segmentation functionality. Each of these features can be used individually as needed, or they can be used together to build a full service mesh. Consul requires a data plane and supports both a proxy and native integration model. Consul ships with a simple built-in proxy so that everything works out of the box, but also supports 3rd party proxy integrations such as Envoy. https://www.consul.io/intro/index.html 它提供如下几个关键功能 服务发现   Consul的某些客户端可以提供一个服务例如api或者Mysql其它客户端可以使用Consul去发现这个服务的提供者   使用DNS或者Http应用可以很容易的找到他们所依赖的服务 健康检查
  Consul客户端可以提供一些健康检查这些健康检查可以关联到一个指定的服务服务是否返回200 OK),也可以关联到本地节点内存使用率是否在90%以下)。
  这些信息可以被一个操作员用来监控集群的健康状态被服务发现组件路由时用来远离不健康的主机 键值存储 
  应用可以使用Consul提供的分层键值存储用于一些目的包括动态配置特征标记协作leader选举等等通过一个简单的HTTP API可以很容易的使用这个组件
多数据中心 
  Consul对多数据中心有非常好的支持这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域
Consul被设计为对devops群体和应用开发者友好他非常适合现代的可伸缩的基础设施     本文基于Docker来实现consul的服务发现配置,方法consul agent是通过JSON注册的模式实现服务注册,
其中consul的服务端是3节点的集群,客户点是6节点3主3从的Redis服务器集群,consul实现redis集群中读写服务注册于发现。

尽管Redis cluster有多IP方式驱动连接,这里仅仅为了测试“服务发现”的。
其实本来想测试mysql单主模式的MGR,实现读写分离的服务发现,但是Mysql有点太重了,机器配置不够,所以做了Redis的集群来测试服务发现
    consul服务端集群安装配置
作为服务发现的载体,consul是可以使用单节点运行的,作为解析服务的载体,是一个非常重要的角色,集群化具有更强的抗灾性,因此更多的时候是以多节点集群的方式运行解析服务的这个载体。

这里使用三个节点作为consul的集群服务端来运行,三个consul的服务节点IP分别是:172.18.0.11 ,172.18.0.12,172.18.0.13,需要固定IP docker network create --subnet=172.18.0.11/16 mynetwork  docker run -itd --name consul01 --net mynetwork --ip 172.18.0.11 -v /usr/local/docker_file/consul01/:/usr/local/ Centos   docker run -itd --name consul02 --net mynetwork --ip 172.18.0.12 -v /usr/local/docker_file/consul02/:/usr/local/ centos   docker run -itd --name consul03 --net mynetwork --ip 172.18.0.13 -v /usr/local/docker_file/consul03/:/usr/local/ centos   分别在每个容器中创建consul服务(unzip consul_1.6.2_linux_amd64.zip解压缩即可,非常简单) 三个容器节点的server.json节点配置文件如下,唯一的区别就是bind_addr指定为当前节点的IP
如下是172.18.0.11节点的配置,不同节点仅需修改bind_addr为对应机器(容器)的IP

/usr/local/server.json 
{
    "datacenter": "dc1",
    "data_dir": "/usr/local/",
    "log_level": "INFO",
    "server": true,
    "bootstrap_expect": 3,
    "bind_addr": "172.18.0.11",
    "client_addr": "0.0.0.0",
    "start_join": ["172.18.0.11","172.18.0.12","172.18.0.13"],
    "ui":true
}
依次登录三个容器中,以server模式启动consul服务
./consul agent -server -config-dir=/usr/local > /usr/local/consul.log &
由于配置文件中制定了集群的IP列表,因此无需显式加入集群(cluster join),正常情况下,启动三个节点后,会自动组成一个集群,并且自动选举出来一个leader。 consul 集群服务的状态 ./consul members --http-addr 172.18.0.11:8500 ./consul operator raft list-peers -http-addr=172.18.0.12:8500

consul客户端安装配置 容器客户端节点安装,6个节点IP分别是:172.18.0.21,172.18.0.22,172.18.0.23,172.18.0.24,172.18.0.25,172.18.0.26
docker run -itd --name redis01 --net mynetwork --ip 172.18.0.21 -v /usr/local/docker_file/redis01/:/usr/local/ centos 
docker run -itd --name redis02 --net mynetwork --ip 172.18.0.22 -v /usr/local/docker_file/redis02/:/usr/local/ centos 
docker run -itd --name redis03 --net mynetwork --ip 172.18.0.23 -v /usr/local/docker_file/redis03/:/usr/local/ centos 
docker run -itd --name redis04 --net mynetwork --ip 172.18.0.24 -v /usr/local/docker_file/redis04/:/usr/local/ centos 
docker run -itd --name redis05 --net mynetwork --ip 172.18.0.25 -v /usr/local/docker_file/redis05/:/usr/local/ centos 
docker run -itd --name redis06 --net mynetwork --ip 172.18.0.26 -v /usr/local/docker_file/redis06/:/usr/local/ centos
  6个client节点的配置以及服务定义,服务探测脚本如下
如下是172.18.0.21节点的配置,不同节点仅需修改bind_addr为对应机器(容器)的IP

client.json
{
  "data_dir": "usr/local/consuldata",
  "enable_script_checks": true,
  "bind_addr": "172.18.0.21",
  "retry_join": ["172.18.0.11","172.18.0.12","172.18.0.13"],
  "retry_interval": "30s",
  "rejoin_after_leave": true,
  "start_join": ["172.18.0.11","172.18.0.12","172.18.0.13"]
}
分别启动三个client节点的consul服务,以client的模式运行,启动后,正常情况下会自动加入到consul的服务端集群中。 ./consul agent -config-dir=/usr/local/consuldata > /usr/local/consuldata/consul.log & ./consul members --http-addr 172.18.0.11:8500     consul客户端代理服务注册
6个容器节点依次安装redis,做成一个集群(步骤略),这里的consul客户端代理的是一个3中3从的Redis集群,这里不列出来Redis集群的安装。
Redis集群安装参考https://www.cnblogs.com/wy123/p/12012848.html,还是非常方便的,在本地(容器节点)一键创建6个节点3主3从的集群。
其中主节点是172.18.0.21,172.18.0.22,172.18.0.23,从节点是172.18.0.24,172.18.0.25,172.18.0.26

这里是使用 w-master-redis-8888.service.consul名字作为三个redis集群节点的服务代理。
172.18.0.21节点上的redis-master-8888.json(172.18.0.22,172.18.0.23,172.18.0.24,172.18.0.25,172.18.0.26 类同,仅需修改address)
{
  "services": 
  [
    {
      "name": "w-master-redis-8888",
      "tags": [
        "master"
      ],
      "address": "172.18.0.21",
      "port": 8888,
      "checks": [
        {
         "args":["sh","-c","/usr/local/consuldata/check_redis_master.sh 172.18.0.21 8888 ******"],
         "shell":"/bin/bash",
         "interval": "15s"
        }
      ]
    }
  ]
}

redis-slave-8888.json 

{
  "services": 
  [
    {
      "name": "r-slave-redis-8888",
      "tags": [
        "master"
      ],
      "address": "172.18.0.21",
      "port": 8888,
      "checks": [
        {
         "args":["sh","-c","/usr/local/consuldata/check_redis_slave.sh 172.18.0.21 8888 ******"],
         "Shell":"/bin/bash",
         "interval": "15s"
        }
      ]
    }
  ]
}

Consul client节点的Redis主节点(写节点)服务检查脚本check_redis_master.sh
以下脚本来源于https://www.cnblogs.com/Gomysql/p/8010552.html,做了简单的修改,在节点的身份判断逻辑上需要加强。

#!/bin/bash
host=$1
myport=$2
auth=$3
if [ ! -n "$auth" ]
then
auth=""""
fi
comm="/usr/local/redis_instance/redis8888/bin/redis-cli -h $host -p $myport -a $auth " 
role=`echo "INFO Replication"|$comm |grep -Ec "role:master"`
echo "INFO Replication"|$comm
if [ $role -ne 1 ]
then
    exit 2
fi

Consul client节点的Redis从节点服务检查脚本check_redis_slave.sh

#!/bin/bash
host=$1
myport=$2
auth=$3
if [ ! -n "$auth" ]
then
auth=""""
fi
comm="/usr/local/redis_instance/redis8888/bin/redis-cli -h $host -p $myport -a $auth "
role=`echo "INFO Replication"|$comm |grep -Ec "role:slave"`
echo $role
echo "INFO Replication"|$comm


if [ $role -ne 1 ]
then
    exit 2
fi

 

Consul服务发现

redis集群配置成功后,重新加载代理服务,consul reload,一切正常的话,consul服务端就可以解析配置的服务了。
如下注册了两个服务,分别是r-slave-redis-8888,w-master-redis-8888,分别代表Redis集群的读写节点。

可以看到,成功地解析了 w-master-redis-8888.service.consul这个服务,映射到172.18.0.21,172.18.0.22,172.18.0.23三个节点。
需要注意的是,这三个节点都是写节点,这里仅仅是为了实现服务发现(尽管redis 有多IP的驱动支持)

r-slave-redis-8888.service.consul服务的解析,指向了三个从节点,172.18.0.24,172.18.0.25,172.18.0.26

故障转移之后的服务发现:模拟主节点故障,对172.18.0.21节点手动故障转移,现在172.18.0.21与172.18.0.24角色交换

Redis集群故障转以后的服务发现解析结果 对于w-master-redis-8888.service.consul这个服务,成功解析到172.18.0.24,172.18.0.22,172.18.0.23三个主节点

Redis集群故障转以后的服务发现解析结果 对于w-master-redis-8888.service.consul这个服务,成功解析到172.18.0.24,172.18.0.22,172.18.0.23三个主节点

 

遇到的问题:
1,cosnul服务端集群的时候,clustercenter一开始自定义了一个名称myconsule_datacenter,导致client节点死活加不进来,按照默认的dc1就没有问题
目前还不理解这个datacenter的命名规则是什么?
2,容器节点中的shell脚本要授予可执行权限chmod +x check_XXX.sh
3,其他异常问题,一定要看日志,搜索一下基本上都有结果。
以下纯粹是Redis集群的问题,与Consul没有直接关系,仅作为本测试中遇到的问题。
4,容器节点的Redis集群时,需要移除bind_ip的127.0.0.1节点,直接配置docker创建容器时候的IP,创建集群的时候会一致等待,waiting for the cluster to join
这一点redis-cli --cluster做的很扯淡,明明找不到节点,还要死等,不人为终止的话,他会一直waiting
5,Redis集群时候,因为主从都是相对的,需要相互识别对方,主从节点都要指定“masterauth”和“requirepass”,且密码一致,否则执行cluster  failover提示成功,但故障转移不成功
6,遇到一个灵异的问题(之前单机多实例的时候也遇到过),在启动容器上的Redis服务的时候,如果使用绝对路径启动,在创建集群的时候会出现从节点无法添加到集群中去的情况,停止服务,以相对路径方式重启之后就没有这个问题


总的来说consul这个中间件使用起来还算是比较简单,配置也很清爽,不像某些中间件令人作呕的配置结构(mycat???)
这里没有配置多数据中心模式,仅配置了单数据中心模式,作为一款服务发现的中间件,是完全没有问题的,尤其是作为MySQL集群不支持多IP连接驱动的数据库连接。


参考:

https://www.cnblogs.com/gomysql/p/8010552.html
https://blog.csdn.net/jeffscott/article/details/88888708 https://www.cnblogs.com/duanxz/p/10564502.html https://www.cnblogs.com/gomysql/p/8010552.html https://segmentfault.com/a/1190000016677665 https://blog.csdn.net/liuzhuchen/article/details/81913562
您可能感兴趣的文档:

--结束END--

本文标题: 基于Docker的Consul集群实现服务发现

本文链接: https://lsjlt.com/news/3441.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于Docker的Consul集群实现服务发现
      服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的。比如说一个数据集群中,可以...
    99+
    2015-11-26
    基于Docker的Consul集群实现服务发现
  • Docker中怎么利用Consul集群实现一个服务发现功能
    本篇文章给大家分享的是有关Docker中怎么利用Consul集群实现一个服务发现功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。服务发现  ...
    99+
    2024-04-02
  • 基于Docker搭建Redis主从集群的实现
    目录1、拉取 Redis 镜像2、创建 6 个 Redis 容器3、启动 Redis 容器4、组建 Redis 集群5、关于Redis集群搭建最近陆陆续续有不少园友加我好友咨询 re...
    99+
    2024-04-02
  • Docker上实现Redis集群搭建
    目录1、拉取镜像2、创建Redis容器3、启动并组建集群启动容器4、存在的问题环境:Docker + ( Redis:5.0.5 * 3 ) 1、拉取镜像 docker pull...
    99+
    2024-04-02
  • docker搭建kafka集群的方法实现
    目录一、原生Docker命令二、镜像选择三、集群规划四、Zookeeper集群安装五、Kafka集群安装一、原生Docker命令 1. 删除所有dangling数据卷(即无用的Vol...
    99+
    2024-04-02
  • Docker consul的容器服务更新与发现的问题小结
    目录一、Docker consul的容器服务更新与发现 1、什么是服务注册与发现 2、什么是consul?3、consul提供的一些关键特性二、Consul部署第一步:consul服...
    99+
    2024-04-02
  • 基于Java实现简单的邮件群发功能
    目录pom文件引入第三方依赖java代码如下运行测试pom文件引入第三方依赖 <dependency> <groupId>javax.mail<...
    99+
    2024-04-02
  • docker-compose启动redis集群的实现步骤
    目录1. 伪集群安装持久化存储启动集群集群初始化2. 测试读写测试key所在节点多机集群见我的另一篇文档《docker-compose启动Redis多机集群(6台服务器3主3从)》,此处是一个用于学习的伪集群。 1. 伪...
    99+
    2022-07-13
    docker-compose启动redis集群 docker-compose redis集群
  • Docker-Compose搭建Spark集群的实现方法
    目录一、前言二、docker-compose.yml三、启动集群四、结合hdfs使用一、前言 在前文中,我们使用Docker-Compose完成了hdfs集群的构建。本文将继续使用D...
    99+
    2024-04-02
  • Docker-Compose搭建Redis集群的实现教程
    目录1. 集群配置2.编写Redis.conf3. 在每个redis-*文件夹下创建redis.conf文件,并写入如下内容:4.编写docker-compose.yml文件5.开启集群6.测试6.1 查看节点属性6.2...
    99+
    2023-03-24
    Docker-Compose搭建Redis集群
  • docker-compose部署etcd集群的实现步骤
    目录编写docker-compose.yml 运行docker-compose 检查搭建状态 测试节点 Golang 与 etcd 简单交互 编写docker-compose.yml...
    99+
    2024-04-02
  • Docker consul的容器服务更新与发现的问题有哪些
    这篇文章主要为大家展示了“Docker consul的容器服务更新与发现的问题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Docker consul的容器服务更新与发现的问题有哪些”这篇...
    99+
    2023-06-20
  • Docker部署SQL Server 2019 Always On集群的实现
    目录Docker部署Always on集群安装Docker架构准备相关容器镜像操作系统开始配置-容器步骤1:创建Dockerfile步骤2:编译镜像步骤3:创建容器步骤4:启动容器步...
    99+
    2024-04-02
  • docker实现redis集群搭建的方法步骤
    目录一、创建redis docker基础镜像 二、制作redis节点镜像 三、运行redis集群  引用:摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都...
    99+
    2024-04-02
  • docker-compose搭建etcd集群的实现(三节点)
    目录1. 环境说明2. 部署etcd1etcd2etcd33. 验证3.1 查看集群状态3.2 读写测试1. 环境说明 节点IPetcd110.10.239.31etcd210.10...
    99+
    2024-04-02
  • docker搭建Hadoop CDH高可用集群实现
    目录0. docker安装1. 构建Centos-cdh镜像2. 容器安装ClouderaManager2.1 初始化环境2.2 配置中文环境变量2.3 设置NTP时间同步服务2.4 安装mysql2.5 准备Cloudera-Manage...
    99+
    2024-04-02
  • docker搭建es集群实现过程详解
    目录前言什么是es使用docker搭建es集群前言 该系列默认开启Nacos 服务,还不会搭建的小伙伴可以参考往期文章~ 本节重点是给大家介绍利用docker来搭建Es集群,废话...
    99+
    2023-01-31
    docker搭建es集群 es集群搭建
  • 基于Java怎么实现简单的邮件群发功能
    今天小编给大家分享一下基于Java怎么实现简单的邮件群发功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pom文件引入第三...
    99+
    2023-06-30
  • java基于NIO实现群聊模式
    本文实例为大家分享了java基于NIO实现群聊模式的具体代码,供大家参考,具体内容如下 Client package com.qst.chat; import java.io....
    99+
    2024-04-02
  • Java基于NIO实现群聊功能
    本文实例为大家分享了Java基于NIO实现群聊功能的具体代码,供大家参考,具体内容如下 一、群聊服务器 package com.dashu.netty.group_chat; ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作