首页 > 数据库 >【网关开发】3.openresty lua使用lmdb数据库

【网关开发】3.openresty lua使用lmdb数据库

时间:2022-11-14 18:45:03浏览次数:228  
标签:__ 网关 -- resty lua openresty lmdb com

背景

网关的高可用是比较重要的内容,即使etcd数据库挂掉,也可以根据现有的数据提供负载均衡应用
所以采用几级缓存的形式 cache-->lmdb-->etcd
这里使用的是kong提供的插件使用lmdb功能

源码准备

你可以直接用git将源码下载

git clone [email protected]:Kong/lua-resty-lmdb.git --recursive

会默认将子模块代码 (lmdb) 也一起下载
或者
你可以去网站下载源码
https://github.com/Kong/lua-resty-lmdb
https://github.com/LMDB/lmdb/tree/e2b82098fa592b20cb3ba79ddbf28f2b2a692e39
然后将lmdb 的代码放在lua-resty-lmdb lmdb目录中。这里需要注意的是lmdb分支,不是master,不然在编译阶段会出现找不到变量的情况

编译

./configure ... --add-module=$lua_clibs_src/lua-resty-lmdb

在一些以前的使用方式中,需要在lmdb中进行make,得到liblmdb.so 文件,并将这个文件放在lua代码的文件夹中
这个插件应该是不需要的,直接./configure 就可以

API 使用

API 的源码在 ./lib/resty 中,你可以把他移动到你的个人工程目录下
其实就是两个文件lmdb.lua 和transaction.lua,lmdb.lua 是对transaction.lua的封装,具体的实现可以用transaction.lua 进行的实现,所以最简单的方式就是只用 lmdb.lua 中的get和set
lmdb 可以指定db,如果不指定也会调用_default数据库
那怎么设置_default的lmdb的路径呢? 答案是使用nginx的指令lmdb_environment_path 和 lmdb_map_size
如果不指定着两个指令会报错

lmdb err err: unable to open DB for access: no LMDB environment defined

nginx.conf 配置文件

lmdb_environment_path ./dblmdb.lmdb;
lmdb_map_size 128m;

使用

local lmdb = require "resty.lmdb"

local ok, err = lmdb.set('__etcd_revision__', _new_revision)
if not ok then
    ngx.log(ngx.ERR,'lmdb.set __etcd_revision__ err'..err)
end

local v = lmdb.get('__etcd_revision__')
if v then
  ngx.log(ngx.INFO,'__etcd_revision__ err'..v)
end 

--如果初始化可以清空数据可以使用
lmdb.db_drop(true)

相关链接

插件源码 https://github.com/Kong/lua-resty-lmdb

本文的工程代码:https://github.com/zhaoshoucheng/openresty
由于使用文档不全,在使用过程还是遇到了许多的问题的。
相关issues讨论:https://github.com/Kong/lua-resty-lmdb/issues/21
其实如何使用也完全可以参考kong的源码。毕竟这个项目是kong的一部分,全局搜索lmdb,就可以一目了然。
kong : https://github.com/Kong/kong

插件原理

扩展地址:https://konghq.com/blog/new-storage-engine-for-kong-hybrid-and-db-less-deployments
lua_resty_lmdb有两个部分。一个是Nginx C模块,它管理LMDB资源,并充当访问存储在LMDB数据库中的数据的抽象层。该模块还公开了Lua库通过LuaJIT的FFI设施调用的安全C API。
另一部分是一个lua库,它为lua代码提供了实际的API接口。它使用lua_resty_lmdb C模块提供的C API安全地与lmdb库交互。

总结思考

  1. 准备源码时,注意依赖的版本或者分支,可以--recursive下载子模块的最好,不然也要注意版本的对应关系。不然会存在莫名其妙的错误,而且很难查找。
  2. 在插件使用时, 多想想--add-module 或者 --with 等使用方式。
  3. 多想想插件是否使用了一些nginx的变量、配置的设定。
  4. 实在找不到问题时可以多提提issues,有时候确实是文档不够充分。

标签:__,网关,--,resty,lua,openresty,lmdb,com
From: https://www.cnblogs.com/zhaosc-haha/p/16889419.html

相关文章

  • 关于智能分析网关V2版告警消息微信推送绑定不成功的原因分析及解决
    我们在此前的文章中分享过关于智能分析网关的告警消息推送功能。智能分析网关可支持对视频监控中的人脸、车辆、物体、行为等进行识别与抓拍、比对、告警,可提供人脸检测与......
  • 7.Gateway:Spring Cloud API网关组件(非常详细)
    在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,......
  • 群晖NAS做ISCSI存储一定不要多网关
    多次血泪教训,不要在群晖NAS当做IP-SAN的时候,万兆做存储接口 千兆做管理接口,百分百出各种问题,有可能导致LUN空间损坏即便是在群晖NAS里SAN管理里面指定target走的网口,也......
  • SAP 电商云 CMSUserGroupRestriction 在 Spartacus 里的 evaluation 问题
    问题描述已经设置了CMSUserGroupRestriction,在Accelerator上可以正常工作,但在Spartacus上不工作。注意到的是导航节点根据restriction已经处于deactivated状态,但......
  • 13.统一网关gateway
    统一网关gateway1.网关功能网关功能:身份认证和权限校验服务路由、负载均衡请求限流2.搭建网关2.1创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现......
  • 微服务网关 APISIX 群集配置指南
    1.前言APISIX通过ETCD存储数据,利用ETCD本身的功能实现群集管理和控制。有关APISIX的安装配置详情参考“ APISIX网关CentOS7环境安装配置”。前面文章描述的是......
  • 【热更新实践】xLua基本用法
    这边文章是看xlua官方教程和一些文档之后的一个总结,希望大家都能学会lua,当然最希望我能快点学会lua。。。C#调用Lua(1)LuaEnvLuaEnv是C#中调用lua时需要用到的lua环境提示,需......
  • 微服务网关 APISIX 群集配置指南
    1.前言APISIX通过ETCD存储数据,利用ETCD本身的功能实现群集管理和控制。有关APISIX的安装配置详情参考“​​APISIX网关CentOS7环境安装配置​​”。前面文章描述......
  • 物联网网关可以采集水质传感器哪些数据?
    物联网网关是将控制器、传感器、机器人和其他智能设备连接到云平台或软件的设备。无论是什么功能的网关,其核心都是进行设备和云之间的数据传输,用来支撑远程监控、智能管理等......
  • Error evaluating expression ‘xxxxx != null and xxxxxx!= ”’. Cause: org.apache
    错误描述:SQL语句中出现Errorevaluatingexpression‘category.id!=nullandcategory.id!=”’.Cause:org.apache.ibatis.ognl.OgnlException:sourceisnullfor......