Docker 容器部署 Consul 集群

Docker 容器部署 Consul 集群

Consul 介绍

Consul 提供了分布式系统的服务发现和配置的解决方案。基于go语言实现。并且在git上开放了源码consul-git。consul还包括了分布式一致协议的实现,健康检查和管理UI。Consul和zk相比较起来,更加轻量级,而且一致性上基于RAFT算法,zk使用的Paxos 算法。跟zk比较起来更加轻量级,Consul提供了通过一个DNS或者HTTP接口的方式来控制执行,而zk却需要自己定制解决方案。同样比较被广泛使用的服务发现解决方案中也有etcd 。etcd也是采用RAFT算法实现,但是etcd不提供管理UI。Consul跟Vagrant都是Hashicorp 公司的产品。作为一整套的分布式系统解决方案,配合同样基于go语言实现的Docker开源技术,都是一个不错的选择。Docker 的简单介绍,可以参考 Docker 介绍 (本文后面将不再介绍docker 命令以及容器等相关概念)。配合Docker来做应用容器,用Consul 来做集群的服务发现和健康检查,并且还可以轻量级得做到水平和垂直可扩展。

Consul Agent、Server、Client

通过运行 consul agent 命令,可以通过后台守护进程的方式运行在所有consul集群节点中。并且可以以server或者client 模式运行。并且以HTTP或者DNS 接口方式,负责运行检查和服务同步。Server模式的agent负责维护consul集群状态,相应RPC查询,并且还要负责和其他数据中心(DataCenter)进行WAN Gossips交换。Client 节点是相对无状态的,Client的唯一活动就是转发(foward)请求给Server节点,以保持低延迟和少资源消耗。
  如下图,是官网的一个典型系统结构,Consul建议我们每个DataCenter的Server的节点最好在3到5个之间,以方便在失败以及数据复制的性能。Client的数量可以任意。图中,最重要的两个概念一个是Gossip协议,一个是Consensus 协议。DataCenter的所有节点都会参与到Gossip协议。Client 到Server 会通过LAN Gossip。所有的节点都在Gossip pool中,通过消息层来实现节点之间的通信以达到故障检测的目的,并且不需要给Client配置Server的地址。而Server节点还会参与到WAN Gossip池中。这样,通过Server节点就可以让DataCenter之间做简单的服务发现。比如增加一个Datacenter就只需要让Server节点参与到Gossip Pool中。并且,DataCneter之间的通信和服务请求就可以通过WAN Gossip 来随机请求另外一个DataCenter的Server节点,然后被请求的Server 会再把请求foward到本DataCenter的leader节点。Server leader的选举是通过Consul的Raft 算法实现。Leader 节点需要负责所有请求和处理,并且这些请求也必须复制给所有的其他非leader的Server节点。同样,非Leader节点接收到RPC请求的时候也会foward 到Leader节点。
  

在Docker 容器中启动Consul Agent

  1. 下载 progrium/consul 镜像
  2. 以Server 模式在容器中启动一个agent
    docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap
docker@boot2docker:~$ docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap 
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting raft data migration...
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!Node name: 'node1'Datacenter: 'dc1'Server: true (bootstrap: true)Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 53, RPC: 8400)Cluster Addr: 172.17.0.1 (LAN: 8301, WAN: 8302)Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: falseAtlas: <disabled>==> Log data will now stream in as it occurs:2015/09/29 03:13:43 [INFO] serf: EventMemberJoin: node1 172.17.0.12015/09/29 03:13:43 [INFO] serf: EventMemberJoin: node1.dc1 172.17.0.12015/09/29 03:13:43 [INFO] raft: Node at 172.17.0.1:8300 [Follower] entering Follower state2015/09/29 03:13:43 [INFO] consul: adding server node1 (Addr: 172.17.0.1:8300) (DC: dc1)2015/09/29 03:13:43 [INFO] consul: adding server node1.dc1 (Addr: 172.17.0.1:8300) (DC: dc1)2015/09/29 03:13:43 [ERR] agent: failed to sync remote state: No cluster leader2015/09/29 03:13:45 [WARN] raft: Heartbeat timeout reached, starting election2015/09/29 03:13:45 [INFO] raft: Node at 172.17.0.1:8300 [Candidate] entering Candidate state2015/09/29 03:13:45 [INFO] raft: Election won. Tally: 12015/09/29 03:13:45 [INFO] raft: Node at 172.17.0.1:8300 [Leader] entering Leader state2015/09/29 03:13:45 [INFO] consul: cluster leadership acquired2015/09/29 03:13:45 [INFO] raft: Disabling EnableSingleNode (bootstrap)2015/09/29 03:13:45 [INFO] consul: New leader elected: node12015/09/29 03:13:45 [INFO] consul: member 'node1' joined, marking health alive2015/09/29 03:13:45 [INFO] agent: Synced service 'consul'

这里试验一下8600(DNS) 接口,然后我们就用dig的方式可以交互和访问了。

用Docker 容器启动Consul集群

分别启动三个server节点

刚才启动单独的服务节点,用bootstrap。现在启动三个节点需要用bootstrap-expect 3 ,并且绑定到容器的同一个ip,这里绑定到server1上。

docker@boot2docker:~$ docker run -d –name server1 -h server1 progrium/consul -server -bootstrap-expect 3

docker@boot2docker:~JOINIP=”(docker inspect -f ‘{{ .NetworkSettings.IPAddress }}’ server1)”

docker@boot2docker:~dockerrun−d−−nameserver2−hserver2progrium/consul−server−joinJOIN_IP

docker@boot2docker:~dockerrun−d−−nameserver3−hserver3progrium/consul−server−joinJOIN_IP

然后用docker命令查看已经启动的容器。关于docker 相关内容可以参考“Docker介绍 ”

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                                              NAMES
87bd80f8132d        progrium/consul     "/bin/start -server -"   3 seconds ago        Up 2 seconds        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp   server3
a18d0597bf2d        progrium/consul     "/bin/start -server -"   18 seconds ago       Up 17 seconds       53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 8500/tcp   server2
448a550224fb        progrium/consul     "/bin/start -server -"   About a minute ago   Up About a minute   53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp   server1

启动client节点

docker@boot2docker:~dockerrun−d−p8400:8400p8500:8500p8600:53/udp−hclient1progrium/consul−joinJOIN_IP

查看容器信息:

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                        NAMES
0410ad7bb68c        progrium/consul     "/bin/start -join 172"   4 seconds ago       Up 3 seconds        53/tcp, 0.0.0.0:8400->8400/tcp, 8300-8302/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->53/udp   focused_leakey
87bd80f8132d        progrium/consul     "/bin/start -server -"   3 minutes ago       Up 3 minutes        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp                                             server3
a18d0597bf2d        progrium/consul     "/bin/start -server -"   3 minutes ago       Up 3 minutes        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp                                             server2
448a550224fb        progrium/consul     "/bin/start -server -"   4 minutes ago       Up 4 minutes        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 8500/tcp                                             server1

进入容器查看

我们可以进入容器来查看一下consul是如何管理agent节点,以及选举server 的leader的。这个时候我们关掉Server节点,容器name是server1的 448a550224fb 容器,再观察。
   关闭后server1信息:

==> Gracefully shutting down agent...2015/09/29 04:08:17 [INFO] consul: server starting leave2015/09/29 04:08:17 [INFO] raft: Removed peer 172.17.0.28:8300, stopping replication (Index: 18)2015/09/29 04:08:17 [INFO] raft: Removed peer 172.17.0.29:8300, stopping replication (Index: 18)2015/09/29 04:08:17 [INFO] raft: Removed ourself, transitioning to follower2015/09/29 04:08:17 [INFO] raft: Node at 172.17.0.27:8300 [Follower] entering Follower state2015/09/29 04:08:17 [INFO] serf: EventMemberLeave: server1.dc1 172.17.0.272015/09/29 04:08:17 [INFO] consul: cluster leadership lost2015/09/29 04:08:17 [INFO] raft: aborting pipeline replication to peer 172.17.0.28:83002015/09/29 04:08:17 [INFO] raft: aborting pipeline replication to peer 172.17.0.29:83002015/09/29 04:08:17 [INFO] consul: removing server server1.dc1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:18 [INFO] agent: requesting shutdown2015/09/29 04:08:18 [INFO] consul: shutting down server2015/09/29 04:08:18 [INFO] agent: shutdown complete

server2节点信息如下:

docker@boot2docker:~$ docker attach server22015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:20 [WARN] raft: Rejecting vote from 172.17.0.29:8300 since we have a leader: 172.17.0.27:83002015/09/29 04:08:20 [WARN] raft: Heartbeat timeout reached, starting election2015/09/29 04:08:20 [INFO] raft: Node at 172.17.0.28:8300 [Candidate] entering Candidate state2015/09/29 04:08:21 [INFO] raft: Node at 172.17.0.28:8300 [Follower] entering Follower state2015/09/29 04:08:21 [INFO] consul: New leader elected: server3

可以看到server1 节点下线,并且重新选举leader server节点为server3,再看一下server3 信息如下:

docker@boot2docker:~$ docker attach server32015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:20 [WARN] raft: Heartbeat timeout reached, starting election2015/09/29 04:08:20 [INFO] raft: Node at 172.17.0.29:8300 [Candidate] entering Candidate state2015/09/29 04:08:20 [INFO] raft: Duplicate RequestVote for same term: 22015/09/29 04:08:21 [WARN] raft: Election timeout reached, restarting election2015/09/29 04:08:21 [INFO] raft: Node at 172.17.0.29:8300 [Candidate] entering Candidate state2015/09/29 04:08:21 [INFO] raft: Election won. Tally: 22015/09/29 04:08:21 [INFO] raft: Node at 172.17.0.29:8300 [Leader] entering Leader state2015/09/29 04:08:21 [INFO] consul: cluster leadership acquired2015/09/29 04:08:21 [INFO] consul: New leader elected: server32015/09/29 04:08:21 [INFO] raft: pipelining replication to peer 172.17.0.28:83002015/09/29 04:08:21 [INFO] consul: member 'server1' left, deregistering

client 节点信息如下:

docker@boot2docker:~$ docker attach focused_leakey2015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:21 [INFO] consul: New leader elected: server3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

swing皮肤包 substance

分享一下swing皮肤包substance 资源可到公众号获取

基于Android的聊天软件,Socket即时通信,实现用户在线聊天

基于Android的聊天软件&#xff0c;Socket即时通信&#xff0c;单聊&#xff0c;聊天室&#xff0c;可自行扩展功能&#xff0c;完善细节。 【实例功能】 1.运行程序&#xff0c;登录界面, 注册账号功能 2.进入主界面&#xff0c;有通讯录, 个人信息。 3.点击好友会话框&#…

用Docker搭建Elasticsearch集群

用Docker搭建Elasticsearch集群 对于用Docker搭建分布式Elasticsearhc集群的一个介绍&#xff0c;以及一些实施中遇到问题的总结 搜索服务简述 结合业务的场景&#xff0c;在目前的商品体系需要构建搜索服务&#xff0c;主要是为了提供用户更丰富的检索场景以及高速&#xf…

Go实现简单的RESTful_API

Go实现简单的RESTful_API 何为RESTful API A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. A RESTful API – also referred to as a RESTful web service – is based on representational state t…

Docker使用Dockerfile构建简单镜像

Docker使用Dockerfile构建简单镜像 首先确保系统已经安装docker 构建镜像 安装基础镜像 sudo docker pull ubuntu 查看镜像是否已经拉取成功 REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu …

Weave Scope安装

Weave Scope安装 首先确保已经安装docker 实时了解Docker容器状态 查看容器基础设施的概况&#xff0c;或者专注于一个特殊的微服务。从而轻松发现并纠正问题&#xff0c;确保你的容器化应用的稳定与性能。 内部细节与深度链接 查看容器的指标、标签和元数据。 在一个可扩展…

MYSQL导入数据出现ERROR 1049 (42000): Unknown database 'n??;'

MYSQL导入数据出现ERROR 1049 (42000): Unknown database ‘n??;’ 背景 我需要将一个csv表中的数据导入数据库创建好的表中&#xff0c;产生的问题如下&#xff1a; 原因寻找 因为我并没有使用’n??;的数据库&#xff0c;所以很好奇这个错怎么来的&#xff0c;尝试如下…

Win10忘记ubuntu子系统密码

Win10忘记ubuntu子系统密码 目前新版win10已经支持ubuntu子系统&#xff0c;如果忘记子系统密码怎么办&#xff1f; linux单用户模式 在ubuntu中如果忘记密码&#xff0c;可以在启动的时候&#xff0c;在grub内更改用户为root进入&#xff0c;这样就可以使用最高权限的单用户…

蓝桥杯练习系统,入门训练,Java版

蓝桥杯练习系统&#xff0c;入门训练&#xff0c;Java版序列求和圆的面积Fibonacci数列希望大家提建议我加以修改序列求和 import java.util.*; public class Main {public static void main(String[] args) {Scanner cinnew Scanner(System.in);long ncin.nextLong();System.…

SVG入门理解

SVG入门SVG 元素简单的形状rectcircleellipselinetextpath SVG 样式分层和绘图顺序透明度 SVG入门 当我们用SVG生成和操作一些炫酷的效果时,D3是最佳选择。使用div和其他原生HTML元素绘图也是可以的&#xff0c;但是太笨重&#xff0c;而且会受到不同浏览器的限制&#xff0c…

【哈佛幸福课笔记】【1】

【哈佛幸福课笔记】【1】 ​ ​ 一个月的时间看完了哈佛幸福课&#xff0c;正如Tal所说课程的结束才是学习的开始。对于课程观点的思考&#xff0c;对于个人习惯的培养&#xff0c;对于思维模式的转变还需要花大量的时间去练习。这个系列的帖子将作为我个人的读书笔记&#x…

Angular 6+ 之新版service

Angular 6+ 之新版service Angular 6已经发布了,Angular 6中有一些新功能,其中一个就是提供service的共享实例。 回首Angular 5- 下面是一段熟悉的代码,可以为整个应用程序提供服务。我们将它添加到AppModule中的providers[]。 自定义服务类 // data.service.ts export c…

Angular CDK Layoout 检测断点

Angular CDK检测断点 Angular CDK有一个布局包,其服务可以轻松检测窗口大小并与媒体查询匹配。这使得你可以完全控制UI并适应不同的屏幕尺寸。 让我们快速了解一下如何使用CDK的布局模块。 Setup 首先,您需要确保在您的应用中安装了Angular CDK: $ npm install @angular/c…

Angular Render2

Angular Render2 Renderer2类是Angular以service的形式提供的抽象,允许操作应用程序的元素而无需直接触摸DOM。这是推荐的方法,因为它可以更容易地开发可以在没有DOM访问的环境中呈现的应用程序,例如在服务器上,web worker,或者原生移动上。 需要注释的是,现在已弃用原始…

数据分析方法

数据分析方法 什么是数据分析 从数据到信息的这个过程&#xff0c;就是数据分析。数据本身并没有什么价值&#xff0c;有价值的是我们从数据中提取出来的信息。 分类 分类分析的目标是&#xff1a;给一批人(或者物)分成几个类别&#xff0c;或者预测他们属于每个类别的概率…

RAID阵列基础知识

RAID阵列基础知识 独立硬盘冗余阵列 &#xff08;RAID, Redundant Array of Independent Disks&#xff09;,旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列。 RAID的种类 这里我们只介绍比较常用的RAID类型&am…

timeshift备份你的Linux系统

timeshift备份你的Linux系统 安装 打开终端&#xff08;ctrl alt T&#xff09;并逐个执行以下命令 sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get install timeshift 创建 点击Create按钮 默认不能备份用户下的文件&#xff0c;所以…

Go语言vscode环境配置

Go语言vscode环境配置 此教程在GO已经安装成功的前提下。 安装vscode扩展 在vscode扩展里面搜索go&#xff0c;然后下载扩展。 安装go 插件 在$GOPATH目录下创建bin,pkg,src切换到$GOPATH/bin目录下&#xff0c;打开终端输入以下命令&#xff0c;不需要翻墙&#xff1a; go…

Angular实现悬浮球组件

Angular实现悬浮球组件 在手机 App 上,我们经常会看到悬浮球的东东,用着可能很舒服,但是 web 网页上却很少见,今天我们就通过 Angular 来实现,当然使用其他框架也是可以的。 功能要求: 支持设置直径支持点击触发信号支持设置鼠标按压时间实现的过程中省略的部分天填坑过…

Docker+Nginx部署Angular国际化i18n

Docker+Nginx部署Angular国际化i18n 在Angular项目中添加default.conf文件 default.conf 为了支持局域网,增加一个域名,即本地的局域网ip地址。 server {listen 80;server_name localhost;server_name 192.168.2.172;location / {root /usr/share/nginx/html;lo…