zoukankan      html  css  js  c++  java
  • 【docker】【redis】2.docker上设置redis集群---Redis Cluster部署【集群服务】【解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题】【Waiting for the cluster to join...问题】

    参考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html

    https://www.cnblogs.com/cxbhakim/p/9151720.html

    https://blog.csdn.net/qq442270636/article/details/79254240/

    承接上一篇,【docker】【redis】1.docker安装redis【单点redis服务】

    1.docker上拉取了redis镜像后,再从docker资源库获取ruby镜像

    docker pull redis:4.0.8
    docker pull ruby

    此时docker容器中的镜像有【mysql与此无关】

    redis和ruby就是redis cluster所有工具

    2.搭建redis cluster环境

    2.1 在根目录创建apps/目录,在apps目录下创建redis-cluster 目录

     进入新创建的redis-cluster目录下,创建一个文件redis-cluster.tmpl

    touch redis-cluster.tmpl

    编辑新创建的文件

    vi redis-cluster.tmpl

    编辑文件进入后

    i 进行插入操作

    复制一下文件内容到文件中【红字部分需要添加,否则会引起3中最后的问题Waiting for the cluster to join...

    port ${PORT}
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    cluster-announce-ip 39.10X.XX.XX //自己服务器IP
    cluster-announce-port ${PORT}
    cluster-announce-bus-port 1${PORT}
    appendonly yes

    复制完成,esc退出,

    输入 :wq保存并退出vim编辑器

    操作完成查看文件内容:

    cat redis-cluster.tmpl

    2.2  创建自定义的network

    还是在该目录下

    执行命令

    docker network create redis-net

    OK

    2.3  在/apps/redis-cluster下生成conf和data目标,并生成配置信息

    直接执行脚本, 在redis-cluster目录下生成conf和data目标,并生成配置信息【注意,此处生成配置信息后,配置内容中未指定确切端口,仍然是${port},因此需要修改配置文件指定端口,详情请查看2.4》解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题

    for port in `seq 7000 7005`; do 
      mkdir -p ./${port}/conf  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf  && mkdir -p ./${port}/data; 
    done

    效果如下:

    粘贴脚本后,点击回车,执行完成后,

    输入 ls -al命令,查看已经创建成功7000-7005文件夹以及内部的配置

    共生成6个文件夹,从7000到7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件

    ================================如果没有出错,此段忽略--START========================================

     如果创建出错,可以使用删除文件夹命令进行递归删除操作

    centOS 删除文件夹命令【删除文件夹以及文件夹下所有的内容】

    rm -rf 文件夹名

     例如: 在当前目录下删除 文件夹7000以及文件夹下所有的文件和目录

    rm -rf 7000

     =================================如果没有出错,此段忽略--END=======================================

    2.3  创建6个redis容器

    跟上一步一样,直接复制脚本  并执行,创建6个redis容器

    for port in `seq 7000 7005`; do 
      docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} 
      -v /apps/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf 
      -v /apps/redis-cluster/${port}/data:/data 
      --restart always --name redis-${port} --net redis-net 
      --sysctl net.core.somaxconn=1024 redis:4.0.8 redis-server /usr/local/etc/redis/redis.conf; 
    done

    效果如下:

    执行 docker ps命令,查看创建的redis6个容器的运行情况

    然后会发现,所有的redis启动容器的状态都是Restarting 状态。【如果所有的状态都是Up状态,则直接跳过本问题的处理】

    并且使用桌面工具测试连接 连接不上。

       2.4》解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题

    要解决上面的问题

    是因为7000-7005目录下生成的conf目录下的redis.conf文件中的配置并未完善,分别修改${PORT}修改为对应的具体端口

    原本配置文件中的内容:

    修改后的文件内容:

    修改完成后,

    分别 停止并移除 redis容器

    然后重新执行启动redis容器的脚本

    for port in `seq 7000 7005`; do 
      docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} 
      -v /apps/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf 
      -v /apps/redis-cluster/${port}/data:/data 
      --restart always --name redis-${port} --net redis-net 
      --sysctl net.core.somaxconn=1024 redis:4.0.8 redis-server /usr/local/etc/redis/redis.conf; 
    done

    此时可以使用Redis Desktop Manager这个redis桌面工具连接测试是否可以连接成功

     3.最后 ,通过启动ruby来实现集群

     跟上一步一样,粘贴脚本后,回车执行脚本

    echo yes | docker run -i --rm --net redis-net ruby sh -c '
      gem install redis && wget http://download.redis.io/redis-stable/src/redis-trib.rb  && ruby redis-trib.rb create --replicas 1 
      '"$(for port in `seq 7000 7005`; do 
        echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; 
      done)"

    效果如下:

     

     最后依旧没有解决

     Waiting for the cluster to join.............................................................................................................................................................................

    的问题,即使加了protected-mode no 属性也没有解决!!!!

    =============================================问题Waiting for the cluster to join..问题 暂未解决========================================================

    如果未在最开始的redis-cluster.tmpl文件中,未配置属性

    【同样,这个配置文件会在创建7000-7005目录时将文件中的配置同步复制到这几个目录下的conf目录中的redis.conf文件中,因此如果redis-cluster.tmpl文件中未配置,则还需要修改这几个目录下的所有redis.conf文件中的配置】

    #是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码   和bind,可以开启。否   则最好关闭,设置为no。
    protected
    -mode no

    那么如果未写本属性,则默认为yes开启保护模式,则会导致下面的Waiting for the cluster to join..问题

     解决方法:

    就是上面说的,分别在redis.conf文件中加上属性【protected-mode no】

    同时,

    还应该停止并删除所有的redis容器,

    当然,如果走到这一步了,说明ruby也启动了,所以ruby容器也应该停止

    补充完善redis.conf中的属性后,重新批量启动redis容器。

     =========================================问题:Node 172.20.0.3:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0=======================

    在执行第3点,启动ruby来实现集群的脚本后,出现这个问题

    参考地址:https://blog.csdn.net/vtopqx/article/details/50235737

    第一步:

    删除7000-7005每个目录下的data目录下的.aof和nodes.conf文件 还有.rdb后缀的文件(网上方法有第三个文件,我这里暂时没有)

     

    第二步:使用桌面文件分别连接7001-7005

    然后指定flushdb,清除数据库中的键

    第三步:非常重要,就是执行完成第二步以后,就依次关闭移除所有redis容器并重启所有的redis容器,否则就算你执行脚本也一定不会成功

    第四步:重新执行启动ruby来实现集群的脚本即可!!

    =====================================================================================

    参考文档 :

    redis 3.0配置文件详细配置说明

  • 相关阅读:
    我要翻译《Think Python》- 004 第二章 变量, 表达式和语句
    我要翻译《Think Python》-003 第一章 编程之道
    我要翻译《Think Python》-002 贡献列表 & 目录部分
    我要翻译《Think Python》
    ORA-12514 解决方法
    好玩的东西
    sublime HtmlPrettify
    [转]bing壁纸天天换 初识shell魅力
    nginx+lua+redis 处理APK包替换
    算法整理
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/9525160.html
Copyright © 2011-2022 走看看