keepalived+nginx实现搭建双机主备+双主热备
准备工作
两台虚拟机 一台是192.168.31.210、一台是192.168.31.211、
安装nginx 修改index 好分辨
一、安装Keepalived
两台都需要安装Keepalived 唯一不同的就是 keepalived配置文件
下载 解压
tar -zxvf keepalived-2.0.18.tar.gz
进入 keepalived-2.0.18
执行
./configure --prefix=/usr/local/keepalived --sysconf=/etc
安装和编译
make && make install
如果报 这个错 install libnl/libnl-3
需要提前安装在执行
yum -y install libnl-devel
这个用systemctl启动 如果你想直接进入 keepalived 直接启动也可以
./keepalived
当前目录 进入
cd keepalived-2.0.18/keepalived/etc
把keepalived的配置放到etc中
cp init.d/keepalived /etc/init.d/ &&
cp sysconfig/keepalived /etc/sysconfig/
重新加载配置文件
systemctl daemon-reload
启动keeplived
systemctl start keepalived.service
另一台服务器做相同操作
二、双机主备
原理通过虚拟ip访问 一旦主机挂了,就使用备机
坏处是 备机 不做其他事情,非常浪费资源
配置keepalived核心配置文件
192.168.31.210服务器
check_nginx_alive_or_not.sh 是自动启动nginx shell脚本
keepalived.conf是keepalived核心配置文件
1、vim check_nginx_alive_or_not.sh
这里的/usr/local/nginx/sbin/nginx 根据自己nginx路径修改
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会在此检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
2、然后chmod +x check_nginx_alive_or_not.sh 添加权限
3、vim keepalived.conf
这里的网卡配置interface ens33 用ip addr 查看
! Configuration File for keepalived
global_defs {
#路由id:当前安装keeplived节点主机的标识符,全局唯一
router_id keep_nginx1
}
#执行nginx启动判断脚本
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 #每隔两秒运行上一行脚本
weight 10 #如果脚本运行成功,则升级权重+10
#weight -10 #如果脚本运行失败,则降低权重-10
}
#计算机节点
vrrp_instance VI_1 {
#标识的状态,当前nginx的主节点,MASTER/BACKUP
state MASTER
#当前实例绑定的网卡
interface ens33
#保证主备节点一致
virtual_router_id 51
#优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 100
#主备之间同步检查的时间间隔,默认1s
advert_int 1
#认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
#调用脚本
track_script {
check_nginx_alive #追踪 nginx脚本
}
#这里的是虚拟ip 字段要和自己的服务器在同一字段 比如我的服务器ip是 192.168.31.210
#所有前面三个要一样 192.168.31.
virtual_ipaddress {
192.168.31.161
}
}
主机就配置好了
备机的配置和上面一样 唯一不同的是权重和状态
另一台192.168.31.211服务器配置
! Configuration File for keepalived
global_defs {
#路由id:当前安装keeplived节点主机的标识符,全局唯一
router_id keep_nginx2
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 #每隔两秒运行上一行脚本
weight 10 #如果脚本运行成功,则升级权重+10
#weight -10 #如果脚本运行失败,则降低权重-10
}
#计算机节点
vrrp_instance VI_1 {
#标识的状态,当前nginx的主节点,MASTER/BACKUP
state BACKUP
#当前实例绑定的网卡
interface ens33
#包装主备节点一致
virtual_router_id 51
#优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 80
#主备之间同步检查的时间间隔,默认1s
advert_int 1
#认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx_alive #追踪 nginx脚本
}
virtual_ipaddress {
192.168.31.161
}
}
三、 双主热备
他弥补了双主机的缺点,可以两台都进行运行
用户访问之后,DNS访问轮训,随机访问那个虚拟ip
这里用了两个虚拟ip 一个虚拟ip绑定两个nginx 当一个keepalived挂了之后另一个绑定两个
就可以实现两个服务器都没有浪费资源
192.168.31.210 服务器配置
多了一个VI_2
! Configuration File for keepalived
global_defs {
#路由id:当前安装keeplived节点主机的标识符,全局唯一
router_id keep_nginx1
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 #每隔两秒运行上一行脚本
weight 10 #如果脚本运行成功,则升级权重+10
#weight -10 #如果脚本运行失败,则降低权重-10
}
#计算机节点
vrrp_instance VI_1 {
#标识的状态,当前nginx的主节点,MASTER/BACKUP
state MASTER
#当前实例绑定的网卡
interface ens33
#包装主备节点一致
virtual_router_id 51
#优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 100
#主备之间同步检查的时间间隔,默认1s
advert_int 1
#认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
#调用脚本
track_script {
check_nginx_alive #追踪 nginx脚本
}
virtual_ipaddress {
192.168.31.161
}
}
#计算机节点
vrrp_instance VI_2 {
#标识的状态,当前nginx的主节点,MASTER/BACKUP
state BACKUP
#当前实例绑定的网卡
interface ens33
#包装主备节点一致
virtual_router_id 52
#优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 80
#主备之间同步检查的时间间隔,默认1s
advert_int 1
#认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
#调用脚本
track_script {
check_nginx_alive #追踪 nginx脚本
}
virtual_ipaddress {
192.168.31.162
}
}
重启
systemctl restart keepalived.service
192.168. 31.211服务器配置
! Configuration File for keepalived
global_defs {
#路由id:当前安装keeplived节点主机的标识符,全局唯一
router_id keep_nginx2
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 #每隔两秒运行上一行脚本
weight 10 #如果脚本运行成功,则升级权重+10
#weight -10 #如果脚本运行失败,则降低权重-10
}
#计算机节点
vrrp_instance VI_1 {
#标识的状态,当前nginx的主节点,MASTER/BACKUP
state BACKUP
#当前实例绑定的网卡
interface ens33
#包装主备节点一致
virtual_router_id 51
#优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 80
#主备之间同步检查的时间间隔,默认1s
advert_int 1
#认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx_alive #追踪 nginx脚本
}
virtual_ipaddress {
192.168.31.161
}
}
vrrp_instance VI_2 {
#标识的状态,当前nginx的主节点,MASTER/BACKUP
state MASTER
interface ens33
#包装主备节点一致
virtual_router_id 52
#优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 100
#主备之间同步检查的时间间隔,默认1s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx_alive #追踪 nginx脚本
}
virtual_ipaddress {
192.168.31.162
}
}
重启
systemctl restart keepalived.service
测试模拟
访问两个虚拟ip 正在显示
然后我们关闭一台 我关闭了211这台服务器
两台服务器都正常显示
但是区别 192.168.31.162 他访问的是另一台nginx的内容 所以 我们这里模拟成功 没有任何问题
systemctl stop keepalived.service