vlambda博客
学习文章列表

服务路由及负载均衡策略

上一篇文章讲了随着系统规模的扩大,需要从业务层面上垂直将业务拆成更小的服务,那服务的使用者如何找到这些服务呢,这就涉及到服务的路由。服务的路由本质上是找到分布式系统中提供某种服务的主机,通过RPC方式调用运行在该主机上的服务。


负载均衡

上一讲讲了负载均衡在分布式集群中的重要作用,它也是系统水平伸缩的重要技术保障。当多台机器作为一个集群对外提供某个服务的时候,将服务请求合理地分配在服务主机上,就叫负载均衡。系统可以根据需要在不同的网络层做负载均衡,也可以使用软件或硬件来实现负载均衡。例如LVS作为4层负载均衡设备,可以根据"连接数"来分发请求,Nginx作为7层网络负载系统,可以根据"HTTP请求数"来做负载均衡。

常用的类型有:

2. 通过软件例如Nginx或ZooKeeper实现负载均衡:使用ZooKeeper作为服务注册中心时,服务调用者到注册中心查询服务提供者的列表,然后根据负载均衡算法从中选取一台服务器发送服务请求。

3. 通过硬件实现负载均衡:例如F5类似于网络交换机,常常放在流量入口最前端,按照路由算法分发数据请求。

负载均衡算法:

负载均衡一般来说需要达到两个目标:

1. 服务请求能被分配到合适的机器,确保系统各主机在处理上负载相对平衡,进而保证服务请求做到的高性能。

2. 系统可以动态添加或减少计算节点,做到可伸缩,且在业务层面基本无感知,做到高可用。

3. 服务就近原则,确保服务处理的逻辑靠近数据源,服务产生的数据在一定程度上方便分库分表,易隔离。

4. 减少系统的服务处理节点和数据存储节点的抖动。

主要算法包括:

1. 轮询(Round Robin):负载按顺序平均分配到服务器上。它是最简单的处理策略,无须关注服务器本身的状态,只要服务器处于工作状态,便会把请求转发给该服务器。

服务路由及负载均衡策略


2. 加权轮询法:负载根据服务器的权重进行任务分配,一般是根据服务器的硬件配置进行静态配置的。它能解决不同服务器处理能力有差异。这个方法比较简单可靠。

3. 根据负载来做均衡:负载可包括服务器的CPU使用率,内存使用率,I/O使用情况等。负载均衡器需要感知系统服务器的运行状态,从中挑选出合适的服务器。这种算法实际比较复杂,应用复杂度高,实际上应用没有轮询法多。

5. ID Hash法:ID可以是系统为某项业务的每个服务消费者或请求分配的标识,例如Session ID。Session ID相同的同一个会话期间的请求可以被路由到同一台服务器。

ZooKeeper

ZooKeeper是一个开源的,分布式的应用程序协调服务。它提供的功能包括:命名服务,配置管理,集群管理,分布式锁,负载均衡等。

ZooKeeper基于ZNode构建基础的数据模型,采用类似文件系统的树形结构。包括持久性的ZNode和临时性的ZNode。


一个典型的ZooKeeper服务架构如下:


系统中的服务节点通过创建和监听ZooKeeper服务的ZNode节点来实现协同。