接入层使用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 欢迎大家访问.提意见.