Erlang Mnesia 数据丢失(并未真正丢失,只是索引丢失)

简介: 从 Ejabberd开源项目中了解到了 Mnesia的用法,之后好多长一段时间都用 Mnesia 设计分布式缓存。前段时间系统上线没有出现问题,过了一段时间发现用户登录出现异常(总结发现都是用户切换网络时候出现)发现用户或设备数据丢失

Mnesia 数据丢失(并未真正丢失,只是索引丢失)

用Mnesia构建的 ws_session,数据读写都有用了dirty操作。

系统刚上线没有出现问题,过了一段时间发现用户登录出现异常(总结发现都是用户切换网络时候出现)。进一步分析发现数据不同步了,例如根据 mnesia:dirty_index_read(ws_session, 2, id) 查数据总是查出空,偶尔在节点上查到数据(后来发现是根据 Key),起初误以为集群节点数据不同步。多次试验后发现 index查不到数据,key 能查到数据,得出结论是索引丢失了,百思不得其解,进一步了解发现是mnesia:dirty_delete_object删除时候只删除了索引,没有删除数据。

原来delete_object时候原来record 已被修改过了,才导致此次删除数据时只删除了索引,现在看上去比较合理,毕竟只丢失了索引。

但是更让人意外的是即使数据重写也不会再生成索引了,必须先根据 Key 把数据删除。

解决方案,删除数据的时候避免采用 delete_object,改为直接根据 Key 删除。查询数据时,先根据索引查询数据,若发现有索引丢失,立马根据 Key 把数据删除,重新生成一份数据,这样才能保证生成索引。

手册中有明确的解释:

delete_object(Tab, Record, LockKind) -> transaction abort | ok 

If a table is of type bag, it can sometimes be needed to delete only some of the records with a certain key. This can be done with the function delete_object/3. A complete record must be supplied to this function.

The semantics of this function is context-sensitive. For details, see mnesia:activity/4. In transaction-context, it acquires a lock of type LockKind on the record. Currently, the lock types write and sticky_write are supported.
目录
相关文章
|
Shell 网络架构
《cowboy 源代码分析第一部 (Erlang实现的http服务器)》
cowboy是基于ranch的http服务器。特点是功能强打(支持完整的http协议websocket,spdy等),简洁,轻量级。
《cowboy 源代码分析第一部 (Erlang实现的http服务器)》
|
移动开发 JavaScript 前端开发
游戏框架 - 描述Phaser、Three.js等JavaScript游戏框架的核心功能和使用场景。
Phaser是开源2D游戏引擎,适合HTML5游戏,内置物理引擎和强大的图形渲染功能,适用于2D游戏,如消消乐。Three.js是基于WebGL的3D库,用于创建和显示3D图形,支持交互和多种3D效果,广泛应用在游戏、可视化等多个领域。两者各有侧重,选择取决于项目需求和图形交互要求。
725 3
|
9月前
|
消息中间件 存储 NoSQL
Django 实战:Celery 异步任务从环境搭建到调用全掌握
本文详解 Celery 核心概念、架构组成及工作流程,并实战演示如何在 Django 项目中集成 Celery,实现异步任务调用与事务提交控制,助你掌握从配置到部署的全流程开发技巧。
853 3
|
前端开发 JavaScript 应用服务中间件
Nginx 支持 JavaScript:前所未有的扩展
Nginx 是全球领先的高性能 Web 服务器,以其高效的反向代理和负载均衡功能著称。近期,Nginx 正式支持 JavaScript(通过 NJS 模块),基于 V8 引擎,允许在配置中嵌入 JS 代码,极大提升了灵活性和扩展性。开发者可以使用 JavaScript 实现动态请求处理、自定义认证、复杂响应处理、中间件编写及流量控制等功能,显著降低开发和维护难度,同时保持高性能。NJS 模块的引入为 Nginx 带来了前所未有的扩展能力,适应快速变化的业务需求。
432 0
|
消息中间件 存储 容灾
RabbitMQ的故障恢复与容灾策略
【8月更文第28天】RabbitMQ是一个开源的消息代理软件,它支持多种消息协议,如AMQP(Advanced Message Queuing Protocol)。在实际应用中,为了保证服务的连续性,需要实施一系列的故障恢复与容灾策略。
961 2
|
Python
Python扩展TimedRotatingFileHandler
【10月更文挑战第7天】 python log执行扩展压缩功能
328 0
|
JavaScript
Vue中 引入使用 vue-splitpane 实现窗格的拆分、调节
Vue中 引入使用 vue-splitpane 实现窗格的拆分、调节
2882 0
Vue中 引入使用 vue-splitpane 实现窗格的拆分、调节
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(四十四)(2)
SqlAlchemy 2.0 中文文档(四十四)
281 4
|
数据采集 人工智能 网络协议
trio,一个超级实用的 Python 异步编程库
trio,一个超级实用的 Python 异步编程库
630 1
|
缓存 监控 数据库
Flask性能优化:打造高性能Web应用
【4月更文挑战第16天】本文介绍了提升Flask应用性能的七大策略:优化代码逻辑,减少数据库查询,使用WSGI服务器(如Gunicorn、uWSGI),启用缓存(如Flask-Caching),优化数据库操作,采用异步处理与并发(如Celery、Sanic),以及持续监控与调优。通过这些手段,开发者能有效优化Flask应用,适应大型或高并发场景,打造高性能的Web服务。
1447 0

热门文章

最新文章