18
第四周架构作业
一、负载均衡常见算法总结
(一)轮询(Round Robin)
- 原理
- 这是最简单的负载均衡算法。它按照顺序依次将请求分配给后端服务器。假设后端有3台服务器,编号为1、2、3,那么第一个请求分配给服务器1,第二个请求分配给服务器2,第三个请求分配给服务器3,第四个请求又回到服务器1,如此循环。
- 这种算法不考虑服务器的当前负载情况,只是简单地按照固定的顺序分配请求。
- 优点
- 实现简单,对服务器的性能要求不高。在服务器性能相近的情况下,能够比较公平地分配请求。
- 缺点
- 如果后端服务器的性能差异较大,可能会导致性能差的服务器负载过重。例如,一台性能较差的服务器可能处理一个请求的时间是性能较好的服务器的两倍,但轮询算法仍然会按照相同的频率分配请求给它。
(二)加权轮询(Weighted Round Robin)
- 原理
- 在轮询算法的基础上引入权重的概念。每台服务器被分配一个权重值,权重值越大,表示该服务器的性能越强。在分配请求时,根据权重来决定服务器被分配请求的频率。例如,有两台服务器,服务器A的权重是2,服务器B的权重是1。那么在分配请求时,服务器A会连续获得两个请求,然后服务器B获得一个请求,再回到服务器A获得两个请求……
- 优点
- 能够根据服务器的性能差异进行一定程度的负载均衡。性能强的服务器可以承担更多的请求,性能弱的服务器承担较少的请求。
- 缺点
- 仍然不能完全动态地根据服务器的实时负载情况来分配请求。如果服务器的性能在运行过程中发生变化(如服务器A突然出现故障或者性能急剧下降),这种算法不能及时调整请求分配策略。
(三)最少连接(Least Connections)
- 原理
- 该算法会实时统计每台服务器当前正在处理的连接数。当有新的请求到来时,将请求分配给当前连接数最少的服务器。例如,服务器A有5个连接,服务器B有3个连接,服务器C有4个连接,那么新的请求就会分配给服务器B。
- 优点
- 能够比较准确地根据服务器的实时负载情况来分配请求。如果某台服务器因为某种原因(如处理复杂的请求)连接数较多,新的请求就会被分配到其他连接数较少的服务器,从而实现较好的负载均衡。
- 缺点
- 实现相对复杂,需要实时跟踪每个服务器的连接数。而且,它假设每个连接对服务器资源的占用是相同的,这在实际情况下可能不完全准确。例如,有些连接可能只是简单的请求,占用资源少,而有些连接可能涉及大量的数据处理,占用资源多。
(四)加权最少连接(Weighted Least Connections)
- 原理
- 结合了权重和最少连接的概念。每台服务器都有一个权重值,同时算法还会考虑服务器的当前连接数。在分配请求时,会优先考虑连接数最少的服务器,但如果两台服务器的连接数相近,就会根据权重来决定分配给哪台服务器。例如,服务器A权重为2,当前连接数为3;服务器B权重为1,当前连接数为2。当有新的请求时,虽然服务器B的连接数最少,但考虑到权重因素,可能会将请求分配给服务器A。
- 优点
- 综合考虑了服务器的性能(通过权重体现)和实时负载(通过连接数体现),能够实现较好的负载均衡效果。
- 缺点
- 实现复杂度更高,需要同时维护服务器的权重和连接数信息,并且在分配请求时要进行更复杂的计算。
(五)IP哈希(IP Hash)
- 原理
- 根据请求的源IP地址进行哈希计算,然后根据哈希值将请求分配到特定的服务器。例如,通过一个哈希函数将客户端的IP地址映射到一个哈希值,再根据这个哈希值和服务器数量的关系来确定将请求分配给哪台服务器。如果客户端的IP地址是192.168.1.100,经过哈希计算后得到的值映射到服务器A,那么这个客户端的所有请求都会被分配到服务器A。
- 优点
- 可以保证同一个客户端的请求总是被分配到同一台服务器,这对于需要会话保持的应用很有帮助。例如,在电商网站中,用户在一个会话过程中添加到购物车的商品信息存储在服务器的会话中,使用IP哈希算法可以确保用户的所有操作都在同一台服务器上处理,避免了会话数据在不同服务器之间同步的问题。
- 缺点
- 如果某台服务器出现故障,那么原本分配到这台服务器的客户端请求就会出现问题。而且,这种算法不能很好地根据服务器的负载情况进行动态调整,因为它是基于客户端IP进行固定分配的。
二、使用Keepalived实现Nginx和HAProxy高可用
(一)Keepalived简介
- Keepalived是一种高可用性软件,主要用于实现服务器的故障切换。它通过虚拟IP(VIP)和健康检查机制来确保服务的高可用性。当主服务器出现故障时,Keepalived可以自动将虚拟IP漂移到备用服务器,从而保证服务的连续性。
(二)实现Nginx高可用
- 环境准备
- 两台服务器,一台作为主服务器(Master),一台作为备用服务器(Backup)。假设主服务器IP为192.168.1.10,备用服务器IP为192.168.1.11。
- 在两台服务器上都安装Nginx和Keepalived。
- 配置Keepalived
- 主服务器配置
- 编辑Keepalived配置文件(通常在
/etc/keepalived/keepalived.conf)。 -
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.1.100 } } - 在这个配置中,
state MASTER表示这台服务器是主服务器,virtual_ipaddress定义了虚拟IP地址192.168.1.100,这是客户端访问的IP地址。priority表示优先级,主服务器的优先级比备用服务器高。
- 编辑Keepalived配置文件(通常在
- 备用服务器配置
-
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.1.100 } } - 备用服务器的
state是BACKUP,并且priority比主服务器低。
-
- 主服务器配置
- 启动Keepalived和Nginx
- 在两台服务器上都启动Keepalived和Nginx服务。
-
systemctl start keepalived systemctl start nginx
- 测试高可用性
- 通过虚拟IP地址192.168.1.100访问Nginx服务。正常情况下,请求会被发送到主服务器。当主服务器出现故障(如手动关闭Nginx服务或者关闭服务器)时,虚拟IP会自动漂移到备用服务器,客户端仍然可以通过虚拟IP访问Nginx服务。
(三)实现HAProxy高可用
- 环境准备
- 两台服务器,一台作为主服务器(Master),一台作为备用服务器(Backup)。假设主服务器IP为192.168.1.20,备用服务器IP为192.168.1.21。
- 在两台服务器上都安装HAProxy和Keepalived。
- 配置Keepalived
- 主服务器配置
- 编辑Keepalived配置文件。
-
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.1.200 } }
- 备用服务器配置
-
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.1.200 } }
-
- 主服务器配置
- 配置HAProxy
- 在两台服务器上配置HAProxy,使其指向后端的真实服务器。例如,后端服务器IP为192.168.1.30和192.168.1.31。
- 编辑HAProxy配置文件(通常在
/etc/haproxy/haproxy.cfg)。 -
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:80 default_backend http_back backend http_back balance roundrobin server server1 192.168.1.30:80 check server server2 192.168.1.31:80 check
- 启动Keepalived和HAProxy
- 在两台服务器上都启动Keepalived和HAProxy服务。
-
systemctl start keepalived systemctl start haproxy
- 测试高可用性
- 通过虚拟IP地址192.168.1.200访问后端服务。正常情况下,请求会被发送到主服务器的HAProxy,然后由HAProxy转发到后端服务器。当主服务器出现故障时,虚拟IP会自动漂移到备用服务器,客户端仍然可以通过虚拟IP访问后端服务。

浙公网安备 33010602011771号