docker-compose搭建redis集群

这里用docker-compose在一台机器搭建三主三从,生产环境肯定是在多台机器搭建,否则一旦这台宿主机挂了,redis集群全挂了,依然是单点故障。同时,受机器性能极限影响,其并发也上不去,算不上高并发。

单机存在的问题:

  • 机器故障,导致redis失效;
  • 容量瓶颈,容量不能水平扩展;
  • OPS( operation per second 每秒处理指令数),一台机器的网络带宽是有限的,如果有多台机器,这个处理能力就上来了。

主从存在的问题:

  • 主服务挂了,redis服务就无法写入

哨兵模式存在的问题:

  • 配置复杂
  • 性能和高可用表现一般,切换瞬间无法使用,只有一台主机,性能受限。

集群存在问题:

  • 自动故障切换时,集群状态fail无法对外提供服务。

技术都有优点和缺点,适合才是最好

服务器宿主机IP

192.168.123.182

创建redis集群配置基本目录

mkdir -p /root/redis-cluster

切换至redis集群配置基本目录

cd /root/redis-cluster

编写redis.conf配置模板文件redis-cluster.tmpl

# 端口号
port ${PORT}
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456i
# 访问主节点密码
masterauth 123456i
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.123.182
# 集群节点映射端口
cluster-announce-port ${PORT}
# 集群节点总线端口
cluster-announce-bus-port 1${PORT}

docker-compose搭建redis集群_第1张图片

改配置模板,前面是redis.conf单机时常规配置,只是最后六条配置是redis集群配置

下面语句实现模板变量的替换:
docker-compose搭建redis集群_第2张图片

下面for循环实现6个redis配置文件生成:

for port in `seq 6380 6385`
do
  mkdir -p ${port}/{conf,data} \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf
done

生成配置文件如下图:
docker-compose搭建redis集群_第3张图片

docker-compose.yml文件编写:

version: "3.3"

# 定义服务
services:
  redis-6380: # 服务名称
    image: redis # 容器镜像
    container_name: redis-6380 # 容器名称
    restart: always # 容器总是重启
    network_mode: "host" # host 网络模式
    ports: # 映射端口
      - 6380:6380
    volumes: # 目录挂载
      - /root/redis-cluster/6380/conf/redis.conf:/usr/local/redis/redis.conf
      - /root/redis-cluster/6380/data:/data
    command: redis-server /usr/local/redis/redis.conf # 服务启动命令

  redis-6381:
    image: redis
    container_name: redis-6381
    network_mode: "host"
    ports:
      - 6381:6381
    volumes:
      - /root/redis-cluster/6381/conf/redis.conf:/usr/local/redis/redis.conf
      - /root/redis-cluster/6381/data:/data
    command: redis-server /usr/local/redis/redis.conf

  redis-6382:
    image: redis
    container_name: redis-6382
    network_mode: "host"
    ports:
      - 6382:6382
    volumes:
      - /root/redis-cluster/6382/conf/redis.conf:/usr/local/redis/redis.conf
      - /root/redis-cluster/6382/data:/data
    command: redis-server /usr/local/redis/redis.conf

  redis-6383:
    image: redis
    container_name: redis-6383
    network_mode: "host"
    ports:
      - 6383:6383
    volumes:
      - /root/redis-cluster/6383/conf/redis.conf:/usr/local/redis/redis.conf
      - /root/redis-cluster/6383/data:/data
    command: redis-server /usr/local/redis/redis.conf

  redis-6384:
    image: redis
    container_name: redis-6384
    network_mode: "host"
    ports:
      - 6384:6384
    volumes:
      - /root/redis-cluster/6384/conf/redis.conf:/usr/local/redis/redis.conf
      - /root/redis-cluster/6384/data:/data
    command: redis-server /usr/local/redis/redis.conf

  redis-6385:
    image: redis
    container_name: redis-6385
    network_mode: "host"
    ports:
      - 6385:6385
    volumes:
      - /root/redis-cluster/6385/conf/redis.conf:/usr/local/redis/redis.conf
      - /root/redis-cluster/6385/data:/data
    command: redis-server /usr/local/redis/redis.conf

编写完毕,整体情况:
docker-compose搭建redis集群_第4张图片
根据docker-compose.yml文件启动服务:
docker-compose搭建redis集群_第5张图片
服务创建后,通过如下操作实现redis集群创建

# 进入其中一个redis容器内
docker exec -it redis-6380 /bin/bash

# 用redis-cli创建整个redis集群
# -a 表示连接的密码
# --cluster create 表示需要集群的redis主机和端口
# --cluster-replicas 1 其中的1表示一主一从
redis-cli -a 123456i --cluster create 192.168.123.182:6380 192.168.123.182:6381 192.168.123.182:6382 192.168.123.182:6383 192.168.123.182:6384 192.168.123.182:6385 --cluster-replicas 1

docker-compose搭建redis集群_第6张图片
docker-compose搭建redis集群_第7张图片
至此,三主三从搭建完毕。

查看集群状态:

redis-cli -a 123456i --cluster check 192.168.123.182:6380

docker-compose搭建redis集群_第8张图片

redis-cli -p 6380 -a 123456i

# 查看集群信息
cluster info

# 查看集群节点
cluster nodes

docker-compose搭建redis集群_第9张图片

这里的镜像是:redis-7.2.4

你可能感兴趣的:(运维,docker,redis,容器)