接入LVS+Nginx和服务发现

接入层使用LVS与Nginx的配合可以发挥这两种负载均衡器的优势.LVS性能更高.便于构建Nginx集群.LVS作为Nginx集群的四层负载均衡器.可以有效地提高Nginx的扩展性.而Nginx的功能更为强大.用它作为业务的Http服务器的七层负载均衡.能将不同的HTTP URL调度到不同的业务服务并提高业务服务的高可用性和可扩展性.LVS+Nginx的机房接入层如图所示.

将机房配置的LVS的公网IP地址(即VIP)作为域名.客户端请求经过DNS解析后进入LVS.然后LVS使用如FULLNAT模式将客户端请求转发到任意一台Nginx服务器.Nginx服务器在根据HTTP URL将客户端请求转发到某个upstream服务池的任意一个服务器实例上.

LVS高可用:

可以采用主从热备方案解决单点高可用问题.为原本单点的节点(主节点)配置一个从节点.在主节点正常对外提供服务期间从节点并不工作.而在主节点发生故障后会自动切换到从节点继续对外提供服务.业界常见的实现主从热备的技术方案是Keepalived+VIP.例如主节点A和从节点B均安装了Keepalived并启动后.主节点A就会通过ARP响应包告知局域网VIP对应的MAC地址为MAC-A(主节点MAC地址).之后所有收到这个ARP响应包的网络设备在访问VIP时.就会根据MAC-A访问到主节点A.当从节点B监听到主节点A宕机后.它就会替代主节点A向局域网回复ARP响应包:"VIP对应的MAC地址为MAC-B".于是.之后所有收到ARP响应包的网络设备再次访问VIP时.就会根据MAC-B转而访问到从节点B.从节点B自动替代了主节点A.如图所示.

Keepaliced+VIP的架构图如下.

LVS虽然性能极高.但是也有上限.想要更好的解决某个系统的高并发性能问题.就要为这个系统增加水平扩展能力.如图所示.

如果有N台LVS对外服务.就要配置N个VIP.这些VIP都绑定同一个域名.客户端依赖DNS轮询来决定访问哪台LVS.

1.通过DNS轮询方式扩展了LVS的性能.

2.通过Keepalived保证LVS.

3.通过LVS扩展Nginx性能.

4.将Nginx作为业务HTTP服务器的负载均衡器.提高了业务服务的高可用性和扩展性.

服务发现:

注册与发现:

服务发现的技术原理并不复杂.一般通过提供一个服务注册中心来实现.这个服务注册中心主要负责两件事.管理每个服务的地址列表(注册)和将某服务的地址告知调用者(发现).如图所示.

目前业界有很多可选择的服务注册中心组件.比如Spring Cloud的Eureka CNCF旗下的CoreDNS 阿里的Nacos等.

可用地址管理:

由于服务的创建 销毁 升级 扩容/缩容都会造成服务地址列表的变更.所以服务的每个实例启动的时候都需要向服务注册中心注册自己的地址.并在退出时注销地址.只有这样才能使得服务注册中心一直维护最新的服务列表.如果某服务实例突然挂掉.还没有来得及向服务中心注销.会使得注册中心提供不可用的服务地址.所以服务中心应该有对已注册的服务地址的探活能力.

1.主动探活:

服务注册中心周期性的向每个已注册的服务地址发起探测请求.如果某个地址探测成功.则认为这个地址是可用的,否则.则认为这个地址是失效的.服务注册中心主动摘除这个地址.

2.心跳探活:

服务中心为每个已注册的服务地址记录一个最近心跳时间.服务实例启动后.每隔一段时间(如30s)就向服务注册中心发送一个心跳包.服务注册中心收到心跳包后更新对应服务地址的最近心跳时间.服务注册中心会启动定时器来检查每个服务地址的最近心跳时间相比于当前时间过了多久.如果超过了某个阈值(如150s).就可以认为这个服务实例已经不可用了.服务注册中心将其摘除.

地址变更推送:

当服务的地址列表发生变更时.为了让调用者尽快感知到这件事.服务注册中心需要主动推送最新地址列表给调用者.推送数据可能遇到的一个问题是"推送风暴"--如果某服务有100个调用者,每个调用者有1000个实例.那么每当这个服务的地址列表发生变更时.就要给100000个节点推送数据.如果有多个服务的地址列表发生变更.则会推送的节点会更多.这会严重占有网络带宽.

首先.建议推送的数据是"新增了哪些地址" "哪些地址已废弃"的增量数据形式.而不是全量地址列表.这能在一定程度上节约推送数据的网络带宽.

其次.服务注册中心本身也是一个服务.如果公司的服务注册中心有条件部署大量的实例.推送风暴问题就解决了.

最后.可以采用推拉结合的方式.服务注册中心最多给N个调用者节点推送地址变更信息.其他节点周期性的(如1min)从服务注册中心拉取最新地址列表.

语雀地址www.yuque.com/itbosunmian...?

《Go.》 密码:xbkk 欢迎大家访问.提意见.

相关推荐
萧邯嵌入式笔记2 小时前
一文吃透断言 assert
后端
Digital_Sunrise3 小时前
首发!检测你是否被中转站注入提示词攻击!
后端
fliter3 小时前
Rust 中的小字符串:smol_str 与 smartstring 的对决
后端
一个做软件开发的牛马3 小时前
Java 常用类:String不可变、新时间API与包装类陷阱
java·后端
刀法如飞4 小时前
AI时代:一文搞懂DDD领域驱动设计
后端·架构·ai编程
weixin_468466854 小时前
Prometheus监控服务部署与实战指南
服务器·后端·python·docker·自动化·prometheus
会编程的土豆4 小时前
Go interface 底层的 itab 到底是什么
开发语言·后端·golang
candyTong4 小时前
Claude Code 每次调用 API 时,上下文是怎么"拼"出来的?
javascript·后端·架构
java_cj4 小时前
MySQL 执行原理深度剖析:查询成本计算与优化器内幕
数据库·后端·mysql