参考地址: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镜像

  1. docker pull redis:4.0.8
  1. docker pull ruby

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

redis和ruby就是redis cluster所有工具

2.搭建redis cluster环境

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

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

  1. touch redis-cluster.tmpl

编辑新创建的文件

  1. vi redis-cluster.tmpl

编辑文件进入后

i 进行插入操作

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

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

复制完成,esc退出,

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

操作完成查看文件内容:

  1. cat redis-cluster.tmpl

2.2  创建自定义的network

还是在该目录下

执行命令

  1. 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.问题

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

效果如下:

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

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

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

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

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

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

  1. rm -rf 文件夹名

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

  1. rm -rf 7000

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

2.3  创建6个redis容器

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

  1. for port in `seq 7000 7005`; do \
  2. docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
  3. -v /apps/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  4. -v /apps/redis-cluster/${port}/data:/data \
  5. --restart always --name redis-${port} --net redis-net \
  6. --sysctl net.core.somaxconn=1024 redis:4.0.8 redis-server /usr/local/etc/redis/redis.conf; \
  7. 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容器的脚本

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

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

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

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

  1. echo yes | docker run -i --rm --net redis-net ruby sh -c '\
  2. gem install redis && wget http://download.redis.io/redis-stable/src/redis-trib.rb && ruby redis-trib.rb create --replicas 1 \
  3. '"$(for port in `seq 7000 7005`; do \
  4. echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; \
  5. 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文件中的配置】

  1. #是否开启保护模式,默认开启。要是配置里没有指定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配置文件详细配置说明

【docker】【redis】2.docker上设置redis集群---Redis Cluster部署【集群服务】【解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题】【Waiting for the cluster to join...问题】的更多相关文章

  1. 解决ASP.NET中Redis 每小时6000次访问请求的问题

    原文:解决ASP.NET中Redis 每小时6000次访问请求的问题 虽然ServiceStack v4是商业支持的产品,但我们也允许免费使用小型项目和评估目的.上面的NuGet包中包含可以使用许可证 ...

  2. 【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志

    如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动 ...

  3. 【GitLab】gitlab上配置webhook后,点击测试报错:Requests to the local network are not allowed

    gitlab上配置webhook后,点击测试报错: Requests to the local network are not allowed 操作如下: 报错: 错误原因: gitlab 10.6 ...

  4. 034-openstack中虚拟机启动后主机名设置问题

    openstack中虚拟机启动后主机名设置问题,在centos7中设置hostname后怎么都是原来的hostname,根本无效. 方法一: 在centos7中除了修改hosts文件和network文 ...

  5. MFC中窗口启动后,CEdit编辑框默认光标位置设置,顺序的调节方法

    MFC中窗口启动后,CEdit编辑框默认光标位设置,顺序的调节方法 在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.数值1就是默认停留 ...

  6. LAMP集群项目五 部署NFS存储服务并设置WEB服务挂载

    yum install nfs-utils portmap -y 在centos6.5中portmap已经改为rpcbind 先启动rpcbind /etc/init.d/rpcbind start ...

  7. etcd启动报错:couldn't find local name "default" in the initial cluster configuration

    启动etcd的时候报错: # systemctl restart etcd Job for etcd.service failed because the control process exited ...

  8. docker学习笔记(6)——docker场景问题汇总(centos7 由于内核版本低带来的一系列问题,docker彻底卸载,安装、启动日志报错分析)

    参考资料: https://nachuan.blog.csdn.net/article/details/96041277 https://www.cnblogs.com/xzkzzz/p/962765 ...

  9. docker 无法启动容器,run容器后状态为restarting

    问题:如题,无法进入容器,docker logs 容器id  发现 哦 ,原来缺少个文件,这些就容易了

随机推荐

  1. 16:django 有条件的视图处理(Last-Modified和ETag)&&加密签名

    有条件的视图处理 上一节我们介绍了缓存来减轻服务器的负担,这里的有条件的视图处理也从一定程度上减轻了服务器的负担,在正式介绍之前,先来看两个概念:Last-Modified和ETag Last-Mod ...

  2. centos安装VNC的方法

    https://help.aliyun.com/knowledge_detail/6698160.html(阿里云官方文档,但是官方文档有些地方是错的,我更正了下) ----------------- ...

  3. 高性能网络服务器--I/O复用 select poll epoll_wait之间的区别

    一.select select采用的是集合的方式,最多只能访问1024个套接字.可读,可写,异常,三种访问,并且采用的是轮训的方式进行每次访问都需要从内核向用户空间拷贝 二.poll poll采用的是 ...

  4. Visual Studio Code 相关设置

    Visual Studio Code 编译 SASS 到 CSS : 1.安装node 环境 2.Ctrl + Shift + ~,打开终端窗口 cd 到 SASS 文件目录,node-sass Te ...

  5. 5.Spark Streaming流计算框架的运行流程源码分析2

    1 spark streaming 程序代码实例 代码如下: object OnlineTheTop3ItemForEachCategory2DB { def main(args: Array[Str ...

  6. jQuery插件开发,jquery插件

    关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...

  7. Python 一条语句如何在多行显示的问题

    在做python学习的时候,我照着pdf,敲代码,遇到一大难题: return render_to_response('index.html',{'title':'my page','user':us ...

  8. Java数组(int为例)

    Java数组(int为例) 定义:相同数据类型的数据的组合,是一种引用类型,是一个对象,存在堆里. 数组初始化:int[] scores1 = new int[]{72,90,59};//静态初始化: ...

  9. What is Double Spending & How Does Bitcoin Handle It?

    https://coinsutra.com/bitcoin-double-spending/ Bitcoin is gaining rapid popularity and adoption acro ...

  10. UML动态模型(顺序图、协作图、状态图)

    顺序图:用来表示用例中的行为顺序,当执行一个用例行为时,顺序图中的每条信息 对应了一个类操作或状态机中引起转换的事件.顺序图展示对象之间的交互,这些交互是指在场景或用例的时间六中发生的,顺序图属于动态 ...