跳到主要内容基于 LVS+Keepalived+NFS 的高可用 Web 集群构建与验证 | 极客日志Shell / Bash
基于 LVS+Keepalived+NFS 的高可用 Web 集群构建与验证
基于 LVS、Keepalived 和 NFS 构建高可用 Web 集群的完整流程。首先规划了包括客户端、LVS 主备节点、Web 后端及 NFS 服务器的网络环境。接着依次完成了 NFS 共享存储的搭建、Web 服务器(Nginx)的配置与挂载、以及 LVS 负载均衡器(DR 模式)和 Keepalived 高可用组件的安装与配置。通过调整内核参数确保 DR 模式正常工作,最后进行了故障切换测试,验证了当单台后端或主节点失效时服务的可用性。
虚拟内存2K 浏览 1. 主机规划
| 主机 | 系统 | 软件 | IP |
|---|
| client | redhat9.7 | 无 | 192.168.72.115/24 |
| lvs-master | redhat9.7 | ipvsadm keepalived | VIP:192.168.72.100/32 DIP:192.168.72.116/24 |
| lvs-backup | redhat9.7 | ipvsadm keepalived | VIP:192.168.72.100/32 DIP:192.168.72.117/24 |
| rs1 | redhat9.7 | nginx, nfs-utils | 192.168.72.118/24 |
| rs2 | redhat9.7 | nginx, nfs-utils | 192.168.72.119/24 |
| nfs | redhat9.7 | nfs-utils | 192.168.72.120/24 |
使用脚本修改 IP 和主机名。
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
check_root() {
if [[ $EUID -ne 0 ]];
log_error
1
}
() {
1
}
() {
interface=$(ip route | grep default | -1 | awk 2>/dev/null)
[[ -z ]];
interface=$(ip show | grep -v lo | grep | -1 | awk -F )
[[ -z ]];
log_error
-p interface
}
() {
hostname=
log_info
/usr/bin/hostnamectl set-hostname
log_info
}
() {
interface=$(get_interface)
ip=
gateway=
dns=
log_info
nmcli c modify ipv4.method manual ipv4.addresses /24 ipv4.gateway ipv4.dns connection.autoconnect
nmcli c up
}
() {
[[ -lt 2 ]];
usage
check_root
set_hostname
set_static_ip
}
main
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online
then
"此脚本必须以 root 权限运行"
exit
fi
usage
echo
"用法:$0 <hostname> <ip_address> [gateway] [dns_servers]"
echo
""
echo
"参数说明:"
echo
" hostname 要设置的主机名"
echo
" ip_address 要设置的静态 IP 地址 (如:192.168.72.100)"
echo
" gateway 网关地址 (如:192.168.72.2)"
echo
" dns_servers DNS 服务器,逗号分隔 (可选,默认:8.8.8.8,223.5.5.5)"
echo
""
echo
"示例:"
echo
" $0 myserver 192.168.72.100 192.168.72.2 8.8.8.8,223.5.5.5"
echo
" $0 webserver 10.0.0.50"
exit
get_interface
local
head
'{print $5}'
if
"$interface"
then
link
'state UP'
head
': '
'{print $2}'
fi
if
"$interface"
then
"无法自动检测网络接口"
read
"请输入网络接口名称 (如:eth0, ens160): "
fi
echo
"$interface"
set_hostname
local
$1
"正在设置主机名为:$hostname"
$hostname
"主机名设置完成"
set_static_ip
local
local
$1
local
${2:-"192.168.72.2"}
local
${3:-"223.5.5.5,8.8.8.8"}
"正在为接口 $interface 配置静态 IP: $ip"
$interface
$ip
$gateway
$dns
yes
$interface
main
if
$#
then
fi
"$1"
"$2"
"$3"
"$4"
"$@"
2. 搭建 NFS
3. 搭建 Web1
4. 搭建 Web2
5. 搭建 LVS Master
[root@lvs-master ~]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@lvs-master ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_master
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.72.100
}
#track_script {
# chk_nginx
#}
}
virtual_server 192.168.72.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.72.118 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.72.119 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
[root@lvs-master ~]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
count=`ps -C nginx --no-header | wc -l`
if [ $count -eq 0 ]; then
/usr/bin/systemctl start nginx
sleep 1
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
/usr/bin/systemctl stop keepalived
fi
fi
systemctl start keepalived.service
6. 搭建 LVS Backup
# 1. 从 lvs-master 服务器上复制配置文件
global_defs {
router_id LVS_backup
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
timeout 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.72.100
}
#track_script {
# chk_nginx
#}
}
virtual_server 192.168.72.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.72.118 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.72.119 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
此处也没有 VIP,因为 VIP 在 master 主机上。
7. 配置内核参数
由于我们采用的 DR 模式,因此我们需要为两台 RS 服务器配置内核参数。
8. 运行测试
- 在 lvs-master 和 lvs-backup 都正常的情况下
- 然后再查看 lvs-master 上的 LVS 规则
-
再次把 rs1 上的 nginx 服务启动
-
然后再查看 lvs-master 上的 LVS 规则