Ich erhalte diesen Redis-Fehler, wenn ich versuche, meine Datenbank zu migrieren. Dies ist eine Discourse-Docker-Installation. Bitte helfen Sie mir.
Haben Sie eine 2-Container-Installation oder Redis woanders gehostet? Haben Sie Redis 6.2?
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.
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:
Ohhhh okay, vielen Dank! Ich werde das versuchen ![]()
Update
Für alle, die das in Zukunft benötigen könnten ![]()
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:
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.
