Openresty(二十二)ngx.balance和balance_by_lua终结篇

一  灰度发布铺垫

①  init_by_lua*

init_by_lua   

init_by_lua_block

特点: 在openresty 'start'、'reload'、'restart'时执行,属于'master init' 阶段机制: nginx 'master' 主进程'加载配置文件'时,运行全局Lua VM级别上的参数指定的'Lua代码'场景: 想对于应用'做一次全局性'的初始化

案例1: init阶段'已经加载'的模块会放在'package.loaded'中,供'后续阶段'直接使用备注: 在'初始化时'候加载过了,已经在 package.loaded '表'里

案例2: ' lua_shared_dict' 和 'ngx.shared'的'set、get'方法结合使用

  

当配置重载时,init_by_lua* 不会清空其内的lua_shared_dict共享数据

注意事项: 只能使用'print'、'ngx.log' API 和 'lua_shared_dict' 指令推荐: 在'init_by_lua'中调用'require()'来加载自己的模块文件特点: 1) require()会在全局Lua注册的'package.loaded表'中缓存Lua模块2) 所以在'整个Lua虚拟机实例中'你的模块将'只会加载一次'补充: 'init_by_lua*'中master进程'执行'lua代码

案例3: 阻塞'I/O'调,执行'shell'命令  --> '特殊场景'1、在这个'上下文'中,你可以保守使用'lua库'完成阻塞I/O调用2、因为在'master进程'的阻塞调用在服务的启动过程中是完全'没问题'的3、进一步说在'配置加载'阶段,Nginx核心就是'阻塞 I/O 方式'处理的场景: 采用在'init阶段'调用'shell'命令

lua执行系统命令方法os.execute和io.popen      init_by_lua_file不能连接redis

注意: 此处的'content'是'字符串',需要自己重新解析成字典,可以存入变量,也可以存在共享内存中

init_by_lua_file 

说明: '推荐'使用'init_by_lua_file'

②  init_worker_by_lua*

说明: ​官方对'init_worker_by_lua*'并没有'API'的限制

init_worker_by_lua

init_worker_by_lua_block

1、在'每个'nginx worker进程启动时调用'指定'的lua代码2、用于启动一些'定时'任务:比如'心跳'检查,定时'拉取'服务器配置等等强调:此处的任务是'跟Worker进程数量'有关系的,不要'重复'了,那么如何'避免'重复呢?

 ngx.worker.id判断某个worker进行初始化

说明: 使用ngx.timer可以'突破' init_worker_by_lua 中'不能使用 cosocket' 的限制

如何在 init_worker_by_lua 阶段连接redis/mysql/dns    redis连接池封装

③   lua_shared_dict

④   ngx.shared.DICT

ngx.shared共享内存操作

二   灰度发布案例

建议: 配置'指令'和'代码'解耦,这里暂时'不讲究'了

①  业务流程图

canary  --> gray  --> '灰度'LBM: 做'配置下发'的时候,UI侧会有一个'gray灰度'开关按钮,在upstream生成对应的'代码'片段形如:upstream {server 127.0.0.1:80;balance_by_lua 'lua/gray.lua'}备注: 这里暂时'不讨论 upstream{}'内的健康检查
​
再次强调: 同一个'schema'集群内选举灰度节点,也即'集群内'灰度引流,而不是'集群间'引流

补充: 1、一般会将'灰度策略'先写入'DB',例如'mysql'中2、利用'bgr灰度插件'解析从'redis'拉取的'灰度'策略,返回'灰度节点'信息3、init_worker_by*的'功能'1) 从'redis'中拿灰度策略,放到'ngx.shared本地缓存'中2) 启动定时任务,定时'异步'拉取'灰度'策略

②  相关参考

openresty+Lua+Redis灰度发布     高性能软件负载OpenResty整合Reids集群配置

关于openresty的全局初始化问题   基于openresty/lua-resty-redis 二次封装的工具库

Lua Redis 使用   Java Redis 预热数据    openresty定时任务    限制定时任务耗尽资源

k8s灰度发布

+++++++++++++ "题外话" +++++++++++++1、一般会'将nginx的配置信息'写到'数据库'中,然后通过nginx+consul-template 做'配置渲染'假定: mysql中的 'region'、'集群名'能唯一的决定一个'集群'的配置信息附加: 其中'upstream_id'是其一个'field'字段2、利用每个'upstream_id'的schmea的'不能'重复的特性应用: 根据'upstream_id'获取'后端服务器'列表补充: 后端服务器列表的信息在'对应服务配置'注册LB,做'配置下发'的时候已经'写入'数据库

③  代码雏形1

说明: 通过'init_worker_by_block' + 'ngx.timer.every' 实现定时'拉取'redis配置数据实现: 管理面将策略'下发'到redis后,openresty '定时[5min]'从redis中'拉取'数据  

遗留: redis'资源池'如何'复用'?nacos能实现'灰度发布'吗?灰度用户请求中'打上'标签: 'gray=true'

④  灰度策略管理面

说明: 一般会通过'UI'将策略下发到'redis'中,这里我们'模拟'手动将'key'写到缓存数据库中关键: redis 'key' 组成,一般会通过':'分割,分割的'每一个字段'都是一个'维度'特征信息模拟'key': 这里'假定'key是'uuid:ip'形式,讲解一种'简单'的形式,key的'组成'反映'特征'形式常见: $upstream_id:$tenant  --> 保证这个'key'的唯一性模拟'value': 'ip:port'形式,要'与'upstream关联[存储在'mysql'中],选取'某个server 节点'补充: 业界喜欢称一个'upstream'为一个'schema'后续设计: UI侧可以设置'多种灰度特征策略',然后选取'灰度'节点信息也即: 在'后台管理系统中'添加'ip'、'用户名'灰度白名单后+++++++++++++++  "典型案例"  +++++++++++++++灰度策略配置'UI'侧设计:1、'region'、'集群名称'、LB类型 进行 '灰度'策略的下发2、对应'server'块的'域名'、'端口'、'location'信息

OpenResty的Redis模块踩坑记录   openresty操作redis,null处理    redis连接池

1、'遍历'key2、key的'设计',到底是'hash'结构,还是'其它'数据结构?

⑤   灰度机制

1、'优先'从'本地缓存'中去取local cacheip = cache_ngx:get('gray_key')2、本地缓存中'不存在',去'redis缓存服务中'去取,然后加载到'本地'缓存检查'redis缓存中的键'是否存在 --> if redis_client.exists(key):if cacheip == "" or cacheip == nil or cacheip == ngx.null then3、通过本地'ngx.shared 一级'缓存 和 redis'二级'缓存

高并发灰度策略    小破站诡异0问题    openresty最佳实践   灰度发布

⑥  代码雏形2

细节: balance_by_lua 会 '忽略' upstream中的'server'配置

用到的'两个'指令: ​​access_by_lua_file 和 ​​balancer_by_lua_file1、在'前一个指令'中获取'租户'信息选择'灰度'节点;2、在'第二个指令'中根据获取的信息'执行'负载均衡,进行'转发';

不依赖于balance_by_lua实现灰度发布

# 另外一种方式  --> 这种'不依赖'于'balance_by_lua'做判断upstream  default_route {...
}location /gray {	set $backend 'default_route';rewrite_by_lua_file   'lua/gray.lua';  # 获取灰度节点的'逻辑'proxy_pass http://$backend;			
}	强调: 如果使用 'content_by_lua' 这个命令,就'无法'在进行'proxy_pass'了,会'冲突'

openresty实现灰度发布 

利用 proxy_pass 及lua指令 set_by_lua 动态修改当前 upstream 变量实现灰度发布

ngx_balancer.set_more_tries设置不生效,导致无限重试

OpenResty balancer_by_lua负载均衡原理解析    Openresty专栏     跨域

OpenResty火焰图性能分析工具安装     Nginx调试工具Coredump    Lua性能优化

⑦   lua/gray.lua 灰度插件

考虑: 如果'不是灰度白名单',则要使用原来的'负载均衡'策略--> '如何解决呢?' --> '重点'最佳实践: 自定义'负载均衡'算法引申:在'配置'注册的阶段,如果使用'灰度'策略,那么后续如何'取消'呢?

⑧  lua/gray_access.lua  灰度策略命中

重点: 从redis读取'租户'信息,如果有就'存'到 ​​ngx.ctx​​ 中-- 太'累'了,九不往这里贴代码了,后续有时间再补充

⑨   测试

思考:用户如何将用户'特征'信息传递过来? --> 'request Header'、'查询参数'

⑩  题外话

local http = require("resty.http")  -->  http'相关'模块

深入理解ngx.log

 lua_code_cache

openresty 项目问题汇总

nginx主动加载配置文件

openresty性能对比 

lua_load_resty_core on|off自v0.10.16版本起'该指令'就在本模块'失效'了当前resty.core模块会在'Lua VM初始化'的时候被'强制加载',不需要再显示'require'加载lua + nginx可以'作为网关'进行 '限流'、'流控'和'多级缓存'使用

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SadTalker 让图片说话

参考:https://github.com/OpenTalker/SadTalker 其他类似参考:https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github,下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints,把下载sadtalker里模型拷贝进…

人源化抗体的改造方式及其优势

抗体是一类能与抗原特异性结合的免疫球蛋白,作为免疫系统中的重要组成部分,在许多疾病的预防和治疗中发挥着重要作用。抗体治疗的最早应用可以追溯到中国人接种“人痘”预防天花的记载算起,国际上一般公认的人痘接种术最早起源于中国公元10世…

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(六)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 模型训练1)数据集分析2)数据预处理3)模型创建4)模型训练5)获取特征矩阵 2. 后端Django3. 前端微信小程序1)小程序全局配置文件2&#xff09…

电容笔有必要买最好的吗?开学好用iPad手写笔推荐

在iPad平板的热卖下,一些学生开始从传统的纸和笔的教学模式转向无纸化教学。因此,原来的Apple Pencil也成了热门话题,不少人都对这款售价近千元的电容笔产生了浓厚的兴趣。我认为对于职业画师来说,这一点非常重要,因为…

开源项目-SeaTunnel-UI数据集成系统

哈喽,大家好,今天给大家带来一个开源项目-SeaTunnel-UI数据集成系统 系统主要有任务配置,任务实例,数据源,虚拟表,用户管理等功能 登录 数据源 mysql数据源配置参数说明 kafka参数配置 mysqlcdc配置参数说明 虚拟表

区块链交易平台开发流程

随着区块链技术的日益发展,越来越多的金融机构和创业公司开始探索开发区块链交易平台的潜力。以下是一篇关于区块链交易平台开发流程的指南。 一、理解区块链技术 在开发区块链交易平台之前,必须深入理解区块链技术的内在机制和原理。区块链是一…

Linux Kernel 之四 移植过程详解、STM32F769I-EVAL 开发板适配

在之前的博文 Linux Kernel 之一 完整嵌入式 Linux 环境、构建工具、编译工具链、CPU 体系架构 中说了要一步步搭建整个嵌入式 Linux 运行环境,今天主要学习一下将 Linux 内核适配 STM32F769I-EVAL 开发板。 源码 文中涉及的源代码均放到了我个人的 Github 上&…

SmartNews 基于 Flink 的 Iceberg 实时数据湖实践

摘要:本文整理自 SmartNews 数据平台架构师 Apache Iceberg Contributor 戢清雨,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为五个部分: SmartNews 数据湖介绍基于 Icebergv1 格式的数据湖实践基于 Flink 实时更新的数据…

C | atexit函数

C | atexit函数 文章目录 C | atexit函数atexit区别进程终止的方式Reference 欢迎关注公众号“三戒纪元” atexit main函数是整个程序的入口,但是其实可以在内核中可以使用链接器来设置程序的开始地方。 当内核使用⼀个exec函数执行C程序时,在调⽤main…

BI系统上的报表怎么导出来?附方法步骤

在BI系统上做好的数据可视化分析报表,怎么导出来给别人看?方法有二,分别是1使用报表分享功能,2使用报表导出功能。下面就以奥威BI系统为例,简明扼要地介绍这两个功能。 1、报表分享功能 作用: 让其他同事…

Android查看公钥与MD5

参考:填写App特征信息_备案-阿里云帮助中心 安卓应用获取App特征信息指导 包名、公钥和签名MD5获取方式有多种,本文以使用JadxGUI工具获取为例。 下载JadxGUI工具:GitHub - skylot/jadx: Dex to Java decompiler下载安装完成后,使…

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录 如果你很赶时间,那么就直接看我本标题下的内容即可!! 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string??(本质上是一个类&#xff0…

模式分类与“组件协作模式”

1. GOF-23 模式分类 从目的来看: 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式&#…

爱分析《商业智能最佳实践案例》

近日,国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》,此评选活动面向落地商业智能的各行企业和商业智能厂商,以第三方专业视角深入调研,评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

计算机竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 …

nginx反向代理

nginx反向代理8.反向代理8.1 实现http反向代理8.1.1 反向代理配置参数8.1.2 反向代理单台web服务器8.1.2.1 端口号后加"/"8.1.2.2 端口号后不加"/" 8.1.3指定location 实现反向代理,动静分离8.1.4 反向代理实例:缓存功能8.1.4.1 举例 8.1.5 实现…

Python:Tornado框架之获取get和post的传参

一、获取get方式传参 import tornado.ioloop #导入tornado包 import tornado.web class MainHandle(tornado.web.RequestHandler):def get(self,id): #定义请求函数self.write("Hello %s!" %id)apptornado.web.Application([ #定义应用配置函数(r"/…

HCL Domino LEAP与新的软件下载门户站点

大家好,才是真的好。 还记得Domino Volt吗?是的,我前面花了不少时间来讲基于Domino平台上的低代码开发工具Volt,不下十篇,我记得最后一篇是《Domino Volt 1.0.5中的可视化流程设计器》。结果就在去年11月,…

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有问题)。 然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。 …

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期,指数组合数据截止日2023-08-31,要点如下 近1年A股风格因子收益走…