主要观点:展示如何使用 S3 实现持久、分布式且高可用的日志,该系列文章的第三部分,代码开源且有测试和待解决问题。
关键信息:
- 日志是数据和事件流系统的核心,可用于构建数据库等系统。
- 使用 S3 作为日志的原因,如弹性可扩展、无需自建分布式存储服务器、无运维开销、成本低等。
- 定义了日志的接口,包括 Append(写入)和 Read(读取)操作。
- 在 Append 操作中通过 S3 条件写入防止两个写入者写入相同偏移量,且考虑不允许间隙以简化排序。
- 为保证数据完整性使用 SHA-256 计算校验和并存储在日志中。
- 实现了 Failover / Crash Recovery 机制,通过遍历 S3 存储桶中的对象找到最后插入的对象来恢复。
重要细节: S3WAL
结构体用于维护 S3 日志相关操作,包含 S3 客户端、存储桶名称和长度计数器。- 在 Append 操作中,根据长度计数器生成唯一的 S3 对象键并写入数据,若写入失败则返回错误。
- Read 操作根据给定偏移量构建 S3 对象名并读取数据,进行多项验证确保数据完整性。
- LastRecord 方法通过遍历 S3 存储桶中的对象找到最后插入的对象,更新长度计数器。
- 项目开源地址为https://github.com/avinassh/s3-log,有多个待解决的问题如improving LastRecord等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。