【问题标题】:Redis Slave Master connections fails Slave logs show: Unable to connect to MASTER: Permission deniedRedis Slave Master 连接失败 Slave 日志显示:Unable to connect to MASTER: Permission denied
【发布时间】:2016-01-20 17:04:30
【问题描述】:

我已按照有关如何设置 redis 主服务器集群的说明进行操作,但完成后我无法看到为什么服务器无法看到彼此。 这是我组装的第二个版本,我被困在同一个地方。我真的可以使用一些以前从未在 REDIS 上工作过的帮助,并且我可以使用一些指导。

使用 CENTOS7 Redis 版本

当我检查 redis 从属日志时,我得到以下信息

[20671] 1 月 12 日 15:48:02.369 * 连接到 MASTER 10.10.10.10:6379

[20671] 12 Jan 15:48:02.369 # 无法连接到 MASTER:权限被拒绝

配置文件对主服务器和从服务器使用相同的密码。 只是为了测试,我为 redis 工作目录文件和文件夹提供了默认目录完全控制权 经过测试的端口,它们工作正常,

我在连接到 REDIS Slave 时运行 INFO 时也会得到以下信息

Replication

role:slave
master_host:10.10.10.11.
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1452631759
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

来自主节点的信息:

Replication

role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

两台服务器都在 CENTOS 7 上运行

【问题讨论】:

    标签: redis centos7


    【解决方案1】:

    我在 AWS 的 CentOS 7 上设置 Redis 集群时遇到了同样的问题,实际上是由于启用了 SELinux。您可以通过检查/var/log/audit.log 的内容来验证这是您的问题。

    要允许使用 SELinux 进行 Redis 复制,请以 root 身份运行以下命令来更新安全策略。由于您可能会使用Sentinel 来管理集群,因此还包括Sentinel 主从的必要策略。

    政策文件的文件夹

    保存新策略文件的位置

    mkdir -p ~/.selinux
    

    Redis 复制策略

    允许将数据复制到从属,包括在主控上以及它可能在某个时候成为从属

    cat <<SELINUX > ~/.selinux/redis_repl.te
    # create new
    module redis_repl 1.0;
    
    require {
            type redis_port_t;
            type redis_t;
            class tcp_socket name_connect;
    }
    
    #============= redis_t ==============
    allow redis_t redis_port_t:tcp_socket name_connect;
    SELINUX
    
    checkmodule -m -M -o ~/.selinux/redis_repl.mod ~/.selinux/redis_repl.te
    semodule_package --outfile ~/.selinux/redis_repl.pp --module ~/.selinux/redis_repl.mod
    semodule -i ~/.selinux/redis_repl.pp
    

    Redis Sentinel Master/Slave Policy,所有 Redis 节点

    允许 Redis 主/从节点上的 Sentinel HA 流量

    cat <<SELINUX > ~/.selinux/redis_ha.te
    # create new
    module redis_ha 1.0;
    
    require {
            type etc_t;
            type redis_t;
            class file write;
    }
    
    #============= redis_t ==============
    allow redis_t etc_t:file write;
    SELINUX
    
    checkmodule -m -M -o ~/.selinux/redis_ha.mod ~/.selinux/redis_ha.te
    semodule_package --outfile ~/.selinux/redis_ha.pp --module ~/.selinux/redis_ha.mod
    semodule -i ~/.selinux/redis_ha.pp
    

    Redis Sentinel 服务器策略,所有 Sentinel 节点

    允许来自 Sentinel 节点的 Sentinel HA 流量。

    请注意,如果您不使用默认的 26379,您可能需要更改 Sentinel 端口。

    # Allow Sentinel Port
    semanage port -a -t redis_port_t -p tcp 26379
    
    # Allow Sentinel Server
    cat <<SELINUX > ~/.selinux/redis_sentinel.te
    # create new
    module redis_sentinel 1.0;
    
    require {
            type redis_port_t;
            type etc_t;
            type redis_t;
            class tcp_socket name_connect;
            class file write;
    }
    
    #============= redis_t ==============
    allow redis_t redis_port_t:tcp_socket name_connect;
    allow redis_t etc_t:file write;
    SELINUX
    
    checkmodule -m -M -o ~/.selinux/redis_sentinel.mod ~/.selinux/redis_sentinel.te
    semodule_package --outfile ~/.selinux/redis_sentinel.pp --module ~/.selinux/redis_sentinel.mod
    semodule -i ~/.selinux/redis_sentinel.pp
    

    重启 Redis 和 Sentinel

    service restart redis
    service restart redis-sentinel
    

    【讨论】:

      【解决方案2】:

      @otaviofcs 指出,您可能遇到了 SELinux 问题。如果您查看 /var/log/audit/audit.log,我怀疑您会看到很多类似这样的日志记录:

      type=AVC msg=audit(1465349491.812:28458): avc:  denied  { name_connect } for  pid=30676 comm="redis-server" dest=6379 scontext=system_u:system_r:redis_t:s0 tcontext=system_u:object_r:redis_port_t:s0 tclass=tcp_socket
      

      如果是这样,您可以深入了解 SELinux 策略管理,也可以采取简单的方法:将 SELinux 目标策略设置为许可:

      setenforce permissive
      

      请注意,您需要在 /etc/selinux/config 中设置相同的值,方法是将带有 SELINUX= 的行更改为 SELINUX=permissive

      【讨论】:

      • 我会建议“潜入肠道”而不是完全禁用它 - 安全......首先?有关设置 Redis 复制所需的 selinux 策略的正确方法,请参阅我的答案。
      • 同意。这就是我对“走简单的路”的含义。
      【解决方案3】:

      两个“新经验值” 配置在连接的两端,

      要添加“个性化”端口,您可以使用 semanage sudo semanage port -a -t redis_port_t -p tcp 8014

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-06
        • 2011-11-17
        • 2021-03-27
        • 2014-12-17
        • 2018-07-09
        • 1970-01-01
        • 2017-11-09
        • 2013-09-22
        相关资源
        最近更新 更多