一、原理介绍

nginx 高可用HA keepalived学习_nginx image.png

nginx 高可用HA keepalived学习_优先级_02 image.png

上图就是keepalived的双机主备原理,用户通过访问虚拟ip,然后虚拟ip是和nignx相关联的,如果主节点挂掉,虚拟ip在接收心跳的过程中发现主节点挂掉了,这个时候,虚拟ip就会访问备份的nginx,这样就达到了keepalived双机主备的原理了

需要注意的是,两台nginx机子配置一定是需要一样的,因为如果访问量很大,master挂掉了,然后虚拟ip访问到备份的nginx,这个时候备份的nginx会瞬间挂掉。

二、keepalived安装

nginx 高可用HA keepalived学习_优先级_03 image.png

链接:https://www.keepalived.org/download.html

下载好压缩包然后上传到服务器上,之后解压进入keepalived目录:


nginx 高可用HA keepalived学习_权重_04 image.png


这个就和nginx一样了,也有configure文件,这个时候我们制定一些变量,然后进行配置安装keepalived

./configure --prefix=/usr/local/keepalived --sysconf=/etc

--prefix= 安装的路径,这里我们安装到usr/local下

--sysconf 代表的是核心配置文件存放的路径,这里我们需要配置到etc 不然会报错

执行完上述命令之后然后执行命令进行安装文件

make && make install 来安装


nginx 高可用HA keepalived学习_nginx_05 image.png

安装之后我们来检测下安装结果:

[root@172host keepalived-2.1.5]# whereis keepalived
keepalived: /etc/keepalived /usr/local/keepalived

keepalived的配置文件则是安装到了/etc/keepalived下面,打开配置信息:


nginx 高可用HA keepalived学习_权重_06 image.png

三、keepalived注册为系统服务

首先我们需要找到keepalived安装包的下面目录:

keepalived-2.1.5/keepalived/etc

拷贝一些文件

cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/

#刷新服务并启动keepalived
systemctl daemon-reload
systemctl start keepalived.service

keepalived 我们需要同时配置到主备节点上,主节点配置如下:

主节点的ip是172

global_defs {
# 路由id,当前安装keepalived节点主机的标识符,全局唯一
router_id keep_172
}

# 服务器节点
vrrp_instance VI_1 {
# 表示的状态,当前172位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
}
# 虚拟ip
virtual_ipaddress {
192.168.121.171
}
}

备节点的ip是173

bal_defs {
# 路由id,当前安装keepalived节点主机的标识符,全局唯一
router_id keep_173
}

# 服务器节点
vrrp_instance VI_1 {
# 表示的状态,当前173位nginx的备节点,BACKUP
state BACKUP
# 当前实例绑定的网卡
interface ens33
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在master挂掉之后就可以成为master
priority 80
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip
virtual_ipaddress {
192.168.121.171
}
}

这样,如果主节点的keepalived挂掉,使用命令ip addr 查看ip就会发现,主节点已经没有了虚拟ip171了,而在备份节点上查看,发现虚拟ip已经绑定到了子节点上。

而访问虚拟ip 发现页面指向的是备份节点的nginx所指向的内容了。

三、keepalived配置nginx自动重启


我们发现如果keepalived挂了,是可以做到主备切换的,但是如果nginx挂掉呢,发现页面是挂掉的状态,这个不是我们想要的,因此我们需要做到nginx24小时都在服务,如果挂掉,需要自动重启


我们把脚本check_nginx_alive_or_not.sh写到etc/keepalived 目录下,与keepalived的配置文件放在一起。

#!/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

然后给这个脚本赋权 chmod +x ***.sh

然后运行,发现没有报错,理论是正常的

然后我们修改keepalived的配置文件,让它可以定时的调取脚本,配置内容如下:

global_defs {
# 路由id,当前安装keepalived节点主机的标识符,全局唯一
router_id keep_172
}

vrrp_script check_nginx_alive{
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔两秒运行上一次脚本
weight 10 # 如果脚本运行成功,则升级权重+10 如果配置-10则是减10
}

# 服务器节点
vrrp_instance VI_1 {
# 表示的状态,当前172位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
virtual_ipaddress {
192.168.121.171
}
}

四、keepalived双主热备

nginx 高可用HA keepalived学习_nginx_07 image.png


图中的原理很简单就是在备份节点上类似于主节点一样配置一个虚拟ip来做到互补的作用,因为如果仅配置主备节点,那么只有主节点挂掉,备份节点才可以使用,平时是无法使用的,这样就造成了资源的浪费,成本的上升,所以做成双主热备就可以做到资源的最大利用。

五、DNS轮询

nginx 高可用HA keepalived学习_权重_08 image.png

nginx 高可用HA keepalived学习_权重_09 image.png

nginx 高可用HA keepalived学习_优先级_10 image.png

图上就是配置的DNS轮询,因为我们在第四步中已经做到两个keepalived组成的双主热备,那么就有两个虚拟ip了,两个虚拟ip对应两台服务器,我们都是需要去访问做到资源的最大利用,那么这个时候就需要DNS轮询了,我们的请求首先到DNS解析,解析分配到ip然后访问,这块的配置就是分配 两个ip的权重和时间。

六、双主热备的实现

直接贴配置信息:

! Configuration File for keepalived

global_defs {
# 路由id,当前安装keepalived节点主机的标识符,全局唯一
router_id keep_172
}

vrrp_script check_nginx_alive{
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔两秒运行上一次脚本
weight 10 # 如果脚本运行成功,则升级权重+10 如果配置-10则是减10
}

# 服务器节点
vrrp_instance VI_1 {
# 表示的状态,当前172位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
virtual_ipaddress {
192.168.121.171
}
}

# 服务器节点
vrrp_instance VI_2 {
# 表示的状态,当前172位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
}
# 虚拟ip
virtual_ipaddress {
192.168.121.170
}
}
bal_defs {
# 路由id,当前安装keepalived节点主机的标识符,全局唯一
router_id keep_173
}

# 服务器节点
vrrp_instance VI_1 {
# 表示的状态,当前173位nginx的备节点,BACKUP
state BACKUP
# 当前实例绑定的网卡
interface ens33
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在master挂掉之后就可以成为master
priority 80
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip
virtual_ipaddress {
192.168.121.171
}
}

# 服务器节点
vrrp_instance VI_2 {
# 表示的状态,当前173位nginx的备节点,BACKUP
state MASTER
# 当前实例绑定的网卡
interface ens33
# 保证主备节点一致
virtual_router_id 52
# 优先级/权重,谁的优先级高,在master挂掉之后就可以成为master
priority 100
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip
virtual_ipaddress {
192.168.121.170
}
}

配置完成之后,我们需要重启keepalived,然后使配置生效。

可以看到其实就是反着再配置了一边而已,测试的话我们可以类似于测试主备的模式一样,访问虚拟ip,然后关掉主节点的keepalived,然后反着再试一下