目录

  • 1、搭建环境
  • 2、Keepalived介绍
  • 3、搭建步骤


1、搭建环境

两台虚拟机 CentOS Linux release 7.9.2009 (Core)
Docker version 23.0.1
Docker-compose version 1.25.0-rc4

2、Keepalived介绍

Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。

Keepalived 以 VRRP 协议为实现基础。 VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议, 它将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常就是 MASTER,或者是通过算法选举产生, MASTER 实现针对虚拟路由器 IP 的各种网络功能,其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。

当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。

3、搭建步骤

两台主机配置文件目录:

/home/docker/nginx/conf

在此目录创建了如下文件:

docker nginx 性能很低 docker nginx高可用_docker


每台主机的 nginx 和 keepalived 都是docker 容器。上述配置都是为了配置容器!

  • html 文件夹与 nginx.conf 用于数据卷挂载到 nginx 容器
  • Dockerfile 用于构建keepalived镜像,采取Dockerfile的目的是直接将 keepalived.conf 和 nginx_check.sh(脚本赋予权限) 传入 keepalived 容器
  • docker-compose.yml 用于拉镜像起容器

(1)nginx.conf 配置:

docker nginx 性能很低 docker nginx高可用_docker nginx 性能很低_02


需要注意上图箭头的位置,将 nginx.conf 挂载到 nginx 容器中后,要从箭头位置获取 nginx 展示的 html,这里我是自己配置了一下html,为了两台主机的nginx展示的页面不一样!

后续在docker-compose.yml 中,我配置了将宿主机的 /home/docker/nginx/conf/html 挂载到容器中的 /usr/share/nginx/html。

(2)html/index.html 配置:

docker nginx 性能很低 docker nginx高可用_nginx_03

(3)nginx_check.sh 配置

该脚本被 keepalived 用来检测nginx是否在运行,若 nginx 停止则 keepalived 也停止,就再选出一个 Master。这个脚本在传入容器中需要赋予执行脚本的权限。

docker nginx 性能很低 docker nginx高可用_docker_04

(4)keepalived.conf 配置

docker nginx 性能很低 docker nginx高可用_nginx_05


补充: 少配置了一行用来通知主机Master的切换:

notify “/container/service/keepalived/assets/notify.sh”

上述配置中 nopreempt 设置为了非抢占式,即不会按照优先级而切换Master,只有当当前主机宕机后,才切换,如果当前主机是好的,即使有另外一优先级更高的主机,也不会切换。

注意上述配置中 nginx_check.sh 需要在 keepalived 容器中的位置。

(5)Dockerfile 配置:

基于docker库中的 keepalived 镜像构建镜像,将检查 nginx 的脚本和keepalived.conf 配置文件添加进镜像。

docker nginx 性能很低 docker nginx高可用_docker_06

其实这里也可以不用Dockerfile,也可以采用 docker-compose 的形式,区别在于采用Dockerfile的话,nginx_check.sh 和 keepalived.conf 就直接保存在镜像中了。起的容器也自带这俩文件。而docker-compose 是采用挂载的方式,可采用command指令来赋予脚本权限:“chmod +x /etc/keepalived/nginx_check.sh”,每次起容器都需要挂载文件。

(6)docker-compose 配置

docker nginx 性能很低 docker nginx高可用_html_07

(7)执行 docker-compose.yml

docker-compose up -d

我先在 192.168.182.136 执行 docker-compose
查看 keepalived容器 日志

docker logs 容器id -f  // -f 实时跟踪日志输出

docker nginx 性能很低 docker nginx高可用_docker_08


执行 ip a

可以看到虚拟 ip 192.168.182.138 已经绑定到了当前主机。当前主机是master!

docker nginx 性能很低 docker nginx高可用_docker nginx 性能很低_09

然后在 192.168.182.135 启动 docker-compose

docker nginx 性能很低 docker nginx高可用_nginx_10


由于 master 已存在,他现在为默认的 backup。

测试展示页面:

docker nginx 性能很低 docker nginx高可用_网络_11

将当前master主机 192.168.182.136 宕机

// 停止和删除由docker-compose up命令启动的所有容器、网络、卷和镜像。
docker-compose down

然后去 192.168.182.135 查看 keepalived 容器日志:

docker nginx 性能很低 docker nginx高可用_nginx_12


发现他已经成为新的 master。

执行 ip a

docker nginx 性能很低 docker nginx高可用_docker_13

测试展示页面:

docker nginx 性能很低 docker nginx高可用_nginx_14