前面的博客介绍了怎么编译支持http3的nginx,并添加了upsync模块。为了在生产环境验证QUIC,我在aws搭建了一个Nginx + upsync + consul的集群 ,支持动态负载均衡。

consul介绍

consul是HashiCorp公司(曾经开发过vgrant) 推出的一款开源工具, 基于go语言开发, 轻量级, 用于实现分布式系统的服务发现与配置。
consul内置有KV存储, 服务注册/发现, 健康检查, HTTP+DNS API, Web UI等多种功能。
官网: https://www.consul.io/

架构说明:

  1. Consul 集群由Consul Agent的节点组成, 在集群中有两种角色: Server和 Client 。
  2. Server和Client只是Consul的两种角色,二者之间并没有什么区别,只是人为的角色划分。
  3. Consul Server : 用于维护Consul 集群的状态信息, 实现数据一致性。 多个server之中会基于Raft协议选举出一个leader。 多个Server节点上的Consul数据信息保持强一致性。 在局域网内与本地客户端通讯,通过广域网与其他数据中心通讯。
    Consul Client: 只维护自身的状态, 并将HTTP和DNS接口请求转发给服务端。
  4. Consul 支持多数据中心, 多个数据中心要求每个数据中心都要安装一组Consul集群,多个数据中心间基于gossip protocol协议来通讯

搭建方案 :

consul server 存储tomcat服务器的信息
consul client 端负责对服务器进行健康检查并同步到server
nginx间隔时间动态获取最新的consul server配置信息, 这样nginx 就可以实现动态负载均衡了。

AWS部署流程

我是使用的AWS来部署的实例,这里也简单记录下vpc和实例的构建过程

一.VPC,子网,网关,路由表创建

  1. 创建VPC ,选择IPv4 CIDR
  2. 创建四个子网 两个公有子网和两个私有子网(分别处于不同的可用区域–为了DR): quic-subnet1,quic-subnet2,quic-internal1,quic-internal2
  3. 创建互联网网关并关联到对应的VPC; 在主路由表里添加互联网网关的路由,然后关联主路由表到对应的公有子网
  4. 创建弹性ip后并创建对应的NAT网关(在quic-subnet1上),创建路由表(路由target为nat)并关联到私有子网

二.创建实例

  1. 创建安全组
    1) 堡垒机 开放22端口的SSH访问
    2) nginx-quic的安全组
    3) tomcat集群的安全组
    4) consul-server的安全组

  2. 创建堡垒机实例,并分配弹性IP (quic-subnet1上)

  3. 分别创建quic-nginx-upsync-1,quic-nginx-upsync-2,quic-tomcat-1,consul-server1,consul-server2的实例

  4. 创建网络负载均衡器和目标群组(因为使用的quic,所以负载均衡器协议是TCP_UDP)

注意:由于AWS申请了5个弹性IP之后,再申请分配就会提示到达上限,需要将之前的弹性IP先取消关联,分配给新的实例

consul 集群部署

consul server : 172.33.36.48, 172.33.63.50 (这里我只部署了两台,实际是3server + 4 client)
consul client (和tomcat在一台机子上) : 172.33.35.141

wget https://releases.hashicorp.com/consul/1.7.5/consul_1.7.5_linux_amd64.zip
## sudo -i 切换到root用户下
unzip consul_0.7.5_linux_amd64.zip

分别在consul server 172.33.36.48, 172.33.63.50 上编写配置文件

{"server": true,"ui": true,"data_dir": "/opt/consul_dir/data","datacenter": "dc1","node_name": "server1","log_level": "info","bind_addr": "172.33.36.48","client_addr": "172.33.36.48","retry_join": ["172.33.36.48","172.33.63.50"]
}
{"server": true,"ui": true,"data_dir": "/opt/consul_dir/data","datacenter": "dc1","node_name": "server2","log_level": "info","bind_addr": "172.33.63.50","client_addr": "172.33.63.50","retry_join": ["172.33.36.48","172.33.63.50"]
}

在consul client 172.33.35.141上编写配置文件 , 搭建其他client的时候只要把配置文件上的bind_addr, client_addr 修改为对应IP即可

{"server": false,"ui": true,"data_dir": "/opt/consul_dir/data","datacenter": "dc1","node_name": "client1","log_level": "info","bind_addr": "172.33.35.141","client_addr": "172.33.35.141","retry_join": ["172.33.36.48","172.33.63.50"],"service": {"id": "1","name": "quic","address": "172.33.35.141","port": 8080,"check": {"id": "quic","name": "HTTPAPI on port 8080","http": "http://172.33.35.141:8080/quic/api/checkHealth","interval": "10s","timeout": "1s"}}
}

为了方便启动,编写了两个shell脚本

## consul server的启动脚本
#!/bin/sh
cd /opt
nohup ./consul agent -bootstrap-expect=1 -config-dir=/opt/consul_dir/server.json                        >> /opt/logs/consul.log 2>&1 &## consul client的启动脚本#!/bin/sh
cd /opt
nohup ./consul agent -config-dir=/opt/consul_dir/client.json  >> /opt/logs/consul.log 2>&1 &

通过端口映射,可以看到consul的三个节点都正常启动了,也选举出了leader


添加nginx upstream服务信息到consul

我们可以使用linux命令方式发送put请求:
curl -X PUT http://172.33.36.48:8500/v1/kv/upstreams/quic/172.33.35.141:8080

请求发送成功后就可以在consul web 界面看到对应的服务器信息了

部署Nginx

前面一篇博客已经在自己的服务器上成功安装了nginx(添加了quiche和upsync模块)。只要把安装目录/opt/server下的nginx打包部署到aws实例的相应目录下就可以了

最后只需要修改下nginx的配置文件就可以了
在nginx.conf里通过include引入如下配置文件,这样我们只需要修改conf.d里的配置文件就可以了,这样就可以避免修改原来的配置文件

 server {listen       80;# nginx服务器的ip地址server_name  172.33.17.51;location / {root   html;index  index.html index.htm;}}include /opt/server/nginx/conf/conf.d/*.conf; # another virtual host using mix of IP-, name-, and port-based configuration

quic.conf

upstream myserver {server 127.0.0.1:11111;#超时是6m 间隔是500mupsync 172.33.36.48:8500/v1/kv/upstreams/quic upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;upsync 172.33.63.50:8500/v1/kv/upstreams/quic upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;#从consul拉取的上游服务器后持久化的位置upsync_dump_path /opt/data/consul/server.conf;
}server {# Enable QUIC and HTTP/3.listen 443 quic reuseport;# Enable HTTP/2 (optional).listen 443 ssl http2;ssl_certificate /opt/ssl/fullchain.pem;ssl_certificate_key /opt/ssl/privkey.pem;# Enable all TLS versions (TLSv1.3 is required for QUIC).ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# Add Alt-Svc header to negotiate HTTP/3.add_header alt-svc 'h3-29=":443"; ma=86400';location /quic {proxy_pass http://myserver;}
}

然后通过sbin/nginx -c conf/nginx.conf 命令启动nginx就可以了

绑定域名到对应的负载均衡器

最后只要将域名绑定到对应的负载均衡器上,我们就可以通过域名访问到对应的api了

请求url成功

quic协议的验证在上一篇博客里已经写过了,需要的可以参照该博客
QUIC实战(一) 通过Quiche部署支持HTTP3 的NGINX

部署过程遇到的问题 :

一开始我的bind_addr和client_addr都写的127.0.0.1,结果出现了如下报错信息。需要将bind_addr的ip改成consul server与其他节点交互的内网ip

参考资料:

consul配置参数大全、详解、总结

Consul集群搭建 2Server+ 3Client

QUIC实战(二) AWS 搭建nginx(http3.0) + upsync + consul(server-client模式) 集群相关推荐

  1. CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群

    CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群 VMWare 安装CentOS 7 使用Xshell连接虚拟机 集群设置 安装JDK 1.8 SSH 免密登陆 安装ha ...

  2. 从零开始搭建高可用RabbitMQ镜像模式集群

    文章目录 RabbitMQ集群模式搭建 准备工作 选取任意一个节点作为master节点, 进行文件同步, 我这里选择138作为master节点 组成集群 配置镜像队列(设置镜像队列策略) 集群配置参数 ...

  3. mysql 数据库集群搭建:(四)pacemaker管理三台maxscale集群,搭建mariadb读写分离中间层集群...

    为什么80%的码农都做不了架构师?>>>    <mysql 数据库集群搭建:(一)VirtualBox中多台CentOS虚拟机间和windows主机间互通以及访问互联网设置& ...

  4. Redis单机模式主从模式哨兵模式集群模式搭建

    文章目录 一.Redis下载及安装 1.1.下载 1.2.环境安装 1.3.编译安装 1.4.修改配置 1.5.启动Redis 1.6.验证Redis是否启动 1.7.进入到Redis客户端 1.8. ...

  5. 生产环境elasticsearch5.0.1和6.3.2集群的部署配置详解

    线上环境elasticsearch5.0.1集群的配置部署 es集群的规划: 硬件: 7台8核.64G内存.2T ssd硬盘加1台8核16G的阿里云服务器 其中一台作为kibana+kafka连接查询 ...

  6. 实战:windows上如何安装kubectl并连接我们的k8s集群(测试成功-博客输出)-2022.1.3

    实战:windows上如何安装kubectl并连接我们的k8s集群-2022.1.3 目录 文章目录 实战:windows上如何安装kubectl并连接我们的k8s集群-2022.1.3 目录 实验环 ...

  7. redis 4.0.8 源码包安装集群

    系统:centos 6.9 软件版本:redis-4.0.8,rubygems-2.7.7,gcc version 4.4.7 20120313,openssl-1.1.0h,zlib-1.2.11 ...

  8. 【VMware vSAN 7.0】5.5 配置 vSAN 集群的许可证设置

    [VMware vSAN 7.0]5.5 配置 vSAN 集群的许可证设置-我们有软硬件解决方案 IT干货 2021-03-31 16:36:53 213 收藏 1 分类专栏: 1.服务器虚拟化集群方 ...

  9. 搭建大型分布式服务(二十五)如何将应用部署到TKE容器集群?

    系列文章目录 文章目录 系列文章目录 前言 一.本文要点 二.开发环境 三.部署容器服务 1.制作Nginx镜像,用来打包前端web服务. 2.创建工作负载,用来运行前端web服务. 3.配置serv ...

最新文章

  1. centos7离线安装boost
  2. oracle数据源的报表sql计算慢解决
  3. python之numpy基础_Python知识普及:Numpy基础操作
  4. mysql数据库元表_mysql中元数据库information_schema学习之TABLES表
  5. linux下工具exfs用法
  6. P4173 残缺的字符串
  7. 从KPI到OKR,高阶产品人如何推动业务高速增长
  8. [JetBrains Rider] 在保存文件时自动更新文件头的方法
  9. 降序php,以降序php读取文件
  10. 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术
  11. 【Python3】【爬虫】meizituSpider
  12. 跨境电商开发,源码无加密
  13. 像中文的罗马音字体复制_罗马音字体大全可复制
  14. 多元共线性检测 -- 方差膨胀因子(Python 实现)
  15. U盘html文件恢复不了,u盘文件突然不见了怎么恢复?恢复小技巧来了
  16. 《Imaging Systems For Medical Diagnostics》——12. X-ray components and systems (3) X射线组件和系统(3)
  17. 解决XUI 1.1.7版本报错问题:gradle因umeng仓库配置失效,导致编译出错
  18. 【输入一个数并判断是质数还是合数】
  19. [软件人生]感慨邱成桐!闲聊学术界
  20. 百问网七天物联网课程学习笔记——单片机开发模式

热门文章

  1. linux相关函数,linux学习-信号相关函数
  2. java观察者模式在spring中的应用_Spring源码之spring中的观察者模式和监听器的使用...
  3. python办公代码_[Python] 自动化办公 docx操作Word基础代码
  4. 64位计算机安装32位,64位电脑装32位系统,小编教你64位电脑怎么装32位系统
  5. android 等待动画 库,android--AnimationDrawable实现等待动画效果
  6. 【SpringBoot零基础案例08】【IEDA 2021.1】SpringBoot获取核心配置文件application.properties中的自定义配置
  7. 【报错笔记】maven项目启动时报错
  8. 【项目经验】如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置
  9. Linux文件目录命名规则
  10. outlook vba开发要点