A lua script causes master-slave data to be out of sync(redis version 3.2.8)
- Vorherrschende Sprache
- Go
- Sterne
- 13.2k
- Forks
- 2.7k
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
`eval "local flag = 0 local targetScore = redis.call('get', KEYS[1]) local currentCount = 0 if (not targetScore) then redis.call('set', KEYS[1], 0) if (ARGV[2] ~= nil and ARGV[2] ~= '') then redis.call('expire', KEYS[1], tonumber(ARGV[2])) end else currentCount = tonumber(targetScore) end local limitCount = tonumber(ARGV[1]) if (currentCount < limitCount or limitCount == 0) then currentCount = tonumber(redis.call('incr', KEYS[1])) flag = 1 end local ret = {} ret[1] = flag ret[2] = currentCount return ret" 1 lua_expire_test 1 -1`
1)When we executed the above lua script on version 3.2.8, we found the master-slave data inconsistent
**master : ttl lua_expire_test result: -1
slave : ttl lua_expire_test result: -2**
2)Then we try again and execute the `monitor `command on the slave
`1575463540.730292 [0 xx.xx.xx.xx:6380] "eval" "local flag = 0 local targetScore = redis.call('get', KEYS[1]) local currentCount = 0 if (not targetScore) then redis.call('set', KEYS[1], 0) if (ARGV[2] ~= nil and ARGV[2] ~= '') then redis.call('expire', KEYS[1], tonumber(ARGV[2])) end else currentCount = tonumber(targetScore) end local limitCount = tonumber(ARGV[1]) if (currentCount < limitCount or limitCount == 0) then currentCount = tonumber(redis.call('incr', KEYS[1])) flag = 1 end local ret = {} ret[1] = flag ret[2] = currentCount ret[3]=tonumber(ARGV[2]) return ret" "1" "lua_expire_test" "1" "-1"
1575463540.730380 [0 lua] "get" "lua_expire_test"
1575463540.730391 [0 lua] "set" "lua_expire_test" "0"
1575463540.730411 [0 lua] "expire" "lua_expire_test" "-1"
1575463540.730419 [0 lua] "incr" "lua_expire_test"`
There seems to be nothing wrong with the sync script.
Could you check whether this is expected behavior or an issue ? Thanks.
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Rechercherichtung
Beginne damit, das Lua EVAL-Skript gegen Redis 3.2.8 mit TTL-Prüfungen auf Master und Slave zu reproduzieren, und untersuche dann die MONITOR-Ausgabe des Slave auf GET, SET, EXPIRE und INCR. Ermittle, ob das TTL-Ergebnis -1 gegenüber -2 ein erwartetes Replikationsverhalten oder ein Redis-Fehler ist; erledigt ist die Aufgabe, wenn die Abweichung erklärt und eine konkrete Lösung oder ein Dokumentationsergebnis identifiziert wurde.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- lua, redis
- Bereich
- databases, distributed-systems
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 30/100