【问题标题】:AWS-EC2 Redis-server RDB snapshot write errorAWS-EC2 Redis-server RDB 快照写入错误
【发布时间】:2020-01-23 10:26:11
【问题描述】:

我有一个在 Laravel5.2 框架上运行的 Web 应用程序,会话驱动程序设置为 redis,并遵循 AWS 设置。

  • Instance-1:运行 Web 应用程序,在 .env 文件中使用 Redis 配置如下

    1. Redis 主机:aws-private-ip-of-instance-2
    2. Redis-密码:NULL
    3. Redis 端口:6379
  • Instance-2:使用以下配置运行的 Redis-server

    1. 绑定aws-private-ip-of-instance-2和127.0.0.1
    2. 工作目录/var/lib/redis 775权限,ower-group为redis。
    3. RDB快照名称dump.rdb,权限为660,ower-group为redis。

注意:在 AWS 中,端口 6379 的入站规则配置为 实例 2。

一切正常,直到 redis 尝试将数据写入 RDB 文件。前端显示以下错误。

MISCONF Redis 配置为保存 RDB 快照,但当前 无法在磁盘上持久化。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看 Redis 日志。

在 Redis 服务器的日志中,我得到了以下数据。

4873:M 23 Sep 10:08:15.028 * 1 changes in 900 seconds. Saving...
4873:M 23 Sep 10:08:15.028 * Background saving started by pid 7392
7392:C 23 Sep 10:08:15.028 # Failed opening .rdb for saving: Read-only file system
4873:M 23 Sep 10:08:15.128 # Background saving error

我尝试过的事情

  • 按照Redis-administraition-blog 中的建议,将vm.overcommit_memory = 1 添加到/etc/sysctl.conf
  • dump.rdb文件的路径更改为tmp文件夹并将权限更改为777

【问题讨论】:

    标签: amazon-web-services laravel-5 amazon-ec2 redis


    【解决方案1】:

    这个other Stack Exchange thread 可能会有所帮助,因为您正在使用自定义 /tmp 目录来存储数据:

    执行此操作的简单方法是运行systemctl edit redis。这将创建一个覆盖插入文件/etc/systemd/system/redis.service.d/override.conf,您可以在其中放置您的更改(以及适当的部分):

    [Service] ReadWriteDirectories=-/my/custom/data/dir

    您也可以手动创建该目录并将以.conf 结尾的文件放入其中。但不要将目录留空,因为这会禁用服务。

    在任何一种情况下,运行 systemctl daemon-reload 即可重新启动服务。

    许多线程还指出文件系统不一致是根本原因。由于您使用的是 EC2,请检查此AWS forums post

    要解决此问题,您必须:

    1. 停止实例

    2. 分离实例的根卷

    3. 将该卷作为数据卷附加到同一可用区中任何正在运行的 Linux 实例

    4. 对卷执行文件系统检查 (fsck) 并修复问题

    5. 分离卷并将其作为根卷附加回您的实例

    6. 启动实例并验证卷是否能够成功挂载

    作为最后的手段,尽可能终止实例。

    希望对你有帮助!

    【讨论】:

    • 好吧,我的整个文件系统并没有变成只读的,因为当出现这个错误时,将日志写入日志文件可以正常工作,没有问题。所以我认为这个问题与文件系统没有任何关系。只有 dump.rdb 文件由 redis 它自己创建的 redis 用户变为只读。
    • 用另一个可能的原因编辑。谢谢!
    • 我看到了您的编辑并阅读了您提供的建议线程。但这根本不是我的情况。我没有更改任何默认设置。我刚刚尝试在/tmp 文件夹中写入数据,但也无法正常工作。这就是我写THINGS I HAVE TRIED 部分的意思(但没用)。
    • 但是您是否将 /tmp 目录添加到了 ReadWriteDirectories 配置中?
    • 嘿@Fabio。我不必这样做,因为我保留了默认设置。当我更改它并尝试时,redis 最初工作正常,但一段时间后开始出现错误。所以我想说的是,即使在更改 .rdb 文件目录之后,问题仍然与默认设置相同。
    【解决方案2】:

    好吧,发布自己问题的答案非常尴尬,这是一个非常愚蠢的错误。但希望这里的新人也能从我的错误中吸取教训。

    • 所以我做的第一件事是通过将log_level 选项更改为debug,在/etc/redis/redis.conf 文件中启用redis-server 的详细日志。

    • 观察日志并了解我的 redis 端口 6379 对 Internet 上的所有人开放。

    所以从日志中我观察到其他人的服务器正在欺骗我的 redis 服务器并使其成为它的奴隶。由于我的 redis 服务器的配置方式为 slave 为 read-only,当我尝试访问我的 redis 服务器时,它会抛出只读错误。

    • 为redis服务器端口应用防火墙后,我再也没有遇到这个问题了。

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 2017-01-08
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 2016-02-15
      相关资源
      最近更新 更多