我们需要 2 台服务器来完成基于 keepalived
nginx
高可用的搭建
配置说明
虚拟IP | master | slave |
---|---|---|
192.168.1.9 | 192.168.11 | 192.168.13 |
同网段任意未被占用IP即可 | 主机 | 备机 |
实现当主机(nginx/keepalived/服务器)挂掉后 服务自动切到 备机
当主机恢复后 会自动返回流量到主机 从而保证 nginx 服务的高可用
安装nginx keepalived
# 在 `master` 和 `slave` 机中运行
yum install nginx keepalived -y
配置 keepalived
配置文件 keepalived.conf
# 在 master 机中运行
# 备份默认配置文件
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.default
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
# fix WARNING - default user 'keepalived_script' for script execution does not exist - please create
script_user root
enable_script_security
}
# 检测脚本
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2 # 权重
fall 3 # 检测连续 3 次失败才算确定是真失败 会用weight减少优先级(1-255之间)
rise 2 # 检测 2 次成功就算成功。但不修改优先级
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定keepalived的初始角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
mcast_src_ip 192.168.1.11 # 发送多播数据包时的源IP地址, 如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id 11 # 虚拟路由编号,主从要一直
priority 100 # 优先级最高的 即为 master 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
# 授权访问
authentication {
auth_type PASS # 设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 11111
}
# 调用检测脚本
track_script {
check_nginx
}
# 定义虚拟ip(VIP),可多设,每行一个
virtual_ipaddress {
192.168.1.9
}
}
EOF
# 在 slave 机中运行
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.default
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
# fix WARNING - default user 'keepalived_script' for script execution does not exist - please create
script_user root
enable_script_security
}
# 检测脚本
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2 # 权重
fall 3 # 检测连续 3 次失败才算确定是真失败 会用weight减少优先级(1-255之间)
rise 2 # 检测 2 次成功就算成功。但不修改优先级
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的初始角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
mcast_src_ip 192.168.1.13 # 发送多播数据包时的源IP地址, 如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id 11 # 虚拟路由编号,主从要一直
priority 99 # 优先级最高的 即为 master 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
# 授权访问
authentication {
auth_type PASS # 设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 11111
}
# 调用检测脚本
track_script {
check_nginx
}
# 定义虚拟ip(VIP),可多设,每行一个
virtual_ipaddress {
192.168.1.9
}
}
EOF
创建 check_nginx.sh
检测脚本
# 在 `master` 和 `slave` 机中运行
cat > /etc/keepalived/check_nginx.sh <<EOF
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl start nginx
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
EOF
为了区别不同主机 我们使用 2 个不同的 html文件
来演示
# 在 master 机中运行
cat > /usr/share/nginx/htmml/index.html <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>master</title>
</head>
<body>
hallo this is server master 192.168.1.11
</body>
</html>
EOF
# 在 slave 机中运行
cat > /usr/share/nginx/htmml/index.html <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>slave </title>
</head>
<body>
hallo this is server slave 192.168.1.13
</body>
</html>
EOF
在 master
和 slave
机中运行
systemctl start nginx --now && systemctl start keepalived
访问 192.168.1.9
显示 当前访问的是 192.168.1.11
的 master
停止 master(192.168.1.11)
中的 nginx
再次访问 192.168.1.9
显示 当前访问的是 192.168.1.13
的 slave
恢复启动 master(192.168.1.11)
中的 nginx
访问 192.168.1.9
显示 当前访问的是 192.168.1.11
的 master