一文带你了解 OpenNJet KV Store及实现
NGINX 向云原生演进,All inOpenNJet
1. 特性介绍
OpenNJet 实现了可持久化的键值存储(key-value store)功能,并提供了相应的API对键值进行操作。基于KV Store提供的能力,可以用于如下场景:
- 模块动态配置信息的持久化
- OpenNJet不同模块间运行状态信息的共享
- 外部系统对NJet运行模块的动态参数调整
例如OpenNJet 目前提供的动态Worker数目调整功能,就是通过设置特定的KEY值,以此来触发Master 进程对运行Worker进程的管理。
2. 实现方案
开源社区已经有大量的中间件,如Redis, Etcd,这些中间件都可以用来做键值存储的数据库, 但这样不仅需要OpenNJet中有相应模块与其进行交互,并且部署时增加了外部组件的依赖。
OpenNJet KV Store 的实现上,使用了轻量级的内存数据库 LMDB。LMDB是基于内存映射的,效率高,并且访问简单,不需要单独的数据管理进程,只要在访问代码里引用LMDB库。LMDB的文件结构简单,包含一个数据文件和一个锁文件,通过锁控制来实现事务隔离,LMDB文件可以同时由多个进程打开。使用该方案,整体架构简单清晰。
OpenNJet 与其它负载均衡产品KV Store 功能的比较:
OpenNJet | nginx OSS | nginx Plus | APISIX | |
---|---|---|---|---|
是否支持 | 支持 | 无内置KV Store | 支持 | 支持 |
实现方式 | LMDB | / | 共享内存 | Etcd |
使用方式 | Restful, Lua, C API | / | Restful, Njs | Restful, Lua |
是否收费 | 开源免费 | / | 付费使用 | 开源免费 |
3. 使用说明
3.1 C API
使用C开发OpenNJet的扩展模块时,可以使用OpenNJet提供的kv 能力,对kvstore进行操作。
以数据面的模块为例,模块中需要包含OpenNJet源码中的头文件:
#include <njt_http_kv_module.h>
int njt_db_kv_get(njt_str_t *key, njt_str_t *value); int njt_db_kv_set(njt_str_t *key, njt_str_t *value); int njt_db_kv_del(njt_str_t *key);
调用样例代码如下:
static int kv_get_example() { njt_str_t lmdb_key = njt_string("test_key"); njt_str_t lmdb_value; njt_int_t ok; lmdb_value.len=0; lmdb_value.data=NULL; ok = njt_db_kv_get(&lmdb_key, &lmdb_value); if (ok == NJT_OK) { ... } return NJT_OK; }
3.2 Lua 方式
OpenNJet 提供了封装后的Lua kv store API,在Lua 中引用"njt.kv" Lua 库, 之后使用Lua 函数对kv store 进行操作,函数包括:db_kv_get, db_kv_set, db_kv_del。
测试代码如下:
location /lua_kv_test { content_by_lua_block { local kv = require("njt.kv") local args, err = njt.req.get_uri_args() local key = args["key"] local rc,msg = kv.db_kv_get(key) if rc == 0 then njt.say("old value is: "..msg) else njt.say("there is no such key in kv") end local newValue = key .."_"..tostring(os.time()) rc = kv.db_kv_set(key, newValue) if rc == 0 then njt.say("set to new value: "..newValue) else njt.say("error occuried") end } } location /lua_kv_del { content_by_lua_block { local kv=require("njt.kv") local args, err= njt.req.get_uri_args() local key=args["key"] local _, msg= kv.db_kv_del(key) njt.say(msg) } }
3.3 Restful 方式
使用官网提供的RPM 包安装后,生成的控制面njet_ctrl配置中,已包含一个可以用来设置kv值的location
location /kv { dyn_sendmsg_kv; }
可以使用Restful 的方式,GET,POST, DELETE 来对键值进行操作。
使用控制面提供的Restful 接口在设置键值时,将在key前添加 "kv_http_" 的前缀。如果使用C或Lua API,与Restful 接口设置的键值需要互操作的场景下, 在C或Lua API调用对应函数时,需要自行添加"kv_http_" 的前缀。
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
与创新者同行,Apache Doris in 2023
在刚刚过去的 Doris Summit Asia 2023 峰会上,Apache Doris PMC 成员、飞轮科技技术副总裁衣国垒带来了“与创新者同行”的主题演讲,回顾了 Apache Doris 在过去一年所取得的技术突破与社区发展,重新思考了在面对海量数据实时分析上的挑战与机遇,全面介绍了 Apache Doris 在未来的迭代计划与演进方向。 以下为衣国垒在峰会上的演讲节选,以衣国垒第一人称叙述,经编辑。 非常高兴可以看到这么多朋友共聚一堂,现场几乎座无虚席。我也相信,同样有很多朋友在线上观看峰会直播,跨越空间的距离,与我们共享此刻。 今年的主题是「与创新者同行」,按照惯例往往在开场需要对主题进行阐述,不过我希望把这一环节放在最后,希望大家能跟随我的节奏。相信在今天的分享结束后,大家会对这一主题有着更加深刻的认识。 Apache Doris in 2023 01 从“全面进化”到“里程碑式的跨越” 回顾 Apache Doris 过去的发展历程,如果用一个关键词来形容 Apache Doris 在过去的 2022 年所取得的种种收获,我们相信是“厚积而薄发后的全面进化”—— 在...
- 下一篇
用于 SuiteCRM 的 ONLYOFFICE 连接器现已推出
ONLYOFFICE 发布了 SuiteCRM 的集成连接器。现在,您可以在 SuiteCRM 文档模块中编辑和协作处理 Office 文件。继续阅读了解详情。 关于 ONLYOFFICE 文档 ONLYOFFICE 文档是一款全面的在线办公工具,提供了文本文档、电子表格和演示文稿的查看和编辑功能。它高度兼容微软 Office 格式,包括 .docx、.xlsx 和 .pptx 等文件格式,并支持实时协作编辑,使团队成员能够同时在同一文档上进行实时协作。 ONLYOFFICE 文档可与多种云服务进行集成,如:CMS 框架(WordPress/Strapi/Drupal)、协作与内容平台(ONLYOFFICE 工作区/Nextcloud/Seafile/Confluence/Alfresco)、问题跟踪工具(Jira/Redmine)、线上教育解决方案(Moodle/Chamilo/HumHub)等等。您还可将编辑器嵌入至自建 Web 服务中。 关于 SuiteCRM SuiteCRM是一款开源的,面向企业的客户关系管理应用程序,可作为 SaaS 或本地部署使用。它有多个功能模块,用于管...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7设置SWAP分区,小内存服务器的救世主