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.
目录
相关文章
|
7月前
|
消息中间件 存储 缓存
写入内容丢失,各种数据库或者存储系统如何处理?
写入内容丢失,各种数据库或者存储系统如何处理?
84 0
|
7月前
|
存储 关系型数据库 MySQL
【服务器数据恢复】同友存储数raid5崩溃的据恢复案例
服务器数据恢复环境: 一台同友存储,存储上有一组raid5磁盘阵列,存储上层有若干台虚拟机,其中有3台linux操作系统虚拟机上存放重要数据。 服务器故障: 同友存储上的raid5阵列崩溃导致存储无法启动。
【服务器数据恢复】同友存储数raid5崩溃的据恢复案例
|
3月前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
255 5
|
5月前
|
存储 数据挖掘 Linux
服务器数据恢复—服务器重装系统导致原分区丢失的数据恢复案例
服务器数据恢复环境&故障: 磁盘柜中有一组通过RAID卡创建的RAID5阵列,分配一个LUN,服务器上层安装Linux操作系统。操作系统层面划分sdc1和sdc2两个分区。通过LVM扩容的方式将sdc1分区加入到了root_lv中;sdc2分区格式化为XFS文件系统。 服务器重装操作系统后,磁盘分区改变,sdc2分区丢失,无法访问。
服务器数据恢复—服务器重装系统导致原分区丢失的数据恢复案例
|
6月前
|
存储 数据挖掘 索引
服务器数据恢复—服务器存储中文件夹丢失的数据恢复案例
服务器存储数据恢复环境: DroboPro FS网络存储,共8块SAS硬盘,组建了一组raid5磁盘阵列。 服务器存储故障: 存储中有一个共享文件夹丢失,该文件夹存放了重要数据。
服务器数据恢复—服务器存储中文件夹丢失的数据恢复案例
|
7月前
|
存储 NoSQL 容灾
怎样保证Redis 保证数据不丢失?
Redis 数据不丢失主要靠持久化(RDB、AOF、混合)和集群运行(主从同步、哨兵、Cluster)。RDB是快照,恢复速度快但可能丢失部分数据;AOF记录所有命令,实时性好但写性能较低;混合持久化结合两者优点。集群通过多服务器分布数据,提高可用性和数据安全性。
207 5
|
7月前
|
消息中间件 存储 缓存
中间件数据丢失与重复消费
中间件数据丢失与重复消费
58 1
|
7月前
|
存储 数据挖掘 Windows
服务器数据恢复—异常断电导致raid信息丢失的数据恢复案例
由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windows server操作系统,没有配置ups。 因为服务器异常断电重启后,raid阵列可以正常使用,所以未引起管理员的注意。后续出现的多次异常断电导致raid报错,服务器无法找到存储设备,进入raid管理模块进行任何操作都会导致操作系统死机。管理员尝试多次重启服务器,故障依旧。
|
7月前
|
数据挖掘 数据库 Windows
【服务器数据恢复】服务器raid5崩溃导致上层分区无法访问的数据恢复案例
服务器数据恢复环境: 北京某教育机构一台服务器中有一组由3块磁盘组建的raid5阵列,服务器安装的windows server操作系统。 服务器故障: 该服务器在运行过程中突然瘫痪,无法正常工作。北亚企安数据恢复工程师去现场对故障服务器进行了检测,发现故障服务器raid5阵列中有一块硬盘由于未知原因离线,服务器中存放重要数据的分区无法识别。
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
126 0