zoukankan      html  css  js  c++  java
  • 使用DockerCompose搭建Redis集群

    一、安装Docker Compose

    1.下载docker-compose,我这里选择1.25.5这个版本

    sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    2.下载好之后,设置权限

    sudo chmod +x /usr/local/bin/docker-compose
    

    3.检测是否安装成功

    docker-compose --version
    

    出现下图则表示安装成功

    二、Redis镜像

    1.下载redis镜像,我这里选择5.0.3

    docker pull redis:5.0.3
    

    2.查看镜像

    docker image ls -a
    

    三、准备容器挂载的目录

    1.创建根目录

    mkdir /docker/redis
    

    2.创建容器目录,我这里采用3主1从的方式。端口分别为7001-7006。然后创建给每个节点创建对应的目录和配置文件

    mkdir 700{1..6}
    mkdir 700{1..6}/data
    mkdir 700{1..6}/config
    touch 700{1..6}/config/redis.config
    

    四、准备配置文件

    1.将redis.config解压后,复制到各个节点的config下

    五、准备docker-compose.yml

    vi docker-compose.yml
    

    然后按键盘i,进入输入模式
    复制以下内容:

    version: '3'
    
    services:
     redis1:
      image: redis:5.0.3
      restart: always  
      volumes:
       - /docker/redis/7001/config/redis.conf:/etc/redis/redis.conf
       - /docker/redis/7001/data:/data
      environment:
       - TZ=Asia/Shanghai
       - LANG=en_US.UTF-8
      ports:
        - '7001:6379'     #服务端口
        - '17001:16379'   #集群端口
      command: ["redis-server", "/etc/redis/redis.conf"]
      privileged: true    #环境变量
      
    
     redis2:
      image: redis:5.0.3
      #network_mode: host
      restart: always
      volumes:
       - /docker/redis/7002/config/redis.conf:/etc/redis/redis.conf
       - /docker/redis/7002/data:/data
      environment:
       - TZ=Asia/Shanghai
       - LANG=en_US.UTF-8
      ports:
        - '7002:6379'     #服务端口
        - '17002:16379'   #集群端口
      command: ["redis-server", "/etc/redis/redis.conf"]
      privileged: true    #环境变量
    
     redis3:
      image: redis:5.0.3
      #network_mode: host
      restart: always
      volumes:
       - /docker/redis/7003/config/redis.conf:/etc/redis/redis.conf
       - /docker/redis/7003/data:/data
      environment:
       - TZ=Asia/Shanghai
       - LANG=en_US.UTF-8
      ports:
        - '7003:6379'     #服务端口
        - '17003:16379'   #集群端口
      command: ["redis-server", "/etc/redis/redis.conf"]
      privileged: true    #环境变量
    
     redis4:
      image: redis:5.0.3
      #network_mode: host
      restart: always
      volumes:
       - /docker/redis/7004/config/redis.conf:/etc/redis/redis.conf
       - /docker/redis/7004/data:/data
      environment:
       - TZ=Asia/Shanghai
       - LANG=en_US.UTF-8
      ports:
        - '7004:6379'     #服务端口
        - '17004:16379'   #集群端口
      command: ["redis-server", "/etc/redis/redis.conf"]
      privileged: true    #环境变量
    
     redis5:
      image: redis:5.0.3
      #network_mode: host
      restart: always
      volumes:
       - /docker/redis/7005/config/redis.conf:/etc/redis/redis.conf
       - /docker/redis/7005/data:/data
      environment:
       - TZ=Asia/Shanghai
       - LANG=en_US.UTF-8
      ports:
        - '7005:6379'     #服务端口
        - '17005:16379'   #集群端口
      command: ["redis-server", "/etc/redis/redis.conf"]
      privileged: true    #环境变量
    
     redis6:
      image: redis:5.0.3
      #network_mode: host
      restart: always
      volumes:
       - /docker/redis/7006/config/redis.conf:/etc/redis/redis.conf
       - /docker/redis/7006/data:/data
      environment:
       - TZ=Asia/Shanghai
       - LANG=en_US.UTF-8
      ports:
        - '7006:6379'     #服务端口
        - '17006:16379'   #集群端口
      command: ["redis-server", "/etc/redis/redis.conf"]
      privileged: true    #环境变量
    

    按键盘esc,输入:wq,保存文件

    六、启动容器

    以后台启动

    docker-compose up -d
    


    使用docker-compose ps查看容器列表,发现已经全部启动


    再使用docker container ls比较看下

    七、组建集群

    redis-cli -h 192.168.200.135 -p 7001 --cluster create 192.168.200.135:7001 192.168.200.135:7002 192.168.200.135:7003 192.168.200.135:7004 192.168.200.135:7005 192.168.200.135:7006 --cluster-replicas 1
    

    八、查看集群信息

    可以看到主从关系

    注意

    1.使用docker-compose的方式,如果未指定网络,会以文件夹 + _default的规则自动创建一个名为redis_default的网络(文件夹名为redis),该次创建的所有容器都会加入该网络,其中的容器可以相互访问。

    常见问题

    1.搭建集群的时候,一直是Waiting for the cluster to join.....
    我最初的想法是docker是相互隔离的,所以每个node中的端口都可以使用默认的6379。最开始配置为:

      ports:
        - '7001:6379'     #服务端口
        - '17001:16379'   #集群端口
    

    ...

      ports:
        - '7006:6379'     #服务端口
        - '17006:16379'   #集群端口
    

    其实这种配置有问题的。在启动容器的时候虽然正常,但是集群的节点间是无法通信的。因为redis集群间的通信端口是10000+当前节点port,在组建集群时,每个容器中的node,端口都是6379,会通过16379访问其他node,而容器映射的端口是17001不是16379,所以才会一直waiting。
    2.Node 192.168.200.135:7002 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
    删除对应node中data下的内容即可,我这里是测试环境为了方便,删除所有node下data的内,命令如下:
    先停止容器,docker-compose down ,然后删除所有节点data下的内rm -f /docker/redis/700{1..6}/data/*

    参考:https://www.jianshu.com/p/b7dea62bcd8b

  • 相关阅读:
    浅析深度优先和广度优先遍历实现过程、区别及使用场景
    浅析为什么要用setTimeout模拟setInterval
    app弹出软键盘获取键盘高度不准确的原因及导致底部定位的元素无法贴近键盘的问题
    App平台iOS设备上因内存不足导致白屏、闪退的原因及其解决方案
    浅谈移动端开发技术
    浅析Console命令调试常用方法
    js正则表达式中的正向肯定预查和正向否定预查, 反向肯定和反向否定(这个翻译不准确)
    javascript的版本查看及js的历史
    【转】JS-正则表达式的反向引用
    【转】Linux虚拟网络设备之tun/tap
  • 原文地址:https://www.cnblogs.com/wugang/p/14491468.html
Copyright © 2011-2022 走看看