.Net Core微服务——Consul(4):主从、集群
延续上一篇的话题继续,顺便放上一篇的传送门:点这里。
集群的必要性
consul本身就是管理集群的,现在还需要给consul搞个集群,这是为啥?因为consul单点也容易挂啊!万一管理集群的consul挂掉了,那么相当于上下游应用都变成了瞎子,看不到也调不到。所以集群的必要性不用我说了吧?
Server & Client
生产环境下,可以选择上面两种模式,下面我就简称S端、C端。说说它俩有啥不一样:
S端:
1、数量不宜过多,一般推荐3、5个,要求是奇数。
2、持久化保存节点数据。
3、多个S端之间是主从关系(Leader/Follower),Leader要额外负责监控各节点的健康并且同步给Follower。
C端:
1、数量没限制。
2、不保存节点数据。
相同点就是S端、C端都可以注册、查询。
Leader & Follower
这模式我简称主从好了,它只针对S端。Leader是根据Raft算法自动选举得出的,不用手动指定,所有的Follower接到信息以后,都要提交给Leader,然后Leader同步给其他的Follower。并且Leader要一直发心跳给所有的Follower证明“我还活着”,否则其他的Follower之间就要再选举出一个新的Leader了。这就导致S端最好不要扩展太多,否则你会怀疑人生。至于为什么要求S端数量是奇数,其实很好理解,偶数容易影响选举结果导致效率变低,比如两票对两票,谁来当Leader?其实去了解一下Raft算法就知道这里的主从怎么运行的,什么原理。我上个神器:戳这里,不用谢我。
S端
老规矩,还是用docker。先跑三个起来:
docker run -d --restart=always --name=server1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302/udp -p 8302:8302 -p 8400:8400 -p 8500:8500 -p 8600:8600 -h server1 consul agent -server -bind=0.0.0.0 -bootstrap-expect=3 -node=server1 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui
docker run -d --restart=always --name=server2 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 9300:8300 -p 9301:8301 -p 9301:8301/udp -p 9302:8302/udp -p 9302:8302 -p 9400:8400 -p 9500:8500 -p 9600:8600 -h server2 consul agent -server -bind=0.0.0.0 -join=你服务器的IP -node=server2 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui
docker run -d --restart=always --name=server3 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 10300:8300 -p 10301:8301 -p 10301:8301/udp -p 10302:8302/udp -p 10302:8302 -p 10400:8400 -p 10500:8500 -p 10600:8600 -h server3 consul agent -server -bind=0.0.0.0 -join=你服务器的IP -node=server3 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui
bootstrap-expect:集群所需S端的最小数量,低于这个数量无法选举出leader。
join:加入到哪个集群,需要目标服务器放通tcp8301端口,否则会出现这种情况

可以语句查看主从关系:
docker exec -t server1 consul operator raft list-peers

也可以直接进入页面查看主从关系,结果一样:

把现在的leader干掉的话,会自动选举一个新的leader出来:

server3成为了新的leader,而且只要它不挂,leader身份是不会转移的。比如我把server1启动以后,leader没有转移过去:

OK,现在S端已经是集群了,而且它们之间的数据都是互通共存的。验证一下:
server1新增键值,key=shenzhenma,value=hellow:

server2查看:

server3修改value=hellow world以后,server1查看:

C端
现在再来启动客户端:
docker run -d --restart=always --name=client1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt":true}' -p 11300:8300 -p 11301:8301 -p 11301:8301/udp -p 11302:8302/udp -p 11302:8302 -p 11400:8400 -p 11500:8500 -p 11600:8600 -h client1 consul agent -bind=0.0.0.0 -retry-join=你服务器的IP -node=client1 -data-dir=/tmp/data-dir -client 0.0.0.0 -ui
想要多个客户端的话,改一下端口和名字就可以了,我这里跑了3个,如图:

和刚才的3个S端一起,这6个都是一体的,数据都会自动同步,任意节点注册修改数据都会在其他节点看到。
入口统一
我把集群弄好了,但是现在的集群还没有发挥作用。前几篇文章有讲服务注册,consul注册的时候需要一个固定的地址。集群有很多节点,每一个IP端口都不一样,如果下端只和其中一个节点产生联系,万一这个节点挂了,下端就失去consul的支持了,集群的作用也没发挥出来。所以给下端一个统一的入口是必要的,这里用Nginx的Upstream模式实现,修改下配置文件就行了:
upstream myconsul {
server 42.XX.XX.64:8500;
server 42.XX.XX.64:9500;
server 42.XX.XX.64:10500;
server 42.XX.XX.64:11500;
server 42.XX.XX.64:12500;
server 42.XX.XX.64:13500;
}
server{
listen 88;
server_name localhost;
location / {
proxy_pass http://myconsul;
}
}
配置文件修改好重启一下,进去看看能不能访问:

OK,下端注册服务时,统一用这个地址就可以了。跑两个试试(下端代码就不发了,前面几篇文章有):

成功了!切换到其他consul节点看下能否正确展示:

很显然是OK的。基于我之前为服务配置的健康检查,最后来看下服务状态变化会不会同步给其他节点,比如我停掉其中一个:

变更的状态也很快同步到了其他节点。到这里为止,consul的集群就已经实现了,东西还是有点多的,如果实践遇到麻烦,欢迎讨论。
.Net Core微服务——Consul(4):主从、集群的更多相关文章
- 微服务Consul系列之集群搭建
在上一篇中讲解了Consul的安装.部署.基本的使用,使得大家有一个基本的了解,本节开始重点Consul集群搭建,官方推荐3-5台Server,因为在异常处理中,如果出现Leader挂了,只要有超过一 ...
- 微服务架构:Eureka集群搭建
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 服务注册.发现是微服务架构的关键原理之一,由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就必 ...
- 使用 Loki 微服务模式部署生产集群
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500523&idx=1&sn=0994af2b50 ...
- java架构之路-(微服务专题)nacos集群精讲实战
上次回顾: 上次博客,我们主要说了微服务的发展历程和nacos集群单机的搭建,单机需要-m standalone启动,集群建议使用nginx做一下反向代理,自行保证mysql和ngxin的高可用. 本 ...
- 微服务:Eureka配置集群环境
一.注册中心编码 1.使用idea创建一个spring boot项目,pom如下: <?xml version="1.0" encoding="UTF-8" ...
- 微服务Consul系列之服务注册与服务发现
在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...
- 微服务 consul使用
前言 常见的注册中心有zookeeper .eureka.consul.etcd.从生态发展.便利性.语言无关性等角度来综合考量,选择consul,多数据中心支持,支持k-v能力,可扩展为配置中心.g ...
- .NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)
重温Consul最少化集群的搭建
- .NET Core微服务之基于Consul实现服务治理
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发 ...
随机推荐
- JWT原理实现代码
JWT学习文章: 第一篇:JWT原理 第二篇:JWT原理实现代码 上一篇学习了JWT的基本理论,这一篇将根据原理进行代码实现. 要想实现jwt的加密解密,要先生成一个SecurityKey,大家可以在 ...
- excel自动记录项目完成进度,是否逾期,逾期/提前完成天数,计算天数可以把now()改为today()
=IF(D38="",NOW()-C38,F38) 注:如果没有启用迭代计算,可以点击"文件"-"选项"-"公式"-&q ...
- Ubuntu18.04 LTS x64 构建ARM交叉编译环境(尝试,但失败了!!!估计是编译器没选对)
[测试而已,由于需要了解编译器和处理器体系,因此先放弃该方法] 动机 入门嵌入式开发,又需要 Windows 又需要 Linux,但资料给的竟然是 Ubuntu9,导致我不能使用 VSCode Rem ...
- ABP Framework:移除 EF Core Migrations 项目,统一数据上下文
原文:Unifying DbContexts for EF Core / Removing the EF Core Migrations Project 目录 导读:软件开发的一切都需要平衡 动机 警 ...
- 100、nginx_https安全链接配置
100.1. tcp的三次握手和四次挥手的过程: 1.三次握手(建立连接): 第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次:服务器 ...
- 关于 Index '8' specified is out of bounds.
报类似这样的错误暂时我只发现了两个原因: 1, 数组超出了界线,这个自己多多注意,加判断,在循环的时候看看是不是有结束条件 2, 你需要提交的网页不存在.有可能是因为你没有这个文件.可能是你的文件名错 ...
- 并发王者课-铂金10:能工巧匠-ThreadLocal如何为线程打造私有数据空间
欢迎来到<并发王者课>,本文是该系列文章中的第23篇,铂金中的第10篇. 说起ThreadLocal,相信你对它的名字一定不陌生.在并发编程中,它有着较高的出场率,并且也是面试中的高频面试 ...
- hugegraph 源码解读 —— 索引与查询优化分析
为什么要有索引 gremlin 其实是一个逐级过滤的运行机制,比如下面的一个简单的gremlin查询语句: g.V().hasLabel("label").has("pr ...
- tableview折叠动效
缘起于看见书旗小说的列表有点击折叠的动效,觉得十分炫酷.想了三分钟,不知道怎么写.晚上百度了下,知道了大致流程,于是自己实现了下,发现不少坑,于是写下这篇博文 实现原理: 1 tableview ce ...
- Ionic命令笔记
Ionic命令:ionic serve 开启服务调试ionic cordova prepare android 生成android原生项目 ionic cordova run browser 打包成混 ...