文件的断电可靠性保证

文件的断电可靠性保证
author:bripengandre    Email:bripengandre@126.com

一.背景

   最近参与开发的一个嵌入式设备对系统的稳定性、可靠性和可恢复性提出了较高的要求。特别地,有这些问题要考虑:当系统在更新关键文件(如内核)时突然断电,能否让系统重启后恢复到断电前瞬间的状态?如果不能恢复到断电前瞬间的状态,那能否恢复到最近的一次正确配置,让系统不致于死机?

二.问题的提出

    可靠性和可恢复性难以保证的一个原因是,在一般的操作系统用户空间写文件到存储设备,要经历如下的一个过程:用户空间文件缓冲(如果用了标准IO)-->内核文件缓冲-->内核输出到存储设备的输出缓冲-->存储设备,只要全过程中的任一环节出了问题,可靠性等就难以保证。上述各环节彼此之间是非阻塞的,前一环节不必等后一环节完成就可成功返回。例如fwrite并fflush了文件内容到了内核文件缓冲,并不能保证这些内容已进入了内核的输出缓冲,按照APUE上的说法,为了提高读写效率,内核文件缓冲到内核输出缓冲一般要延迟(一般是30s),这是一个延迟写的过程。

三.问题的解决

   分析市面上已有的设备及他人的文章,发现有如下几种策略(策略可组合运用)。

3.1 可靠性保证(保证文件在断电前后一致)

    严格的可靠性保证。这只能通过硬件保证,例如提供一个UPS电源(不间断电源),系统突然断电时,UPS提供续电并给操作系统一个中断,让操作系统启动一个清理服务例程来保证可靠性。
    准可靠性保证。一般的商用嵌入式系统因成本等原因是不可能备有UPS电源的,这就只能通过软件来近似保证了,原则上只要减少文件的更新所用的时间,根据随机性原理,更新过程中突然断电的概率就会变小。对于小文件,更新速度的最大瓶颈一般在内核文件缓冲到内核输出缓冲这一步,所以一般都在fflush文件后,就调用fsync来加速文件输出到内核输出缓冲,当然这些是以牺牲效率为代价的。

3.2 可恢复性(出错时能回滚到一个正确的中间状态)

    硬件复位。提供一个硬件按钮,供复位到出厂配置或最近的一次配置,如很多电子词典就有一个复位孔。硬件复位的优点是任何时候都能“一键还原”,缺点是实现比较难。考虑一个嵌入式linux的启动过程,有如下几步:bootloader(相当于PC上的BIOS+GRUB)-->内核-->应用程序一个完整的硬件复位应能做到对这三步的硬复位,即必须校验上述三者的正确性,然后作出相应的响应,例如在bootloader层或内核层出了问题,我们执行文件恢复操作就得在NONOS下进行的,即实现裸文件操作(raw ops)。所幸的是,很多时候,我们一般只会更新应用程序,这个时候在强大的操作系统下,我们可以轻松地为所欲为。
   软件复位。软硬件复位的区别是复位触发点不同,软件复位的触发点是软件自检,而硬复位的触发点一般是硬件中断。对于无人看管的设备,硬件中断无从触发,这时候就必须有软件自检复位了。还是以前面提到的嵌入式linux启动过程为例
只要这三者在自己启动时都进行自检如果自检出错就回滚到冗余备份的老版本(对存储有点小挑战)则可恢复性就几乎perfect了至于如何自检最简单的就是文件完整性和安全性保证了这些在信息安全里面讲的多了实际中,一般只检查完整性可以对每个文件生成一个校验文件(如md5或pgp)自检时发现新文件校验不正确使用备份的老文件就可以了当然了这里有个鸡和蛋的问题了自检的启动也是代码过程如果自检代码都破坏了...振作一点,要做到自检代码不破坏让它只读就行了例如在应用程序层你完全可以写一个永远正确并永不更新的只读程序这个程序用来启动其它可能会被更新的应用程序

   最后本文只是个人的一点看法欢迎大家提出其它好的建议

  

 

### EMQX 中确保消息可靠性的机制和方法 EMQX 是一种高效的 MQTT 消息中间件,广泛应用于物联网领域。为了确保消息传递的可靠性,EMQX 借助了 MQTT 协议的核心特性,并在其基础上进行了优化和扩展。 #### 1. QoS (Quality of Service) 支持 MQTT 协议提供了三种不同的服务质量级别(QoS),分别对应不同的可靠性需求[^2]: - **QoS 0**: 至多一次交付(At Most Once)。这种级别的消息可能不会被成功投递给订阅者,适用于对可靠性要求较低的场景。 - **QoS 1**: 至少一次交付(At Least Once)。在这种模式下,消息会被确认已送达目标节点,但如果发生重传,则可能导致重复消息的情况。 - **QoS 2**: 只有一次交付(Exactly Once)。这是最高级别的服务保障,能够确保每条消息仅被接收端处理一次,即使在网络不稳定的情况下也不会丢失或重复。 通过配置合适的 QoS 层次,开发者可以根据实际业务需求调整消息传输过程中的性能与可靠性平衡。 #### 2. 长连接与心跳机制 EMQX 利用了 MQTT 的长连接特性和心跳包技术来维持稳定的客户端-服务器关系[^2]。具体来说: - 客户端与 broker 维护一条持续存在的 TCP 连接通道; - 如果一段时间内未有任何数据交互活动,则双方会定期发送 PINGREQ 和 PINGRESP 数据帧作为健康检查信号; - 若某一方未能及时响应另一方发出的心跳请求,则认为当前链接失效并将触发重新连接逻辑。 此策略有效减少了因短暂网络波动而导致的服务中断风险,从而提高了整个系统的健壮性。 #### 3. 持久化存储能力 对于那些需要长期保存或者离线状态下仍需访问的信息而言,仅仅依靠内存缓存显然不足以满足所有情况下的恢复需求。因此,在必要时还可以启用磁盘文件系统来进行更长久的数据保留操作: 当启用了 session persistence 功能之后,即便设备暂时掉线甚至完全断电重启后再上线也能继续从前的状态出发而无需担心重要资料遗失问题的发生 。 此外还有 message store component ,它允许我们将某些特定条件匹配上的 payload 存入外部数据库当中以便后续查询分析之用 [^1]. #### 4. 用户认证与授权控制 安全性同样是构建稳定可靠的通讯基础设施不可或缺的一部分内容之一。为此 , EMQ X 不仅内置了多种身份验证方式(如 username/password pair 或 JWT token etc.) 来防止非法接入尝试; 同时也支持细粒度的角色划分以及资源访问权限管理方案, 确保只有经过许可的操作才能被执行出来 [^3]. 综上所述,借助上述提到的各项关键技术手段组合运用起来共同作用之下形成了如今强大而又灵活易用的消息传递框架解决方案——即所谓的 “EMQ X”。 ```bash # 查看 EMQX 当前运行状况命令示例 ./bin/emqx_ctl status Node 'emqx@127.0.0.1' is started emqx v4.0.0 is running ``` 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值