采用Docker方式的Tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求
目录
- 网络架构
- 一、环境准备
- 二、软件安装
- 1. 下载Tenine镜像
- 2. 下载Keepalived镜像
- 3. 制作SpringBoot镜像
- 三、软件配置
- 1. 创建应用容器
- 2. 代理访问应用
- 3. 创建Keepalived
- 4. 测试高可用
网络架构
一、环境准备
两台物理主机: 22.04.3-Ubuntu Linux
Docker版本:24.0.9
3个IP地址 192.168.30.191 192.168.30.192 192.168.30.190(作为虚拟IP)
二、软件安装
两台机器上都执行
1. 下载Tenine镜像
docker pull axizdkr/tengine:3.1.0
本次镜像来源 https://github.com/Axizdkr/tengine
2. 下载Keepalived镜像
docker pull osixia/keepalived:2.0.20
3. 制作SpringBoot镜像
根据各自应用需要创建镜像
三、软件配置
两台机器上都执行
1. 创建应用容器
假设 SpringBoot 各物理主机上创建了,SpringBoot端口为 9166
2. 代理访问应用
使用Tengine 代理访问SpringBoot
创建必要映射目录
mkdir -p /apps/tengine/cfg /apps/tengine/logs /appstengine/vue
在目录 /apps/tengine/cfg 创建 nginx.conf
#user nobody;
worker_processes 8;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
# 当设置为 on 时,Nginx 会在发送响应时,尽量将数据合并成一个大的 TCP 数据包进行发送。这可以减少 TCP 包的数量,从而提高网络传输效率,尤其是在发送大文件时
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
gzip_vary on;
gzip_proxied any;
# 将Nginx代理的所有请求实体的大小限制为20m
client_max_body_size 100m;
upstream cluster1 {
server 192.168.30.191:9166;
server 192.168.30.192:9166;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
error_page 404 /404.html;
# 统一走代理访问vue前端页面 xxxx/dist
location ~ /([A-Za-z0-9_-]+)/dist
{
root /vue/;
index index.html index.htm;
}
#代理SpringBoot访问
location /api/
{
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme';
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://cluster1/;
}
location /nginx_basic_status {
stub_status on;
}
location /nginx_check_status {
check_status;
}
# 主要用于keepalived 检查
location /health_check {
access_log off;
return 200 "OK";
}
}
}
有关Tengine的 健康检查配置说明,请参考官方文档:
https://tengine.taobao.org/document_cn/http_upstream_check_cn.html
注意:
Tengine 健康检查会不停的访问 http://192.168.30.191:9166/ http://192.168.30.192:9166/ 这两个地址
,如果你的SpringBoot应用有安全拦截(Shiro 或者 SpringSecurity)记得放行这个URL
创建Tengine容器
sudo docker run --network=host \
--privileged \
--restart=always \
--name tengine \
-v /apps/tengine/cfg/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /apps/tengine/logs:/var/log/nginx \
-v /apps/tengine/vue:/vue/ \
-d axizdkr/tengine:3.1.0
3. 创建Keepalived
在 两台主机上 创建必要映射目录
mkdir -p /apps/keepalived
在主机191目录下创建
在目录/apps/keepalived下创建配置文件 keepalived.conf 内容如下:
vrrp_script chk_nginx {
script "curl -s http://172.17.0.1/health_check"
interval 2
weight -3
}
vrrp_instance VI_2 {
state MASTER
interface enp10s0
virtual_router_id 54
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.30.190
}
track_script {
chk_nginx
}
}
在主机192目录下创建
在目录/apps/keepalived下创建配置文件 keepalived.conf 内容如下:
vrrp_script chk_nginx {
script "curl -s http://172.17.0.1/health_check"
interval 2
weight -3
}
vrrp_instance VI_2 {
state BACKUP
interface enp9s0
virtual_router_id 54
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.30.190
}
track_script {
chk_nginx
}
}
主要是如下几个变量要注意:
interval 2 每隔2秒执行一次
weight -5 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级减5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) 默认值为 3
rise 1 #检测1次成功就算成功。但不修改优先级 默认值为 2
interface 当前节点服务器的网卡名称
priority 优先级,每一个节点上不一样
virtual_ipaddress 虚拟ip
virtual_router_id 共享相同虚拟IP的节点上该参数值必须一样 ,
keepalived可以代理多个虚拟IP,每一个虚拟IP对应的virtual_router_id值不可一样。
state 指定当前keepalived的初始状态,这个可用是 MASTER 或者 BACKUP ,如果是BACKUP 则作为从节点,但是这个值会根据监控脚本运行状态改变优先级从而导致状MASTER /BACKUP 态切换
三台主机上执行:
docker run -d --name keepalived \
--cap-add=NET_ADMIN \
--cap-add=NET_BROADCAST \
--cap-add=NET_RAW \
--net=host \
-e KEEPALIVED_INTERFACE=eth0 \
-v /apps/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
osixia/keepalived:2.0.20 --loglevel debug --copy-service
变量 KEEPALIVED_INTERFACE 是指当前节点服务器的网卡名称,如果不想开启debug模式去掉–loglevel debug
4. 测试高可用
两台都启动了keepalived后,目前 192.168.30.190 IP应该是绑定在 191 这台物理主机上,
可以 浏览器访问 http://192.168.30.190/nginx_check_status
可以看到如下页面显示:
192.168.30.190 是 keepalived的虚拟IP, 然后可以访问SpringBoot应用接口看下是否负载均衡了
关闭 191上面的SpringBoot 看下 访问情况
关闭 191 上面的 Tengine 看下 访问情况