docker搭建redis集群

前言

redis是一个开源的key-value数据库,拥有极高的性能,支持丰富的数据结构等特点。通常作为中间件使用,是企业级应用不可或缺的一部分。通常,开发的时候,我们一般只在本地搭建一个redis服务作为开发测试使用,但是在线上一般都还是搭建集群,提供稳定可靠的服务。

集群模型

redis-cluster

​ 从上图看出,集群最少需要6个节点,3主3从。 redis 的集群是根据它内部的槽(slot)来实现的,redis 有 16384 个槽, 根据 CRC16(key)%1638 可以计算出 key 应该存放在哪个槽中。同时每个节点之间通过 redis 的 Gossip 协议 来传播信息,检查目标节点是否存活等。如果有一个主节点宕机,redis 会选举 出一个新的主节点来替代宕机的主节点,以此来保证服务的可用性。

集群搭建

redis配置文档、数据

在linux目录下创建这样的几个文件夹,并在文件夹中创建相应的redis.conf文件(data文件自动创建)

创建文件夹

下面是redis.conf的内容

# 文件名:redis.conf
## 节点端口:7000, 7001, 7002, 7003, 7004, 7005
port 7000

## cluster集群模式
cluster-enabled yes

## 集群配置名
cluster-config-file nodes.conf

## 关闭保护模式
#protected-mode no

## 超时时间
cluster-node-timeout 5000

## 持久化模式
appendonly yes

创建集群的docker网络

# 网络名称redis-cluster,下一步用到,默认使用bridge模式
docker network redis-cluster

docker-compose 配置文件编写

在与上图7000文件夹同级目录创建docker-compose.yml文件,文件内容如下:

# 文件名:docker-compose.yml
redis-7000:
  # 基于redis镜像构建
  image: redis
  # 使用上一步创建的docker网络
  net: "redis-cluster"
  restart: always
  privileged: true
  # 对外暴露redis连接端口7000,以及集群间相互通讯的端口17000,通讯端口=连接端口+10000
  ports:
    - 7000:7000
    - 17000:17000
  # 映射配置文件和数据存储文件夹到redis节点容器内部
  volumes:
    - /home/redis_config/7000/redis.conf:/etc/redis/redis.conf
    - /home/redis_config/7000/data:/data
  # 默认执行命令,使用redis.conf启动redis
  command: ["redis-server", "/etc/redis/redis.conf"]
redis-7001:
  image: redis
  net: "redis-cluster"
  restart: always
  privileged: true
  ports:
    - 7001:7001
    - 17001:17001
  volumes:
    - /home/redis_config/7001/redis.conf:/etc/redis/redis.conf
    - /home/redis_config/7001/data:/data
  command: ["redis-server", "/etc/redis/redis.conf"]
redis-7002:
  image: redis
  net: "redis-cluster"
  restart: always
  privileged: true
  ports:
    - 7002:7002
    - 17002:17002
  volumes:
    - /home/redis_config/7002/redis.conf:/etc/redis/redis.conf
    - /home/redis_config/7002/data:/data
  command: ["redis-server", "/etc/redis/redis.conf"]
redis-7003:
  image: redis
  net: "redis-cluster"
  restart: always
  privileged: true
  ports:
    - 7003:7003
    - 17003:17003
  volumes:
    - /home/redis_config/7003/redis.conf:/etc/redis/redis.conf
    - /home/redis_config/7003/data:/data
  command: ["redis-server", "/etc/redis/redis.conf"]
redis-7004:
  image: redis
  net: "redis-cluster"
  restart: always
  privileged: true
  ports:
    - 7004:7004
    - 17004:17004
  volumes:
    - /home/redis_config/7004/redis.conf:/etc/redis/redis.conf
    - /home/redis_config/7004/data:/data
  command: ["redis-server", "/etc/redis/redis.conf"]
redis-7005:
  image: redis
  net: "redis-cluster"
  restart: always
  privileged: true
  ports:
    - 7005:7005
    - 17005:17005
  volumes:
    - /home/redis_config/7005/redis.conf:/etc/redis/redis.conf
    - /home/redis_config/7005/data:/data
  command: ["redis-server", "/etc/redis/redis.conf"]

启动docker容器

#在上面创建的docker-compose.yml目录执行下面命令
docker-compose up -d

启动完成后查看容器情况:

redis容器启动

查看各个容器的ip及其端口

#记录下来ip、端口,后面会用到
docker network inspect redis-cluster

创建集群网络

进入其中的一个redis节点

#进入redis
docker exec -it redis_config_redis-7003_1 /bin/bash
#可以通过执行下面命令看redis是否启动,如果启动会出现下图
redis-cli -p 7003

启动成功

根据上面查到的IP地址构建集群关联命令,并执行,其中需要输入 yes 进行确认

redis-cli -p 7003 --cluster create 172.18.0.4:7000 172.18.0.2:7001 172.18.0.7:7002 172.18.0.5:7003  172.18.0.6:7004  172.18.0.3:7005  --cluster-replicas 1

测试集群情况

#确认是否搭建成功,如果出现下图说明搭建成功
redis-cli -p 7000 cluster nodes

集群搭建成功

redis集群官方参考文档