docker-compose中的Redis主从设置-只读从

时间:2019-08-29 18:54:48

标签: redis docker-compose master-slave

如何在docker-compose.yml中使Redis从站可写?

我有一个正在运行的Python脚本,如果由于以下错误而失败,该脚本将无法转移到从服务器:

  File "app.py", line 22, in <module>
    r.set(timestamp, num)
  File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 1519, in set
    return self.execute_command('SET', *pieces)
  File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 839, in execute_command
    return self.parse_response(conn, command_name, **options)
  File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 853, in parse_response
    response = connection.read_response()
  File "/usr/local/lib/python2.7/site-packages/redis/connection.py", line 717, in read_response
    raise response
redis.exceptions.ReadOnlyError: You can't write against a read only replica.

以下是正在使用的docker-compose.yml:

services:

  redis-master:
    container_name: redis-master
    image: redis:latest
    command: redis-server --port 6379
    ports:
      - "6379:6379"
    volumes:
      - .:/app

  redis-slave:
    container_name: redis-slave
    image: redis:latest
    command: redis-server --slaveof redis-master 6379
    volumes:
       - .:/app

从站的输出:

root@29b9b3919c4a:/data# redis-cli -p 6379 info replication
# Replication
role:slave
master_host:192.168.48.7
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:257149
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2705ce53eb2c7778f207f7626280ca0964dc87b1
master_replid2:8acb89aa40f8d7edc254eaed3ac197d08b808e82
master_repl_offset:257149
second_repl_offset:60757
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:60757
repl_backlog_histlen:196393

是否可以添加到docker-compose.yml以使从站可写?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

在redis.conf文件中,存在以下选项:replica-read-only yes

您需要更改该值以允许在奴隶上书写。

您可以配置副本实例以接受或不接受写入。写作 一个副本实例可能有助于存储一些临时数据 (因为重新同步后写入副本的数据很容易删除 与主管理员联系),但如果客户向 这是因为配置错误。自默认以来Redis 2.6 副本是只读的。注意:未设计只读副本 暴露给互联网上不受信任的客户。只是一个 防止滥用实例的保护层。仍然是只读的 副本默认情况下导出所有管理命令,例如 配置,调试等。在一定程度上您可以改善 使用'rename-command'隐藏所有副本的只读副本的安全性 行政/危险命令。