Openresty(二十一)ngx.balance和balance_by_lua灰度发布

news2024/11/18 1:25:50

一  openresty实现灰度发布

①  灰度发布

说明: '早期'博客对'灰度'发布的'概念'进行解读,并且对'原生 nginx'灰度实现进行讲解

后续: 主要拿'节点引流'的灰度发布,并且关注'gray灰度策略'

相关借鉴

②  回顾HTTP反向代理流程

ngx_http_upstream

可'操作'点:根据'负载均衡策略'选择上游的服务器

  wrr               hash               least_conn              反向代理和负载均衡原理

③  指令

balance: '均衡'

说明: 只有下面'两个'指令,而不是'三个',没有'balancer_by_lua'指令

掌握: upstream {}、'balancer_by_lua_file'、'balancer_by_lua_block'

upstream

强调: upstream模块中'server配置的地址'不能用变量,只能为'ip'

balancer_by_lua_block

1、负载均衡器'结果'可以和'现有的nginx upstream模块'一起使用

常见: 'ngx_proxy'和'ngx_fastcgi'

2、'balancer_by_lua*'可以和'标准upstream连接池'机制一同工作

常见: 标准'keepalive'指令

注意: 确保keepalive 指令在一个单独的upstream{}配置块中的'balancer_by_lua_*'的后面

3、'balancer_by_lua*' 会完全'忽略'掉定义在upstream{}块中定义的'servers'列表

重点: 但是'server'指令必须存在,作为一个'placeholder'占位符存在,避免'nginx -t'报错

同俗理解:  openretry '优先走' balancer_by_lua 逻辑块

实质:通过lua-resty-core库中的'ngx.balancer'模块,从一个完全'动态'的server列表中'选择'

颗粒度:基于'每个请求'中

4、当nginx的upstream机制'重试'请求中指令指定的条件,如proxy_next_upstream指令

说明: 这个指令'注册的Lua代码'处理器可能在一个单独的'下游请求'中被调用'不止'一次

5、注意'事项'

  1) 这个上下文中执行的Lua代码并'不支持yielding'

  2) 所以可能yield的Lua APIs(例 cosockets和"light threads")在这个上下文中是'被禁用'

  3) 通过在'早期阶段'处理程序'如:access_by_lua*'处理这种操作和

  4) 通过'ngx.ctx 'table传递结果给这个上下文的解决方法可以'绕过'这个限制

balancer_by_lua_file

1、OpenResty 的 'balancer_by_lua' 指令让'动态负载均衡'成为可能

2、它'替代'了原生的 'hash/ip_hash/least_conn' 等算法

3、不仅可以让'自由定制'负载均衡策略,还可以随意'调整'后端服务器的数量

4、完全'超越'了 upstream 系列指令,实现了接近'商业版' Nginx Plus 的功能

+++++++++++++ "注意事项" +++++++++++++

1、'balancer_by_lua' 也是一个比较'特殊'的执行阶段

特点: 这里'不能'使用 'ngx.sleep'、'ngx.req.*' 或 'coocket'

补充: 同时应当尽量'避免'大计算量操作或磁盘读写,否则会导致'阻塞'

2、动态负载均衡使用的'服务器列表'通常'存储在外部'的 Redis '常见' 或 MySQL 里

备注: 由于'不能直接'使用 cosocker,所以在 'balancer_by_lua' 里也就'不能'操作这些服务器

解决: 但可以在'其他'的阶段'access_by_lua、ngx.timer[常见]'里 -->

访问服务器获取'列表'、解析'域名',然后放在 'ngx.ctx' 或全局模块里'传递'过来

k8s nginx ingress动态更新原理

③  ngx.balance

​lua-resty-core 模块 '提供' ngx.balancer

1、这'四'个函数的的'用法'都很'简单'

2、动态负载均衡的'重点'其实是服务器'列表的维护'和'选择算法'

备注:这些工作通常应该在 'balancer_by_lua' 之'外'完成,ngx.balancer 只是最后的'执行者'

set_current_peer     nginx转发实现过程中的问题总结

最佳实践: balancer.set_current_peer用于设置后端的'地址'与'端口'

balancer中只能'设置ip',不'支持'直接设置域名,

思考: 如何解决'DNS'解析问题?

  1、host中的域名'不起'作用,'可以'使用'lua-resty-dns'解析域名,然后获取'解析'结果

  2、可以在'access_by_lua*阶段'解析域名,总之要在'upstream'之前'解析'域名

  例如:这里是在rewrite阶段,从'请求信息'中读取出了'关键'信息,做了一次DNS解析再'设置'进去的

set_more_tries

set_more_tries:设置连接'失败'后的'重试'次数

balancer.set_more_tries不能超过proxy_next_upstream_tries

推荐: 用'ngx.ctx.tries'记录进入balancer.lua的'次数',超过设置的重试次数直接给错误响应码

get_last_failure

get_last_failure:获取'上一次连接失败'的具体'原因'

注意: state_name '和' status_code  返回值的'含义'

set_timeouts

recreate_request

相关参考

④   第三方lua-resty-balance

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法之树、森林与二叉树的转换(手绘)

树、森林与二叉树的转换 树、森林与二叉树的转换树转换成二叉树原则:步骤展示连线给出除长子外的结点去线层次调整 森林转换成二叉树原则步骤展示根据树转换成二叉树的原则将每颗树转变成二叉树第 n 棵树作为第 n-1 棵树根节点的右子节点 二叉树转换成树原则步骤展示…

KDM CCA Secure FHE

参考文献: [BFM88] Blum M, Feldman P, Micali S. Non-interactive zero-knowledge and its applications[M]//Providing Sound Foundations for Cryptography: On the Work of Shafi Goldwasser and Silvio Micali. 2019: 329-349.[FS90] Feige U, Shamir A. Witn…

智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析

智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析 2023 年 3 月 13 日上午 08:56:35 UTC,DeFi 借贷协议 Euler Finance 遭遇闪电贷攻击。 Euler Finance 是一种作为无许可借贷协议运行的协议。其主要目标是为用户提供各种加密货币的借贷便利。…

免单商城系统小程序开发源码功能解析

商品免单是现在很多商家喜欢做的一种营销活动,市面上几乎所有商家都是利用免单系统进行免单活动的,但大部分的免单系统仅仅只有排队免单功能,免单的周期长类目单一。我们的免单系统是将获客、拉新、留存、转化集于一身,多种免单拓…

什么是Java中的“内存屏障“(Memory Barrier)?它们有什么作用?

内存屏障是一种用于控制内存访问顺序的指令。在多核处理器上运行的多线程程序可能会因处理器的乱序执行和缓存一致性问题而导致意外的行为。内存屏障可以用来强制某些操作的顺序,以确保线程间的正确协同。 作用包括: 保证写入的可见性:内存…

前缀和实例4(和可被k整除的子数组)

题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k 5 输出:7 …

Linux驱动IO篇——异步通知

文章目录 什么是异步通知异步通知和异步IO的区别信号含义应用层使用信号驱动如何实现异步信号驱动实例 什么是异步通知 异步通知在Linux的实现中是通过信号,而信号是在软件层次上对中断机制的一种模拟。这种机制和中断非常类似,所以可以以中断的思想来理…

AI绘画:如何让图片开口说话生成视频?变现渠道有哪些?

如何让AI绘画做出来的视频可以开口说话,本篇文章给你讲解清楚。 这个项目市面上有很多种叫法,AI数字人,图片说话,图片数字人等等。 废话不多说,直接以AI小和尚为例进行实操。 1.生成图片: 用Midjourney…

操作系统期末复习笔记

文章目录 操作系统第1章 计算机系统概述1 指令执行的基本指令周期2 中断分类与中断处理过程2.1 中断的定义2.2 中断分类2.3 中断的意义2.4 无中断2.5 有中断2.6 中断和指令周期2.7 中断处理的过程 3 处理多中断的两种方法3.1 顺序中断处理(禁止中断)3.2 …

大数据-玩转数据-Flink恶意登录监控

一、恶意登录 对于网站而言,用户登录并不是频繁的业务操作。如果一个用户短时间内频繁登录失败,就有可能是出现了程序的恶意攻击,比如密码暴力破解。 因此我们考虑,应该对用户的登录失败动作进行统计,具体来说&#x…

批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量

📚目录 ⚙️简介✨分析获取步骤⛳获取文章列表☘️前期准备✨ 接口解析⚡️ 获取文章的接口 ☄️文章质量分接口⭐接口分析 ⌛代码实现:⚓核心代码:⛵测试用例:⛴ 运行效果:☘️增加Excel导出 ✍️结束 ⚙️简介 有时候我们写文章是为了记录当下遇到的bu…

乙方策划人员的内心独白:写不完的案子,是工作的常态吗?

在某种程度上来说,这是对的。 如果是年轻人来说,在甲方当策划就是当执行,只有积累一定经验才能真正实行策划任务、 而在乙方做策划那就是纯纯的策划,也就是你说的每天写不完的案子。 对于普通人的职场选择往往是就近选择&#…

服务治理平台:SOA与微服务架构的对比与区别

文章目录 1、场景引入2、面向服务的架构SOA3、微服务架构4、对比与联系5、服务治理平台 1、场景引入 如果我们打开支付宝首页,去看我们的余额,它会展示你的总资产,昨日收益、累计收益等信息。假如这个页面所展示的信息,都来自各个…

非常详细的trunk-based分支管理流程配置及使用

非常详细的trunk-based分支管理流程配置及使用。 目前业界主流的版本管理流程是Gitflow 和 trunk-based。 Gitflow流行的比较早。但是目前的流行度要低于 trunk-based模式工作流。trunk-based模式被誉为是现代化持续集成的最佳实践。 他俩的核心区别是,Gitflow是一个更严格…

格式化文件恢复软件有哪些 格式化文件恢复软件怎么用

格式化是指对磁盘或者磁盘中的分区进行初始化的一种操作,但是这种操作会造成磁盘内数据的清除。因此,当我们需要恢复一些数据时,就要借助相关数据恢复软件的帮助,那么下面就来给大家介绍格式化文件恢复软件有哪些,格式…

ORB-SLAM2_RGBD_DENSE_MAP编译、问题解决、离线加载TUM数据和在线加载D435i相机数据生成稠密地图

文章目录 0 引言1 安装依赖1.1 其他库安装1.2 pcl库安装 2 编译ORB-SLAM2_RGBD_DENSE_MAP2.1 build.sh2.2 build_ros.sh 3 运行ORB-SLAM2_RGBD_DENSE_MAP3.1 build.sh编译版本3.2 build_ros.sh编译版本 0 引言 ORB-SLAM2_RGBD_DENSE_MAP是基于ORB-SLAM2框架的一种RGB-D稠密地图…

【C++】LeetCode 160 相交链表

今天再写一道算法题(这两周都写算法题有点摆烂) 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交&#xff1…

第17篇ESP32 platformio_arduino框架 AP热点与AP+STA同时存在模式

笔记本连接ESP32后,串口打印连接状态: 第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit…

影楼管理系统软件erp如何通过快解析发布到外网登录访问

影楼管理系统也叫影楼ERP软件,即影楼信息化管理系统,通常集成了选片、影楼流程管理、婚纱礼服、影楼财务、影楼客服、影楼接单等多功能为一身的影楼app管理。通过影楼管理系统把客户关系管理理念引入影楼管理,有序而全面的建立客户资料库&…

【9】openGL调用imGUI使用其自带例子测试

参考视频 去github下载imgui源码,得到 将根目录下所有.h .cpp文件复制到你的项目文件夹imgui下面。 进入exmaple文件夹,可以看到例子 这是它调用的头文件 在backends里找到你需要的 .h .cpp文件,总共四个文件,复制过来 你的项…