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.
目录
相关文章
|
6月前
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
119 2
|
6月前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
403 5
|
8月前
|
存储 数据挖掘 Linux
服务器数据恢复—服务器重装系统导致原分区丢失的数据恢复案例
服务器数据恢复环境&故障: 磁盘柜中有一组通过RAID卡创建的RAID5阵列,分配一个LUN,服务器上层安装Linux操作系统。操作系统层面划分sdc1和sdc2两个分区。通过LVM扩容的方式将sdc1分区加入到了root_lv中;sdc2分区格式化为XFS文件系统。 服务器重装操作系统后,磁盘分区改变,sdc2分区丢失,无法访问。
服务器数据恢复—服务器重装系统导致原分区丢失的数据恢复案例
|
10月前
|
存储 NoSQL 容灾
怎样保证Redis 保证数据不丢失?
Redis 数据不丢失主要靠持久化(RDB、AOF、混合)和集群运行(主从同步、哨兵、Cluster)。RDB是快照,恢复速度快但可能丢失部分数据;AOF记录所有命令,实时性好但写性能较低;混合持久化结合两者优点。集群通过多服务器分布数据,提高可用性和数据安全性。
289 5
|
10月前
|
消息中间件 存储 缓存
中间件数据丢失与重复消费
中间件数据丢失与重复消费
70 1
|
监控 网络协议 安全
关于数据包丢失你需要知道的一切(以及如何避免它)
关于数据包丢失你需要知道的一切(以及如何避免它)
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
148 0
|
消息中间件 JSON Kafka
当 Kafka 分区不可用且 leader 副本被损坏时,如何尽量减少数据的丢失?
经过上次 Kafka 日志集群某节点重启失败导致某个主题分区不可用的事故之后,这篇文章专门对分区不可用进行故障重现,并给出我的一些骚操作来尽量减少数据的丢失。
639 0
当 Kafka 分区不可用且 leader 副本被损坏时,如何尽量减少数据的丢失?
|
Web App开发 安全
IE9相比IE8丢失了什么?
IE 8 在微软的大力造势下,IE9被笼罩上了一圈光环,IE9对新的Web标准如何如何兼容、IE9速度如何如何快已经把我们的耳朵都磨出茧子了,但是事情总是具有两面性的,IE9真的就那么完美无缺吗? IE 9 Microsoft Connect测试人员tuxplorer就总结了IE9相比IE8丢失的功能,并将此反映给微软,不过他表示,微软似乎并没有重视他的反馈意见。
897 0