その他
    ホーム 技術発信 DoRuby ローカル環境で’LOADING Redis is loading the dataset in memory’が頻発する
    ローカル環境で’LOADING Redis is loading the dataset in memory’が頻発する
     

    ローカル環境で’LOADING Redis is loading the dataset in memory’が頻発する

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    表題の件についてのメモ

    背景

    • Rails アプリケーションのローカル開発環境を Docker で構築
    • その環境には Sidekiq の worker が稼働する、 worker コンテナ、Sidekiqがバックエンドとして使用している Redis が稼働している redis コンテナが存在する

    現象

    docker-compose によるコンテナの立ち上げ時、以下のエラーが発生して worker コンテナが落ちる

    worker           | LOADING Redis is loading the dataset in memory
    worker           | /app/vendor/bundle/ruby/2.5.0/gems/redis-4.0.3/lib/redis/client.rb:124:in `call'
    worker           | /app/vendor/bundle/ruby/2.5.0/gems/redis-4.0.3/lib/redis/client.rb:107:in `block in connect'
    (略)
    worker           | /app/vendor/bundle/ruby/2.5.0/gems/redis-4.0.3/lib/redis.rb:278:in `info'
    worker           | /app/vendor/bundle/ruby/2.5.0/gems/sidekiq-5.2.3/lib/sidekiq.rb:113:in `block in redis_info'
    worker           | /app/vendor/bundle/ruby/2.5.0/gems/sidekiq-5.2.3/lib/sidekiq.rb:95:in `block in redis'
    

    原因

    redisコンテナ起動時に --appendonly yes が指定されていた。

    LOADING Redis is loading the dataset in memory というエラーは、 AOF(Append-only File)からデータをメモリ上に展開している間に更新(SET)などのコマンドを実行しようとした際に発生するらしい。

    RDB/AOFファイルをローディングしている間、SETコマンドのようなものを実行すれば “(error)LOADING Redis is loading the dataset in memory”このようなエラーを出すが、infoコマンドは実行されます。 したがって、infoコマンドでローディング中なのか確認することができます。
    REDIS INFO [section] コマンド

    対処その1

    Append-only File は、プロセスの予期しない終了等からデータを保護するための機構であるが、ローカル開発環境においてはそのような考慮は不要(消えても構わない)ので、 --amendonly yes オプションを取り除く。

       redis:
         image: redis:latest
         ports:
           - 6379:6379
         volumes:
           - redis:/data
    -    command: redis-server --appendonly yes
    +    command: redis-server
    

    対処その2

    あるいは、ローカルで保持しているRedis内の情報が消えても構わないのであれば一旦 redis コンテナに割り当てている Volume を削除してあげるという方法もある。

    ただし、一時的なものなので AOF が肥大化するにつれていずれ問題が再発する。(と思われる)

    ボリュームを削除する手順は以下(コンテナを停止している状態で実施する)

    <ボリュームの一覧確認>
    docker volume ls
    
    <ボリューム削除>
    docker volume rm xxxxxx_redis
    記事を共有