أتلقى خطأ Redis هذا باستمرار عند محاولة ترحيل قاعدة البيانات الخاصة بي. هذا تثبيت Discourse Docker. من فضلكم ساعدوني.
هل لديك تثبيت من حاويتين أو Redis مستضاف في مكان آخر؟ هل لديك Redis 6.2؟
هذه هي نسخة Redis الخاصة بي 6.2.6 ولدي حاوية redis واحدة فقط في دوكر الخاص بي ثم عدد قليل من حاويات discourse_dev أيضًا.
لقد طلبت المساعدة على جانب sidekiq github أيضًا.
هذا ما يظهر عند التشغيل في حاوية docker الخاصة بي
d/bundle show redis
/Users/natashaselvidge/discourse/vendor/bundle/ruby/2.6.0/gems/redis-4.6.0
هذا هو ملف discourse_redis.rb الخاص بي
#
# A wrapper around redis that namespaces keys with the current site id
#
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
# Only use this if you want to store and fetch data that's shared between sites
@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
# prefix the key with the namespace
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
# Proxy key methods through, but prefix the keys with the namespace
[: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
إشعار إيقاف: تم تبديل enable_long_polling/long_polling_interval من إعدادات الموقع إلى الإعدادات العامة. قم بإزالة التجاوز من واجهة مستخدم إعدادات الموقع، واستخدم ملف تكوين أو متغيرات بيئة لتعيين الإعدادات العامة. (الإزالة في Discourse 2.9.0)
في /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`
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تجاهل /src/db/schema_cache.yml لأنه انتهت صلاحيته. إصدار المخطط الحالي هو 20220124003259، ولكن الإصدار الموجود في ذاكرة التخزين المؤقت هو 20211011123651.
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.
redis.multi do
redis.get("key")
end
يجب استبداله بـ
redis.multi do |pipeline|
pipeline.get("key")
end
(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إلغاء rake!
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
(انظر التتبع الكامل عن طريق تشغيل المهمة مع --trace)
natashaselvidge@Natashas-MacBook-Pro discourse %
يبدو أنك قمت بتحديث جوهرة Redis يدويًا في بيئة التطوير الخاصة بك من 4.5.1 إلى 4.6.0. لا يعمل Discourse مع إصدار الجوهرة هذا، لذا تحتاج إلى العودة إلى الإصدار الذي نستخدمه في ملف Gemfile.lock.
نحن نعمل على الانتقال في النهاية إلى redis-rb 4.6.0، ولكن هذا الكثير من العمل:
أوه حسناً، شكراً جزيلاً لك! سأجرب ذلك ![]()
تحديث
لمن قد يحتاج هذا في المستقبل ![]()
شكراً جزيلاً، لقد تم حل المشكلة! قمت بتحديث منصة discourse الخاصة بي، ولكن لم يتم تحديد الإصدار في ملف gem. أضفت رقم الإصدار في النهاية هكذا: gem ‘redis’, “~> 4.5.1”
نحددها في Gemfile.lock:
أعتقد أن ذلك بسبب أنني حذفت ملف Gemfile.lock وقمت بتجميعها. ثم كنت أتحدث مع الأشخاص الذين لديهم مشاكل مع redis و sidekiq على Github وكانوا يخبرونني أنه يجب أن أكون على الإصدار المحدث. شكراً مرة أخرى!
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
