Redis Fehler nach Update

Ich erhalte diesen Redis-Fehler, wenn ich versuche, meine Datenbank zu migrieren. Dies ist eine Discourse-Docker-Installation. Bitte helfen Sie mir.

1 „Gefällt mir“

Haben Sie eine 2-Container-Installation oder Redis woanders gehostet? Haben Sie Redis 6.2?

2 „Gefällt mir“

Dies ist meine Redis-Version 6.2.6 und ich habe nur einen Redis-Container in meinem Docker und dann noch ein paar Discourse_dev-Container.

2 „Gefällt mir“

Ich habe auch auf der Sidekiq-GitHub-Seite um Hilfe gebeten.

Das kommt heraus, wenn ich in meinem Docker-Container ausführe
d/bundle show redis

/Users/natashaselvidge/discourse/vendor/bundle/ruby/2.6.0/gems/redis-4.6.0

Hier ist meine discourse_redis.rb-Datei

#
#  Ein Wrapper um Redis, der Schlüssel mit der aktuellen Site-ID versieht
#

class DiscourseRedis
  def self.raw_connection(config = nil)
    config ||= self.config
    Redis.new(config)
  end

  def self.config
    GlobalSetting.redis_config
  end

  def initialize(config = nil, namespace: true)
    @config = config || DiscourseRedis.config
    @redis = DiscourseRedis.raw_connection(@config.dup)
    @namespace = namespace
  end

  def without_namespace
    # Nur verwenden, wenn Sie Daten speichern und abrufen möchten, die zwischen Websites gemeinsam genutzt werden
    @redis
  end

  def self.ignore_readonly
    yield
  rescue Redis::CommandError => ex
    if ex.message =~ /READONLY/
      Discourse.received_redis_readonly!
      nil
    else
      raise ex
    end
  end

  # Präfix des Schlüssels mit dem Namespace versehen
  def method_missing(meth, *args, **kwargs, &block)
    if @redis.respond_to?(meth)
      DiscourseRedis.ignore_readonly { @redis.public_send(meth, *args, **kwargs, &block) }
    else
      super
    end
  end

  # Schlüsselmethoden weiterleiten, aber die Schlüssel mit dem Namespace präfixieren
  [:append, :blpop, :brpop, :brpoplpush, :decr, :decrby, :expire, :expireat, :get, :getbit, :getrange, :getset,
   :hdel, :hexists, :hget, :hgetall, :hincrby, :hincrbyfloat, :hkeys, :hlen, :hmget, :hmset, :hset, :hsetnx, :hvals, :incr,
   :incrby, :incrbyfloat, :lindex, :linsert, :llen, :lpop, :lpush, :lpushx, :lrange, :lrem, :lset, :ltrim,
   :mapped_hmset, :mapped_hmget, :mapped_mget, :mapped_mset, :mapped_msetnx, :move, :mset,
   :msetnx, :persist, :pexpire, :pexpireat, :psetex, :pttl, :rename, :renamenx, :rpop, :rpoplpush, :rpush, :rpushx, :sadd, :scard,
   :sdiff, :set, :setbit, :setex, :setnx, :setrange, :sinter, :sismember, :smembers, :sort, :spop, :srandmember, :srem, :strlen,
   :sunion, :ttl, :type, :watch, :zadd, :zcard, :zcount, :zincrby, :zrange, :zrangebyscore, :zrank, :zrem, :zremrangebyrank,
   :zremrangebyscore, :zrevrange, :zrevrangebyscore, :zrevrank, :zrangebyscore,
   :dump, :restore].each do |m|
    define_method m do |*args, **kwargs|
      args[0] = "#{namespace}:#{args[0]}" if @namespace
      DiscourseRedis.ignore_readonly { @redis.public_send(m, *args, **kwargs) }
    end
  end

  def exists(*args)
    args.map! { |a| "#{namespace}:#{a}" } if @namespace
    DiscourseRedis.ignore_readonly { @redis.exists(*args) }
  end

  def exists?(*args)
    args.map! { |a| "#{namespace}:#{a}" } if @namespace
    DiscourseRedis.ignore_readonly { @redis.exists?(*args) }
  end

  def mget(*args)
    args.map! { |a| "#{namespace}:#{a}" }  if @namespace
    DiscourseRedis.ignore_readonly { @redis.mget(*args) }
  end

  def del(*keys)
    DiscourseRedis.ignore_readonly do
      keys = keys.flatten(1)
      keys.map! { |k| "#{namespace}:#{k}" } if @namespace
      @redis.del(*keys)
    end
  end

  def scan_each(options = {}, &block)
    DiscourseRedis.ignore_readonly do
      match = options[:match].presence || '*'

      options[:match] =
        if @namespace
          "#{namespace}:#{match}"
        else
          match
        end

      if block
        @redis.scan_each(**options) do |key|
          key = remove_namespace(key) if @namespace
          block.call(key)
        end
      else
        @redis.scan_each(**options).map do |key|
          key = remove_namespace(key) if @namespace
          key
        end
      end
    end
  end

  def keys(pattern = nil)
    DiscourseRedis.ignore_readonly do
      pattern = pattern || '*'
      pattern = "#{namespace}:#{pattern}" if @namespace
      keys = @redis.keys(pattern)

      if @namespace
        len = namespace.length + 1
        keys.map! { |k| k[len..-1] }
      end

      keys
    end
  end

  def delete_prefixed(prefix)
    DiscourseRedis.ignore_readonly do
      keys("#{prefix}*").each { |k| Discourse.redis.del(k) }
    end
  end

  def reconnect
    @redis._client.reconnect
  end

  def namespace_key(key)
    if @namespace
      "#{namespace}:#{key}"
    else
      key
    end
  end

  def namespace
    RailsMultisite::ConnectionManagement.current_db
  end

  def self.new_redis_store
    Cache.new
  end

  private

  def remove_namespace(key)
    key[(namespace.length + 1)..-1]
  end

  class EvalHelper
    def initialize(script)
      @script = script
      @sha1 = Digest::SHA1.hexdigest(script)
    end

    def eval(redis, *args, **kwargs)
      redis.evalsha @sha1, *args, **kwargs
    rescue ::Redis::CommandError => e
      if e.to_s =~ /^NOSCRIPT/
        redis.eval @script, *args, **kwargs
      else
        raise
      end
    end
  end
end
natashaselvidge@Natashas-MacBook-Pro discourse % d/rake db:migrate
Hinweis auf veraltete Funktion: enable_long_polling/long_polling_interval wurde von Site-Einstellungen auf globale Einstellungen umgestellt. Entfernen Sie die Überschreibung aus der Site-Einstellungen-Benutzeroberfläche und verwenden Sie eine Konfigurationsdatei oder Umgebungsvariablen, um die globalen Einstellungen festzulegen. (Entfernung in Discourse 2.9.0)
Bei /usr/local/lib/ruby/gems/2.7.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:48:in `load`
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Ignoriere /src/db/schema_cache.yml, da es abgelaufen ist. Die aktuelle Schemanummer ist 20220124003259, aber die im Cache ist 20211011123651.
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
Das Pipelining von Befehlen auf einer Redis-Instanz ist veraltet und wird in Redis 5.0.0 entfernt.

redis.multi do
  redis.get("key")
end

sollte ersetzt werden durch

redis.multi do |pipeline|
  pipeline.get("key")
end

(aufgerufen von /src/lib/discourse_redis.rb:42:in `public_send')
rake abgebrochen!
Redis::CommandError: ERR unknown command `synchronize`, with args beginning with:
/src/lib/distributed_mutex.rb:84:in `try_to_get_lock'
/src/lib/distributed_mutex.rb:61:in `get_lock'
/src/lib/distributed_mutex.rb:30:in `block in synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:14:in `synchronize'
/src/lib/tasks/db.rake:210:in `block in <main>'
Tasks: TOP => db:migrate
(Vollständige Spur durch Ausführen der Aufgabe mit --trace anzeigen)
natashaselvidge@Natashas-MacBook-Pro discourse %

Es sieht so aus, als hätten Sie das Redis-Gem in Ihrer Entwicklungsumgebung manuell von 4.5.1 auf 4.6.0 aktualisiert. Discourse funktioniert nicht mit dieser Gem-Version, daher müssen Sie zur Version zurückkehren, die wir in der Gemfile.lock-Datei verwenden.

Wir arbeiten daran, irgendwann auf redis-rb 4.6.0 umzusteigen, aber das ist viel Arbeit:

4 „Gefällt mir“

Ohhhh okay, vielen Dank! Ich werde das versuchen :folded_hands:t3:

1 „Gefällt mir“

Update
Für alle, die das in Zukunft benötigen könnten :hugs:
Vielen Dank, das hat es behoben! Ich habe mein Discourse aktualisiert, aber die Version war nicht in der Gem-Datei angegeben. Ich habe die Versionsnummer am Ende hinzugefügt, so: gem ‘redis’, “~> 4.5.1”

Wir geben es in der Gemfile.lock an:

1 „Gefällt mir“

Ich glaube, weil ich meine Gemfile.lock gelöscht und gebündelt habe. Dann habe ich mit den Jungs von Redis und Sidekiq auf Github über die Probleme gesprochen und sie sagten mir, ich müsse auf der aktualisierten Version sein. Nochmals vielen Dank!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.