diff --git a/notes/集群.md b/notes/集群.md
index 2cc3a7c8..32588068 100644
--- a/notes/集群.md
+++ b/notes/集群.md
@@ -4,8 +4,8 @@
* [一、负载均衡](#一负载均衡)
* [负载均衡算法](#负载均衡算法)
* [1. 轮询(Round Robin)](#1-轮询round-robin)
- * [2. 加权轮询(Weighted Round Robbin)](#2-加权轮询weighted-round-robbin)
- * [3. 最少连接(least Connections)](#3-最少连接least-connections)
+ * [2. 加权轮询(Weighted Round Robin)](#2-加权轮询weighted-round-robin)
+ * [3. 最少连接(Least Connections)](#3-最少连接least-connections)
* [4. 加权最少连接(Weighted Least Connection)](#4-加权最少连接weighted-least-connection)
* [5. 随机算法(Random)](#5-随机算法random)
* [6. 源地址哈希法 (IP Hash)](#6-源地址哈希法-ip-hash)
@@ -19,6 +19,7 @@
* [Sticky Session](#sticky-session)
* [Session Replication](#session-replication)
* [Session Server](#session-server)
+ * [客户端保存](#客户端保存)
@@ -30,7 +31,7 @@
负载均衡器可以用来实现高可用以及伸缩性:
-- 高可用:当某个节点故障时,负载均衡器会将用户请求转发到另外的节点上,从而保证所有服务持续可用;
+- 高可用:负载均衡器通过健康检查发现某个节点故障时,会将用户请求转发到另外的节点上,从而保证所有服务持续可用;
- 伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。
负载均衡器运行过程包含两个部分:
@@ -53,7 +54,7 @@
-#### 2. 加权轮询(Weighted Round Robbin)
+#### 2. 加权轮询(Weighted Round Robin)
加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值,性能高的服务器分配更高的权值。
@@ -61,7 +62,9 @@
-#### 3. 最少连接(least Connections)
+实际实现(例如 Nginx 的平滑加权轮询)会把请求交错发送,避免连续的请求集中到同一台服务器上。
+
+#### 3. 最少连接(Least Connections)
由于每个请求的连接时间不一样,使用轮询或者加权轮询算法的话,可能会让一台服务器当前连接数过大,而另一台服务器的连接过小,造成负载不均衡。
@@ -77,7 +80,7 @@
#### 4. 加权最少连接(Weighted Least Connection)
-在最少连接的基础上,根据服务器的性能为每台服务器分配权重,再根据权重计算出每台服务器能处理的连接数。
+在最少连接的基础上,根据服务器的性能为每台服务器分配权重,将请求发送给“当前连接数 / 权重”最小的服务器。
#### 5. 随机算法(Random)
@@ -91,10 +94,12 @@
源地址哈希通过对客户端 IP 计算哈希值之后,再对服务器数量取模得到目标服务器的序号。
-可以保证同一 IP 的客户端的请求会转发到同一台服务器上,用来实现会话粘滞(Sticky Session)
+可以保证同一 IP 的客户端的请求会转发到同一台服务器上,用来实现会话粘滞(Sticky Session)。
+缺点是同一出口 IP 后面的大量用户会落到同一台服务器上,造成负载不均;服务器数量变化时取模结果会全部改变,可以改用一致性哈希。
+
### 转发实现
#### 1. HTTP 重定向
@@ -132,6 +137,8 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服
在这种负载均衡转发方式下,客户端不直接请求源服务器,因此源服务器不需要外部 IP 地址,而反向代理需要配置内部和外部两套 IP 地址。
+反向代理工作在应用层,属于七层负载均衡,可以根据 URL、Cookie 等内容进行转发,常用的有 Nginx、HAProxy。
+
优点:
- 与其它功能集成在一起,部署简单。
@@ -144,7 +151,7 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服
在操作系统内核进程获取网络数据包,根据负载均衡算法计算源服务器的 IP 地址,并修改请求数据包的目的 IP 地址,最后进行转发。
-源服务器返回的响应也需要经过负载均衡服务器,通常是让负载均衡服务器同时作为集群的网关服务器来实现。
+源服务器返回的响应也需要经过负载均衡服务器,通常是让负载均衡服务器同时作为集群的网关服务器来实现。对应 LVS 的 NAT 模式。
优点:
@@ -158,11 +165,11 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服
在链路层根据负载均衡算法计算源服务器的 MAC 地址,并修改请求数据包的目的 MAC 地址,并进行转发。
-通过配置源服务器的虚拟 IP 地址和负载均衡服务器的 IP 地址一致,从而不需要修改 IP 地址就可以进行转发。也正因为 IP 地址一样,所以源服务器的响应不需要转发回负载均衡服务器,可以直接转发给客户端,避免了负载均衡服务器的成为瓶颈。
+通过配置源服务器的虚拟 IP 地址和负载均衡服务器的 IP 地址一致,从而不需要修改 IP 地址就可以进行转发。也正因为 IP 地址一样,所以源服务器的响应不需要转发回负载均衡服务器,可以直接转发给客户端,避免了负载均衡服务器成为瓶颈。
-这是一种三角传输模式,被称为直接路由。对于提供下载和视频服务的网站来说,直接路由避免了大量的网络传输数据经过负载均衡服务器。
+这是一种三角传输模式,被称为直接路由,对应 LVS 的 DR 模式,要求源服务器和负载均衡服务器位于同一个局域网内。对于提供下载和视频服务的网站来说,直接路由避免了大量的网络传输数据经过负载均衡服务器。
-这是目前大型网站使用最广负载均衡转发方式,在 Linux 平台可以使用的负载均衡服务器为 LVS(Linux Virtual Server)。
+网络层和链路层的方式不解析应用层协议,属于四层负载均衡。链路层是目前大型网站使用最广的负载均衡转发方式,在 Linux 平台可以使用的负载均衡服务器为 LVS(Linux Virtual Server),通常用 LVS 做四层负载均衡,再用 Nginx 做七层负载均衡。
参考:
@@ -179,7 +186,8 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服
缺点:
-- 当服务器宕机时,将丢失该服务器上的所有 Session。
+- 当服务器宕机时,将丢失该服务器上的所有 Session;
+- 服务器不再是无状态的,不利于伸缩。
@@ -190,13 +198,13 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服
缺点:
- 占用过多内存;
-- 同步过程占用网络带宽以及服务器处理器时间。
+- 同步过程占用网络带宽以及服务器处理器时间,因此只适合规模很小的集群。
### Session Server
-使用一个单独的服务器存储 Session 数据,可以使用传统的 MySQL,也使用 Redis 或者 Memcached 这种内存型数据库。
+使用一个单独的服务器存储 Session 数据,可以使用传统的 MySQL,也可以使用 Redis 或者 Memcached 这种内存型数据库。
优点:
@@ -204,10 +212,21 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服
缺点:
-- 需要去实现存取 Session 的代码。
+- 需要去实现存取 Session 的代码(Spring Session 等框架已经封装);
+- Session Server 本身需要保证高可用。
+
+这是目前最常用的方式。
+### 客户端保存
+
+把用户信息签名后放在 Cookie 或者 JWT 中,由客户端保存,服务端只需要验证签名。
+
+缺点:
+
+- 无法主动让某个会话失效。
+
参考:
- [Session Management using Spring Session with JDBC DataStore](https://sivalabs.in/2018/02/session-management-using-spring-session-jdbc-datastore/)