• 从零开始学习docker之在docker中搭建redis(集群)


    docker搭建redis集群

    docker-compose是以多容器的方式启动,非常适合用来启动集群

    一、环境准备

    云环境:CentOS 7.6 64位

    二、安装docker-compose

    #需要先安装企业版linux附加包(epel)
    yum -y install epel-release
    #安装pip
    yum -y install python-pip
    #安装docker-compose
    pip install docker-compose  

    三、创建docker-compose.yml

    以docker-compose启动时会从当前路径找docker-compose.yml或者docker-compose.yaml

    从docker官网上找一份docker-compose.yml ,传送门----------------------------------------https://docs.docker.com/compose/compose-file/

    docker-compose启动单机redis

    接下来先用docker-compose尝试启动单点redis,下面是docker-compose配置文件

    #docker-compose版本
    version: "3.8" services: # service实例名 redis: #容器服务名 container_name: redis-0 #基础镜像 image: redis #端口映射 #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000 ports: - 6379:6379 - 16379:16379 #映射宿主机的数据卷 配置数据目录和配置文件目录 HOST:CONTAINER volumes: - /usr/docker/redis/data:/data - /usr/docker/redis/redis.conf:/etc/redis/redis.conf # 设置服务默认的启动程序 entrypoint: - redis-server - /etc/redis/redis.conf

    同时需要配置redis.conf ,配置以及配置项的修改请移步上一篇博文------从零开始学习docker之在docker中搭建redis(单机)

    配置好之后只需要在docker-compose.yml所在目录执行

    docker-compose up -d

     启动成功,连接redis与验证同样移步上一篇博文

    docker-compose启动redis集群

    docker-compose.yml

    #https://docs.docker.com/compose/compose-file/
    #version 
    version: "3.8"
    services:
      # 节点1
      redis-1:
        #容器服务名
        container_name: redis-1
        #基础镜像
        image: redis
        #端口映射
        #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
        ports:
          - 6381:6381
          - 16381:16381
        #映射宿主机的数据卷 配置数据目录和配置文件目录 HOST:CONTAINER
        volumes: 
          - /usr/docker/redis-cluster/redis-6381/data:/data
          - /usr/docker/redis-cluster/redis-6381/redis.conf:/etc/redis/redis.conf
        # 设置服务默认的启动程序
        entrypoint: 
          - redis-server 
          - /etc/redis/redis.conf
          
      # 节点2
      redis-2:
        #容器服务名
        container_name: redis-2
        #基础镜像
        image: redis
        #端口映射
        #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
        ports:
          - 6382:6382
          - 16382:16382
        #映射宿主机的数据卷 配置目录
        volumes: 
          - /usr/docker/redis-cluster/redis-6382/data:/redis/data
          - /usr/docker/redis-cluster/redis-6382/redis.conf:/etc/redis/redis.conf
        # 设置服务默认的启动程序
        entrypoint: 
          - redis-server 
          - /etc/redis/redis.conf
      # 节点3
      redis-3:
        #容器服务名
        container_name: redis-3
        #基础镜像
        image: redis
        #端口映射
        #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
        ports:
          - 6383:6383
          - 16383:16383
        #映射宿主机的数据卷 配置目录
        volumes: 
          - /usr/docker/redis-cluster/redis-6383/data:/data
          - /usr/docker/redis-cluster/redis-6383/redis.conf:/etc/redis/redis.conf
        # 设置服务默认的启动程序
        entrypoint: 
          - redis-server 
          - /etc/redis/redis.conf
      # 节点4
      redis-4:
        #容器服务名
        container_name: redis-4
        #基础镜像
        image: redis
        #端口映射
        #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
        ports:
          - 6384:6384
          - 16384:16384
        #映射宿主机的数据卷 配置目录
        volumes: 
          - /usr/docker/redis-cluster/redis-6384/data:/redis/data
          - /usr/docker/redis-cluster/redis-6384/redis.conf:/etc/redis/redis.conf
        # 设置服务默认的启动程序
        entrypoint: 
          - redis-server 
          - /etc/redis/redis.conf
      # 节点5
      redis-5:
        #容器服务名
        container_name: redis-5
        #基础镜像
        image: redis
        #端口映射
        #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
        ports:
          - 6385:6385
          - 16385:16385
        #映射宿主机的数据卷 配置目录
        volumes: 
          - /usr/docker/redis-cluster/redis-6385/data:/redis/data
          - /usr/docker/redis-cluster/redis-6385/redis.conf:/etc/redis/redis.conf
        # 设置服务默认的启动程序
        entrypoint: 
          - redis-server 
          - /etc/redis/redis.conf
      # 节点6
      redis-6:
        #容器服务名
        container_name: redis-6
        #基础镜像
        image: redis
        #端口映射
        #第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
        ports:
          - 6386:6386
          - 16386:16386
        #映射宿主机的数据卷 配置目录
        volumes: 
          - /usr/docker/redis-cluster/redis-6386/data:/redis/data
          - /usr/docker/redis-cluster/redis-6386/redis.conf:/etc/redis/redis.conf
        # 设置服务默认的启动程序
        entrypoint: 
          - redis-server 
          - /etc/redis/redis.conf

    集群模式的redis.conf除了要改单机的几个配置外(端口、本地访问保护) 还需要修改集群配置。

    #把这一行的#注掉 表示支持集群
    cluster-enabled yes
    #集群配置文件(启动时自动生成)
    cluster-config-file nodes_xxx.conf 

    我这里的话没有配置网络,启动的时候会为这些容器统一创建一个名字为redis-cluster_default的网络。同时也可以自定义网络。

    配置好之后通过docker-compose up -d执行

     6个节点能启动成功了 这个时候随便进入一个节点开启集群模式(在这里我用的是宿主机的ip进行集群模式的创建)

    redis-cli --cluster create 122.51.103.239:6381 122.51.103.239:6382 122.51.103.239:6383 122.51.103.239:6384 122.51.103.239:6385 122.51.103.239:6386 --cluster-replicas 1

     可以看到开启集群模式后默认分配了主从服务器 选yes接受该配置

    这时候主从服务器都加入到集群中去了 到这里集群就已经搭建好了

    四、验证redis集群

    首先进入其中某一个节点

    redis-cli -c -h 127.0.0.1 -p 6381

    连接到redis之后可以通过cluster-nodes显示集群节点分布情况

     可以看到三主三从 

    redis6381节点 set值之后根据hash环分布 数据落在6382节点上

    五、相关代码及配置文件

    传送门----------------------------------https://github.com/DreamsChaser/docker

    六、问题汇总

    问题1

    ERROR: for redis-master-1  Cannot start service redis-master-1: OCI runtime create failed: container_linux.go:349: 
    starting container process caused "exec: "redis-server /etc/redis/redis.conf": stat redis-server /etc/redis/redis.conf: no such file or directory": unknown

    这种情况会好多种原因 可能是因为配置文件映射路径有问题导致 

    我这出现的情况是因为我在写 容器启动的命令entrypoint时没有按照yml的文件格式导致不识别所致

    问题2 

    Node 127.0.0.1:6381 is not configured as a cluster node

    未开启集群模式,需要在redis.conf里开启,具体见上面redis.conf配置

  • 相关阅读:
    使用Java实现简单的局域网设备扫描
    Spring集成ElasticSearch搜索引擎
    Mysql 自定义函数示例
    Ehcache缓存配置以及基本使用
    SpringBoot-学习笔记
    【年度总结】2017年年度总结
    Android权限之动态权限
    Android沉浸式状态栏的简单实现
    Android自定义多宫格解锁控件
    Android For OpenCV的环境搭建
  • 原文地址:https://www.cnblogs.com/wdfordream/p/12807742.html
Copyright © 2020-2023  润新知