高可用负载均衡集群 (一)Keepalived+Nginx 配置 Web服务 高可用 一、什么是 Keepalived Keepalived 是一个用于实现网络高可用性和负载均衡的开源软件。它通过虚拟路由冗余协议(VRRP)实现服务的自动故障切换,确保在主服务器宕机时,备份服务器可以自动接管,从而保证服务的持续可用性。此外,Keepalived 还支持对服务进行健康检查,以确保系统稳定运行
它主要用于以下场景
负载均衡器的高可用性 :Keepalived 最早用于维护负载均衡器的高可用性,比如 Nginx。Keepalived 可以确保负载均衡器在故障发生时,备份服务器可以自动接管
Web 服务的高可用性 :通过 Keepalived,可以实现 Nginx、Apache 等 Web 服务的高可用性,确保当主服务器失效时,备份服务器能够自动接管虚拟 IP 地址,避免服务中断
数据库高可用性 :在数据库系统(如 MySQL)的主从架构中,Keepalived 也可以帮助实现主从切换,一旦主数据库失效,备份数据库可以接管服务
它有以下的优点:
简单易用 :Keepalived 的配置和管理相对简单,只需几步配置就可以实现高可用性
快速切换 :通过 VRRP,Keepalived 能够快速检测服务器状态并执行故障切换,保证服务的高可用性
灵活性高 :Keepalived 可以结合负载均衡器、Web 服务器、数据库等多种服务使用,适应性强
轻量级 :Keepalived 不需要大量的系统资源,适合部署在资源受限的环境中
二、使用 Keeplived 配置 Web服务 高可用
IP1
主机
192.168.92.130
master
192.168.92.132
backup
1. 基础配置 1.0 Keepalived 工作原理 在讲 keepalived 工作原理之前,这里先介绍一个协议 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有一个 master(主) 角色 和 N(N≥1) 个 backup(备用) 角色。工作时,master 会通过组播的形式向各个 backup 发送 VRRP 协议的数据包,当 backup 收不到 master 发来的 VRRP 数据包时,就会认为 master 宕机了。此时就需要各个 backup 的优先级来决定谁成为新的 master。
而 keepalived 就是采用这种 VRRP 协议实现的高可用。keepalived 要有三个模块,分别是 core、check 和 VRRP。其中 core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;check 模块负责健康检查;VRRP 模块用来实现 VRRP 协议。
1.1 设置主机名 1 2 3 4 5 6 7 8 9 10 11 12 13 $ hostnamectl set-hostname master $ bash $ hostnamectl Static hostname: master Icon name: computer-vm Chassis: vm Machine ID: e72e04755f264b69a75c218f22b44031 Boot ID: 0de48a7678aa43fc9e30d6a3c72be13f Virtualization: vmware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-1160.119.1.el7.x86_64 Architecture: x86-64
1 2 3 4 5 6 7 8 9 10 11 12 13 $ hostnamectl set-hostname backup $ bash $ hostnamectl Static hostname: backup Icon name: computer-vm Chassis: vm Machine ID: 2916c787935c4ac7a0353f024b3c2394 Boot ID: 1d996f1254314e1c964ce6d81e252e60 Virtualization: vmware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-1160.el7.x86_64 Architecture: x86-64
1.2 在 master 上编译安装 nginx 在 master 服务器上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ sudo yum install -y wget $ wget https://nginx.org/download/nginx-1.27.1.tar.gz -P /usr/local/src $ cd /usr/local/src $ sudo tar -zxf nginx-1.27.1.tar.gz $ cd nginx-1.27.1 $ sudo yum install -y gcc pcre-devel zlib-devel make openssl-devel $ sudo ./configure --prefix=/usr/local/nginx $ sudo make && make install
把编译后的 nginx 添加到环境变量
1 2 3 4 5 6 $ sudo vi ~/.bashrcexport PATH=$PATH :/usr/local/nginx/sbin $ sudo source ~/.bashrc
1.3 安装 Keepalived 和 backup 上的 nginx 在两台机器上安装 Keepalived
1 $ sudo yum install -y keepalived
在 backup 服务器上,使用 yum 安装 nginx
1 $ sudo yum install -y nginx
2. 编辑配置文件 在 master 服务器中,编辑配置文件 (/etc/keepalived/keepalived.conf
) 为以下内容(可直接替换) *注意:要对应 interface
字段的网卡与实际本机网卡一致,以及 virtual_ipaddress
字段的 IP 为 interface
字段网卡的网段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 global_defs { notification_email { [email protected] // 定义接收告警的人 } notification_email_from [email protected] // 定义发邮件的地址(实际上没用) smtp_server 127.0.0.1 // 发送email时使用的smtp服务器地址,若为127.0.0.1则使用本机自带的邮件服务器发送(需提前安装对应服务) smtp_connect_timeout 30 // 连接smtp连接超时时间 router_id LVS_DEVEL // 机器标识 } vrrp_script chk_nginx { script "/etc/keepalived/check_ng.sh" interval 2 // 每间隔2s执行一次脚本 } vrrp_instance VI_1 { state MASTER // 角色为 master interface ens33 // 对 ens33 网卡监听VIP virtual_router_id 51 // 虚拟路由器ID priority 100 // 权重为 100,要保证 master 比 backup 的数字大 advert_int 1 // master 和 back 主机质检同步检查的实践间隔(单位为秒) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.92.100 // 定义 VIP } track_script { chk_nginx // 定义监控脚本,这里和上面check脚本一样 } }
在 backup 服务器中,编辑配置文件 (/etc/keepalived/keepalived.conf
) 为以下内容(可直接替换) *注意:要对应 interface
字段的网卡与实际本机网卡一致,以及 virtual_ipaddress
字段的 IP 为 interface
字段网卡的网段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 global_defs { notification_email { [email protected] // 定义接收告警的人 } notification_email_from [email protected] // 定义发邮件的地址(实际上没用) smtp_server 127.0.0.1 // 发送email时使用的smtp服务器地址,若为127.0.0.1则使用本机自带的邮件服务器发送(需提前安装对应服务) smtp_connect_timeout 30 // 连接smtp连接超时时间 router_id LVS_DEVEL // 机器标识 } vrrp_script chk_nginx { script "/etc/keepalived/check_ng.sh" interval 2 // 每间隔2s执行一次脚本 } vrrp_instance VI_1 { state BACKUP // 角色为 backup interface ens33 // 对 ens33 网卡监听VIP virtual_router_id 51 // 虚拟路由器ID priority 90 // 权重为 90,要保证 master 比 backup 的数字大 advert_int 1 // master 和 back 主机质检同步检查的实践间隔(单位为秒) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.92.100 // 定义 VIP } track_script { chk_nginx // 定义监控脚本,这里和上面check脚本一样 } }
3. 编辑监控脚本 在两台机器上都创建监控脚本文件 check_ng.sh
在 master 的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ sudo vi /etc/keepalived/check_ng.sh A=$(ps -C nginx --no-header | wc -l) d=$(date --date today +%Y%m%d_%H:%M:%S)if [ $A -eq "0" ]; then /usr/local/nginx/sbin/nginx sleep 2 if [ $(ps -C nginx --no-header | wc -l) -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi
在 backup 的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ sudo vi /etc/keepalived/check_ng.sh A=$(ps -C nginx --no-header | wc -l) d=$(date --date today +%Y%m%d_%H:%M:%S)if [ $A -eq "0" ]; then systemctl start nginx sleep 2 if [ $(ps -C nginx --no-header | wc -l) -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi
解释:
#!/bin/bash
:必须放在第一行,表示使用 /bin/bash
作为解释器来执行这个脚本
A=$(ps -C nginx --no-header | wc -l)
:
ps -C nginx --no-header
:这条命令通过 ps
检查当前系统中是否有 nginx
进程在运行,-C nginx
表示查找名为 nginx
的进程,--no-header
用来不显示表头
wc -l
:用 wc
命令对结果进行计数,-l
参数表示计数输出的行数
如果 nginx 正在运行,那么结果 A
会是一个大于 0 的数字;如果没有运行,A
就会是 0
d=$(date --date today +%Y%m%d_%H:%M:%S)
:时间变量,用于记录日志
if [ $A -eq 0 ]; then
:这个是一个条件判断语句【如果变量 A
的值 等于(eq,equal) 0(也就是 nginx 没有在运行),那么执行下面的语句
/usr/local/nginx/sbin/nginx
/ systemctl start nginx
:启动 nginx 的命令
sleep 2
:睡眠 2 秒,给 nginx 启动留下充足的时间
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
:
这个是第二个判断语句,内容如上,目的是检查 nginx 是否成功启动 如果 nginx 还是没有启动 (即进程数量还是0),则执行后续操作
systemctl stop keepalived
:关闭 keepalived
服务
如果 nginx 未能成功启动,脚本将停止 Keepalived 服务。
然后在两台机器上给这个文件权限
1 $ sudo chmod 755 /etc/keepalived/check_ng.sh
4. 修改 index.html
为了将 master 和 backup 服务器做出区分,方便我们后续在浏览器中检查,我们这里将修改 master 和 backup 的 index.html
(即 nginx 默认网页)
在 master 上,编辑 /usr/local/nginx/html/index.html
文件,并修改成以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE html > <html > <head > <title > Welcome to nginx!</title > <style > html { color-scheme : light dark; }body { width : 35em ; margin : 0 auto;font-family : Tahoma, Verdana, Arial, sans-serif; }</style > </head > <body > <h1 > Welcome to nginx!</h1 > <h2 > This is master node<p > IP is 192.168.92.130</p > </h2 > <p > If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p > <p > For online documentation and support please refer to<a href ="http://nginx.org/" > nginx.org</a > .<br /> Commercial support is available at<a href ="http://nginx.com/" > nginx.com</a > .</p > <p > <em > Thank you for using nginx.</em > </p > </body > </html >
在 backup 上,编辑 /usr/share/nginx/html/index.html
并修改成以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE html > <html > <head > <title > Welcome to nginx!</title > <style > html { color-scheme : light dark; }body { width : 35em ; margin : 0 auto;font-family : Tahoma, Verdana, Arial, sans-serif; }</style > </head > <body > <h1 > Welcome to nginx!</h1 > <h2 > This is backup node<p > IP is 192.168.92.132</p > </h2 > <p > If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p > <p > For online documentation and support please refer to<a href ="http://nginx.org/" > nginx.org</a > .<br /> Commercial support is available at<a href ="http://nginx.com/" > nginx.com</a > .</p > <p > <em > Thank you for using nginx.</em > </p > </body > </html >
分别用浏览器访问 http://192.168.92.130
和 http://192.168.92.132
5. 启动服务 在 master 服务器上
1 2 3 4 5 6 7 8 9 10 $ sudo nginx $ sudo systemctl start keepalived $ ip a | grep 192.168.92.100 inet 192.168.92.100/32 scope global ens33
在 backup 服务器上
1 2 3 4 5 $ sudo systemctl start nginx $ sudo systemctl start keepalived
三、测试高可用 1. 先确定好两台机器上 nginx 的差异 master 上
1 2 3 4 5 6 7 8 9 10 $ curl -I http://localhost HTTP/1.1 200 OK Server: nginx/1.27.1 Date: Wed, 18 Sep 2024 08:29:20 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Wed, 18 Sep 2024 07:41:51 GMT Connection: keep-alive ETag: "66ea843f-267" Accept-Ranges: bytes
backup 上
1 2 3 4 5 6 7 8 9 10 $ curl -I http://localhost HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Wed, 18 Sep 2024 08:29:46 GMT Content-Type: text/html Content-Length: 4833 Last-Modified: Fri, 16 May 2014 15:12:48 GMT Connection: keep-alive ETag: "53762af0-12e1" Accept-Ranges: bytes
可以看出 master 服务器上的 nginx 版本号为 1.27.1,而 backup 服务器上的 nginx 版本号为 1.20.1
2. 关闭 master 上的 nginx 服务
可能的结果:
监控脚本会检测到 Nginx 服务已停止,首先尝试重启 Nginx,重启成功,继续运行
如果 master 的 nginx 重启失败,backup 检测到 master 节点的 VRRP 心跳包停止,会接管VIP(虚拟IP),并成为新的 master
*这里模拟启动失败(修改 nginx 配置文件文件名)
1 2 3 4 $ sudo mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf. $ sudo nginx -t nginx: [emerg] open() "/usr/local/nginx/conf/nginx.conf" failed (2: No such file or directory) nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
在 backup 节点上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link /loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link /ether 00:0c:29:b1:f9:70 brd ff:ff:ff:ff:ff:ff inet 192.168.92.132/24 brd 192.168.92.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.92.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::c5a3:58ae:caf6:20b1/64 scope link noprefixroute valid_lft forever preferred_lft forever $ ip a | grep 192.168.92.100 inet 192.168.92.100/32 scope global ens33
3. 在 master 上增加 iptables
规则 在 master 上禁止 VRRP 数据包的发送
1 $ iptables -I OUTPUT -p vrrp -j DROP
结果:由于 iptables
阻止了 VRRP 数据包的发送,backup 节点会认为 master 节点不可用,即使 nginx 仍在运行,然后 backup 节点会接管 VIP,成为新的 master
4. 关闭 master 上的 keepalived 服务 1 $ sudo systemctl stop keepalived
结果:Keepalived
服务停止,master 节点将不再发送 VRRP 心跳包,backup 节点检测到没有 VRRP 心跳包后,接管 VIP,成为新的 master
5. 重新启动 master 上的 keepalived 服务 1 $ sudo systemctl start keepalived
结果:Keepalived
服务恢复后,master 节点重新开始发送 VRRP 心跳包。由于 master 的优先级更高,虚拟 IP 会切回到 master 节点
在 master 上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link /loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link /ether 00:0c:29:7a:2e:6f brd ff:ff:ff:ff:ff:ff inet 192.168.92.130/24 brd 192.168.92.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.92.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::8f04:3f1b:8eb1:5544/64 scope link noprefixroute valid_lft forever preferred_lft forever
四、日志/错误日志 1. nginx
检查:使用 nginx -t
检查配置的 nginx 配置文件是否有语法错误,如果没有则会提示 OK 和 successful
日志:
master 服务器:在 /usr/local/nginx/conf/nginx.conf
配置文件里
1 2 3 4 $ sudo vi /usr/local/nginx/conf/nginx.conf error_log logs/error.log; access_log logs/access.log;
然后保存并退出之后
1 2 3 4 5 6 7 8 $ sudo nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful $ sudo nginx -s stop $ sudo nginx
此时配置的日志位置为:
错误日志:/usr/local/nginx/logs/error.log
访问日志:/usr/local/nginx/logs/access.log
backup 服务器:
错误日志:/var/log/nginx/error.log
访问日志:/var/log/nginx/access.log
2. keepalived 由于我们是通过 yum 安装的 keepalived
服务,所以我们可以查看系统日志文件 /var/log/messages
来查看日志,或者我们也可以通过查看服务日志 journalctl
来查看 keepalived
日志
查看系统日志
1 $ sudo tail -f /var/log/messages | grep keepalived
查看服务日志
1 $ journalctl -u keepalived
这里将会显示 Keepalived 服务的相关日志,包括启动、关闭、状态变更等信息
如果你希望 keepalived
输出更详细的日志信息,可以在 keepalived.conf
配置文件添加上 global_defs
部分添加或调整日志级别
1 2 3 4 5 6 7 8 9 10 11 12 13 global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER vrrp_mcast_group4 224.0.0.18 vrrp_mcast_group6 ff02::12 log_level 7 }
在完成配置后,重启 keepalived
以应用新的日志设置
1 $ sudo systemctl restart keepalived
当然,不能少了我们刚才配置的 /var/log/check_ng.log
看看是在哪些时间出现的问题
(二)Keepalived + LVS(DR) 一、什么是 LVS LVS(Linux Virtual Server)是由国内大牛章文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。不过LVS最新的版本是基于Linux2.6内核的,这意味着它已经有多年没有更新了。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被诸多企业应用在核心的架构当中。如下图所示,在该架构中有一个核心的角色叫作调度器(Load Balancer).用来分发用户的请求,还有诸多的真实服务器(Real Server),也就是处理用户请求的服务器。
LVS根据实现方式的不同,主要分为三种类型:NAT模式、IPTunnel(IP隧道)模式、DR模式。
(1) NAT模式 这种模式的实现原理很简单,调度器会把用户的请求通过预设的 iptables 规则转发给后端的真实服务器。其中调度器有两个IP,一个是公网IP,一个是内网IP,而真实服务器只有内网IP。用户访问的时候请求的是调度器的公网IP,它会把用户的请求转发到真实服务器的内网IP上。这种模式的好处是节省公网IP,但是调度器会成为一个瓶颈。NAT模式架构如下图所示。
(2) IP Tunnel模式 IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。像大家熟知的 VPN 技术其实就是 IP隧道。在 LVS 的 IP Tunnel 架构中,后端服务器有一组而非一个,所以不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。IP Tunnel 模式 架构如下图所示。
调度器 (LoadBalancer) 将请求报文封装在另一个 IP 报文中,再将封装后的IP报文转发给真实服务器。真实服务器收到报文后,先将报文解封获得原来目标地址为 VIP 的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。这种模式下,需要给调度器和所有的真实服务器全部分配公网 IP,所以比较浪费公网 IP。
(3) DR模式 和 IPTunnel 模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果直接返回给用户。不过,在这种模式下不会封装 IP,而是将数据帧的 MAC 地址改为真实服务器的 MA C地址。DR 模式架构如下图所示。
LVS的官方网站给出了三种模式的比较,如下表所示:
_
VS/NAT
VS/TUN
VS/DR
server
any
Tunneling
Non-arp device
server network
private
LAN/WAN
LAN
server number
low(10~20)
High(100)
High(100)
server gateway
load balancer
own router
own router
以上三种方法所能支持最大服务器数的估值是假设调度器使用100MB网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是针对一般Web服务的。使用更高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应地改变。所以,以上数据估计主要是为三种方法的伸缩性进行量化比较。
通过比较可以看出,NAT模式适合小型的集群,机器数量不多,它的优势是节省公网IP。 TUN和DR相差不大,都能支撑较大规模的集群,但缺点是浪费公网IP。
二、DR 模式搭建
主机
IP
dir
192.168.75.130
rs1
192.168.75.132
rs2
192.168.75.133
Virtual IP
192.168.75.200
1. 在 调度器(dir) 上配置LVS 安装 ipvsadm
1 $ sudo yum install -y ipvsadm
编辑调度器脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $ sudo vi /usr/local/sbin/lvs_dr.shecho 1 > /proc/sys/net/ipv4/ip_forward IPVSADM='/usr/sbin/ipvsadm' VIP=192.168.75.100 RS1=192.168.75.132 RS2=192.168.75.133 ip addr add $VIP /32 dev ens33 ip link set dev ens33 up$IPVSADM -C$IPVSADM -A -t $VIP :80 -s wrr$IPVSADM -a -t $VIP :80 -r $RS1 :80 -g -w 1$IPVSADM -a -t $VIP :80 -r $RS2 :80 -g -w 1
授予权限并执行脚本
1 2 $ sudo chmod +x /usr/local/sbin/lvs_dr.sh $ sudo /usr/local/sbin/lvs_dr.sh
2. 在 真实服务器(Real Server) 上配置 编辑真实服务器脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ sudo vi /usr/local/sbin/lvs_rs.sh VIP=192.168.75.100 ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up route add -host $VIP dev lo:0echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "1" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/all/arp_announce
授予权限并执行脚本
1 2 $ sudo chmod +x /usr/local/sbin/lvs_rs.sh $ sudo /usr/local/sbin/lvs_rs.sh
3. 测试
在浏览器中访问 Virtual IP:http://192.168.75.100
可以使用 curl
命令测试
1 $ curl http://192.168.75.100
三、Keepalived+LVS DR 完整架构需要两台服务器(角色为 dir),分别安装 keepalived
,目的是实现高可用,但是 keepalived
本身也有负载均衡的功能,所以本次实验可以只安装一台 keepalived
keepalived
内置了 ipvsadm
的功能,所以不需要再安装 ipvsadm
包,也不用编写和执行那个 lvs_dir
的脚本
1. 安装和配置 keepalived 1 $ sudo yum install -y keepalived
按照下面的样式编辑 keepalived 的配置文件(可直接替换)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 $ sudo vi /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.75.100 } } virtual_server 192.168.75.100 80 { delay_loop 10 lb_algo wlc lb_kind DR // DR 模式 persistence_timeout 50 protocol TCP real_server 192.168.75.132 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.75.133 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
然后启动 keepalived
1 2 $ sudo systemctl start keepalived $ sudo systemctl enable keepalived
2. 在 真实服务器(Real Server) 上配置 编辑真实服务器脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ sudo vi /usr/local/sbin/lvs_rs.sh VIP=192.168.75.100 ip addr add $VIP /32 dev lo ip link set dev lo upecho "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "1" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/all/arp_announce
设置真实服务器的网页内容
在 rs1
上,编辑 /usr/share/nginx/html/index.html
并修改成以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE html > <html > <head > <title > Welcome to nginx!</title > <style > html { color-scheme : light dark; }body { width : 35em ; margin : 0 auto;font-family : Tahoma, Verdana, Arial, sans-serif; }</style > </head > <body > <h1 > Welcome to nginx!</h1 > <h2 > This is Real Server 01<p > IP is 192.168.92.132</p > </h2 > <p > If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p > <p > For online documentation and support please refer to<a href ="http://nginx.org/" > nginx.org</a > .<br /> Commercial support is available at<a href ="http://nginx.com/" > nginx.com</a > .</p > <p > <em > Thank you for using nginx.</em > </p > </body > </html >
在 rs2
上,编辑 /usr/share/nginx/html/index.html
并修改成以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE html > <html > <head > <title > Welcome to nginx!</title > <style > html { color-scheme : light dark; }body { width : 35em ; margin : 0 auto;font-family : Tahoma, Verdana, Arial, sans-serif; }</style > </head > <body > <h1 > Welcome to nginx!</h1 > <h2 > This is Real Server 02<p > IP is 192.168.92.133</p > </h2 > <p > If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p > <p > For online documentation and support please refer to<a href ="http://nginx.org/" > nginx.org</a > .<br /> Commercial support is available at<a href ="http://nginx.com/" > nginx.com</a > .</p > <p > <em > Thank you for using nginx.</em > </p > </body > </html >
在两个服务器上开启 nginx
1 $ sudo systemctl start nginx
3. 测试 3.0 测试前准备 在 dir 服务器上,清空之前的 ipvsadm 规则
清空之前的 Virtual IP
1 $ sudo systemctl restart network
两台 Real Server 上,依然要执行 /usr/local/sbin/lvs_rs.sh
脚本
1 2 $ sudo chmod +x /usr/local/sbin/lvs_rs.sh $ sudo /usr/local/sbin/lvs_rs.sh
3.1 测试 检验是否成功的方法也很简单,需要在浏览器直接访问 Virtual IP 192.168.75.110
,然后故意把其中一台 Real Server 的 nginx 服务关掉,比如说关闭 132 的;然后再刷新浏览器看结果,刷新的时候需要使用组合键(Ctrl+F5)强制刷新浏览器,这样就不会有缓存数据了。同时,也可以在调度器(130)上执行命令 ipvsadm -ln
查看连接数
1 2 3 4 5 6 $ ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.75.100:80 wrr -> 192.168.75.133:80 Route 1 0 0
对应 rs 的只有一台 133,然后再把 132 的 nginx 服务启动,再来看
1 2 3 4 5 6 7 $ ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.75.100:80 wrr -> 192.168.75.132:80 Route 1 0 0 -> 192.168.75.133:80 Route 1 0 0