使用Redis和DjangoCannels的Django应用程序中出现只读错误

xcitsw88  于 2022-10-31  发布在  Redis
关注(0)|答案(1)|浏览(148)

我有一个Django应用程序使用DjangoChannels,Djangochannelrestframework。它建立了一个与ReactJS前端的WebSocket连接。作为通道层,我使用Redis这样的

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("redis", 6379)],
        },
    },
}

Redis和Django在docker中运行。我的redis docker设置是

redis:
    image: "redis:7.0.4-alpine"
    command: redis-server
    ports:
      - "6379:6379"
    networks:
      - nginx_network

当我在生产服务器上运行我的应用程序时,一切都工作了5-8个小时。但在这段时间之后,如果Django应用程序试图通过ws发送消息,如果福尔斯错误

ReadOnlyError at /admin/operations/operation/add/
READONLY You can't write against a read only replica.
Request Method: POST
Request URL:    http://62.84.123.168/admin/operations/operation/add/
Django Version: 3.2.12
Exception Type: ReadOnlyError
Exception Value:    
READONLY You can't write against a read only replica.
Exception Location: /usr/local/lib/python3.8/site-packages/channels_redis/core.py, line 673, in group_send
Python Executable:  /usr/local/bin/python
Python Version: 3.8.13
Python Path:    
['/opt/code',
 '/usr/local/bin',
 '/usr/local/lib/python38.zip',
 '/usr/local/lib/python3.8',
 '/usr/local/lib/python3.8/lib-dynload',
 '/usr/local/lib/python3.8/site-packages']
Server time:    Tue, 02 Aug 2022 08:23:18 +0300

我知道它与Redis复制有关,但不知道为什么一段时间后会福尔斯,以及如何修复它

mwkjh3gx

mwkjh3gx1#

我遇到了同样的错误,可能的解决方案是here
通过在docker中添加命令修复并禁用replica-read-only配置,将此添加到您的redis docker compose中
using​redis-cli > config get replica-read-only
那么您可以尝试验证只读副本是否为disable using​redis-cli > config get replica-read-only 命令,如果结果为否,则禁用成功。

相关问题