本文最后更新于 2023-09-19,文章内容可能已经过时。

1. 高可用配置

nginx的高可用需要利用Keepalived软件,我们可以设想这么一个问题,虽然我们利用nginx实现了如果后端出现问题,还能通过反向代理机制,完成访问迁移到内部别的服务器,但是如果nginx挂了,肯定不能再同时加nginx,然后多个nginx服务器上再套nginx【无限套娃】。

Keepalived就是提供了两个nginx能互相保持通信,一个不行了另外一个能顶上,但是这里有个问题,难不成他们是替换了Ip?其实不是,如果这么频繁换ip,会出现很多问题:如假死,两个服务器出现ip冲突。他们类似之前我们nginx配置的,虚拟IP,这个虚拟IP是两个人一起使用的。

1.1. 安装Keepalived

1.1.1. 编译安装

下载地址 https://www.keepalived.org/download.html#

使用 ./configure 编译安装

如遇报错提示

configure: error:

!!! OpenSSL is not properly installed on your system. !!!

!!! Can not include OpenSSL headers files. !!!

安装依赖

yum install openssl-devel

1.1.2. yum安装

yum install keepalived

1.1.3. 配置

使用yum安装后配置文件在 /etc/keepalived/keepalived.conf

1.1.4. 最小配置

它的配置文件比Nginx还要多,这里用不到那么多配置,直接上最小配置。

! Configuration File for keepalived

global_defs {
	# 虚拟路由的名称
	router_id lb100
}
# vrrp是keepalived在内网通信的协议 而instance代表实例 这里给我们的实例起名字 同一组要保持相同
vrrp_instance myinstance {
	# 当前状态的是主机
    state MASTER
    # 这里填写网卡名称 可以使用 ip ADDR 查看
    interface ens33
    # 实例的虚拟路由ID 相同实例保持相同
    virtual_router_id 51
    # 竞选优先级 数值越大优先级越高 默认100
    priority 100
    # 间隔检测时间
    advert_int 1
    # 同一组的认证配置 同一组保持一致
    authentication {
        auth_type PASS
        auth_pass 1111
	}
# 虚拟IP地址 可以配置多个 但意义不大
virtual_ipaddress {
		192.168.110.200
	}
}

第二台机器,改的是虚拟路由名称,主从状态,竞选优先级。

! Configuration File for keepalived

global_defs {
	# 虚拟路由的名称
	router_id lb101
}
# vrrp是keepalived在内网通信的协议 而instance代表实例 这里给我们的实例起名字 同一组要保持相同
vrrp_instance myinstance {
	# 当前状态的是备用机
    state BACKUP
    # 这里填写网卡名称 可以使用 ip ADDR 查看
    interface ens33
    # 实例的虚拟路由ID 相同实例保持相同
    virtual_router_id 51
    # 竞选优先级 数值越大优先级越高 默认100
    priority 50
    # 间隔检测时间
    advert_int 1
    # 同一组的认证配置 同一组保持一致
    authentication {
        auth_type PASS
        auth_pass 1111
	}
# 虚拟IP地址 可以配置多个 但意义不大
virtual_ipaddress {
		192.168.110.200
	}
}

两台实例都启动keepalived,可以模拟主机ping虚拟IP,然后直接给主机关机,发现,当主机关机,备用机的虚拟IP发生变化,此时从机上位接替虚拟IP。keepalived是个比较简单的机制,是通过判断当前keepalived进程是否存活来判断的。

更高级的版本可以通过写一个脚本定时检测nginx服务器的状态,一旦发现服务器出现问题,就kill掉keepalived的进程,达到更优的切换

16 keepalive.png