docker(docker-compose)部署redis集群

618 阅读9分钟

redis集群一般有6个,三主三从,这里就是采取这种模式。

docker-compose文件

#Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。

version: "2"

services:

  # 服务名称

  redis-7000:

    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

    image: redis:latest

    # 创建的容器名称

    container_name: redis-7000

    # 自启动

    restart: always

    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

    privileged: true

    # 为容器设置环境变量:

    environment:

      - TZ=Asia/Shanghai

    # 端口映射,格式为宿主机端口:容器内部端口

    ports:

      - "7000:7000"

      - "17000:17000"

    # 注意:这里记得打开集群总线端口,规则为offset 10000 - "17000:17000",容器内部就是通过17000这个端口进行连接的

    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录

    volumes:

      - ./redis/7000/data:/data

      - ./redis/7000/conf/redis.conf:/usr/local/etc/redis/redis.conf

    # 覆盖容器启动后默认执行的命令。

    command: redis-server /usr/local/etc/redis/redis.conf

  


  redis-7001:

    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

    image: redis:latest

    # 创建的容器名称

    container_name: redis-7001

    # 自启动

    restart: always

    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

    privileged: true

    # 为容器设置环境变量:

    environment:

      - TZ=Asia/Shanghai

    # 端口映射,格式为宿主机端口:容器内部端口

    ports:

      - "7001:7001"

      - "17001:17001"

    # 注意:这里记得打开集群总线端口,规则为offset 10000 - "17000:17000"

    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录

    volumes:

      - ./redis/7001/data:/data

      - ./redis/7001/conf/redis.conf:/usr/local/etc/redis/redis.conf

    # 覆盖容器启动后默认执行的命令。

    command: redis-server /usr/local/etc/redis/redis.conf

  


  redis-7002:

    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

    image: redis:latest

    # 创建的容器名称

    container_name: redis-7002

    # 自启动

    restart: always

    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

    privileged: true

    # 为容器设置环境变量:

    environment:

      - TZ=Asia/Shanghai

    # 端口映射,格式为宿主机端口:容器内部端口

    ports:

      - "7002:7002"

      - "17002:17002"

    # 注意:这里记得打开集群总线端口,规则为offset 10000 - "17000:17000"

    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录

    volumes:

      - ./redis/7002/data:/data

      - ./redis/7002/conf/redis.conf:/usr/local/etc/redis/redis.conf

    # 覆盖容器启动后默认执行的命令。

    command: redis-server /usr/local/etc/redis/redis.conf

  


  redis-7003:

    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

    image: redis:latest

    # 创建的容器名称

    container_name: redis-7003

    # 自启动

    restart: always

    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

    privileged: true

    # 为容器设置环境变量:

    environment:

      - TZ=Asia/Shanghai

    # 端口映射,格式为宿主机端口:容器内部端口

    ports:

      - "7003:7003"

      - "17003:17003"

    # 注意:这里记得打开集群总线端口,规则为offset 10000 - "17000:17000"

    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录

    volumes:

      - ./redis/7003/data:/data

      - ./redis/7003/conf/redis.conf:/usr/local/etc/redis/redis.conf

    # 覆盖容器启动后默认执行的命令。

    command: redis-server /usr/local/etc/redis/redis.conf

  


  redis-7004:

    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

    image: redis:latest

    # 创建的容器名称

    container_name: redis-7004

    # 自启动

    restart: always

    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

    privileged: true

    # 为容器设置环境变量:

    environment:

      - TZ=Asia/Shanghai

    # 端口映射,格式为宿主机端口:容器内部端口

    ports:

      - "7004:7004"

      - "17004:17004"

    # 注意:这里记得打开集群总线端口,规则为offset 10000 - "17000:17000"

    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录

    volumes:

      - ./redis/7004/data:/data

      - ./redis/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf

    # 覆盖容器启动后默认执行的命令。

    command: redis-server /usr/local/etc/redis/redis.conf

  


  redis-7005:

    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

    image: redis:latest

    # 创建的容器名称

    container_name: redis-7005

    # 自启动

    restart: always

    # container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

    privileged: true

    # 为容器设置环境变量:

    environment:

      - TZ=Asia/Shanghai

    # 端口映射,格式为宿主机端口:容器内部端口

    ports:

      - "7005:7005"

      - "17005:17005"

    # 注意:这里记得打开集群总线端口,规则为offset 10000 - "17000:17000"

    # 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录

    volumes:

      - ./redis/7005/data:/data

      - ./redis/7005/conf/redis.conf:/usr/local/etc/redis/redis.conf

    # 覆盖容器启动后默认执行的命令。

    command: redis-server /usr/local/etc/redis/redis.conf

需要修改的地方主要是容器的名字,容器的两个端口(第二个端口一定要比第一个端口大10000,代表总线,比如7000端口下面必须写一个17000),挂载目录,其他保持一致即可。

挂载目录:

图片.png

data目录为空,同时docker-compose.yml文件与redis目录同级。

conf目录下有一个redis.conf文件:

图片.png

内容如下:

以下展现的是redis-7000容器的配置文件。

#取消绑定ip,把 bind 127.0.0.1 注释

#bind 127.0.0.1

#修改保护模式为no,可以让非本机ip不加密码访问

protected-mode no

#修改为对应端口号

port 7000

#修改redis为后台启动

daemonize no

#更改数据存储目录,方便管理

#dir /usr/local/myredis/rediscluster/node7000

#开启集群,取消注释

cluster-enabled yes

#取消注释并修改为对应名称

cluster-config-file nodes.conf

#集群超时参数,取消注释

cluster-node-timeout 15000

#修改为数据同步,改为aof备份

appendonly yes

#当主机和从机都down掉时,其它主节点是否可以写操作,no 可以,yes 不行,默认为yes。根据需求配置

#当主机和从机都down掉时并设置为no时,该主机所在槽位数据不可写。可能会造成数据丢失情况

# 以下三个配置参数静态设定节点的运行参数, 包括对外IP, 普通Redis命令端口和集群桥接端口

  


# Redis Cluster 不支持NATted环境和IP地址或TCP端口被重映射(remapped)的环境。

# Docker使用一种名叫port mapping的技术, 运行于Docker容器内的程序实际对外使用的端口和监听的端口可不相同. 为了让Docker 兼容Redis Cluster, 需要使用Docker的host network模式。

#为了使Redis集群在这样的环境中工作,静态每个节点都知道需要其公共地址的配置

cluster-announce-ip 192.168.73.133

  


# 客户端连接端口

cluster-announce-port 7000

  


# 总线端口为普通端口port+10000,所谓Cluster bus, 即使用一种二进制协议(binary protocol)进行集群内点对点(node-to-node)通讯, 包括节点失效检测, 配置更新, 故障转移(failover)认证等

cluster-announce-bus-port 17000

cluster-announce-ip 192.168.73.133 后面的ip地址改为实际的IP地址。

cluster-announce-port 7000 这个容器的端口

cluster-announce-bus-port 17000 这个容器的总线

port 7000

后面的五个容器也是修改这四个地方,比如redis-7001配置文件是这样的:

#取消绑定ip,把 bind 127.0.0.1 注释

#bind 127.0.0.1

#修改保护模式为no,可以让非本机ip不加密码访问

protected-mode no

#修改为对应端口号

port 7001

#修改redis为后台启动

daemonize no

#更改数据存储目录,方便管理

#dir /usr/local/myredis/rediscluster/node7000

#开启集群,取消注释

cluster-enabled yes

#取消注释并修改为对应名称

cluster-config-file nodes.conf

#集群超时参数,取消注释

cluster-node-timeout 15000

#修改为数据同步,改为aof备份

appendonly yes

#当主机和从机都down掉时,其它主节点是否可以写操作,no 可以,yes 不行,默认为yes。根据需求配置

#当主机和从机都down掉时并设置为no时,该主机所在槽位数据不可写。可能会造成数据丢失情况

# 以下三个配置参数静态设定节点的运行参数, 包括对外IP, 普通Redis命令端口和集群桥接端口

  


# Redis Cluster 不支持NATted环境和IP地址或TCP端口被重映射(remapped)的环境。

# Docker使用一种名叫port mapping的技术, 运行于Docker容器内的程序实际对外使用的端口和监听的端口可不相同. 为了让Docker 兼容Redis Cluster, 需要使用Docker的host network模式。

#为了使Redis集群在这样的环境中工作,静态每个节点都知道需要其公共地址的配置

cluster-announce-ip 192.168.73.133

  


# 客户端连接端口

cluster-announce-port 7001

# 总线端口为普通端口port+10000,所谓Cluster bus, 即使用一种二进制协议(binary protocol)进行集群内点对点(node-to-node)通讯, 包括节点失效检测, 配置更新, 故障转移(failover)认证等

cluster-announce-bus-port 17001

开始部署

进入docker-compose.yml文件所在的目录:

创建容器

执行:docker-compose up -d

图片.png

创建集群:

执行:docker exec -it redis-7000 /bin/bash 进入容器。

执行:redis-cli --cluster create --cluster-replicas 1 192.168.73.133:7000 192.168.73.133:7001 192.168.73.133:7002 192.168.73.133:7003 192.168.73.133:7004 192.168.73.133:7005

开启集群。

这里的--cluster-replicas 1 的1代表一主一从,前面三个为主后面三个为从,这里的ip地址和端口根据上面的conf文件自行修改。

图片.png

到这里输入yes,等待片刻即可。

图片.png

至此集群搭建成功。

此时只需测试在7000上的创建的键值会不会同步到其他任意一个redis上即可验证。