docker compose redis 6.x安装启动 单机 sentinel哨兵 cluster集群 超详细介绍

432 阅读9分钟

前言

docker compose 安装redis 主要用于测试和学习 版本是redis 6.2.13 redis下载地址 download.redis.io/releases/后面用到的redis.confsentinel.conf配置都是通过官方默认文件来修改的

image.png

安装单机

名称ip端口
redis172.20.192.16379

docker-compose.yml 配置

version: '3'

services:
  redis:
    image: redis:6.2.13
    ports:
      - "6379:6379"
    environment:
      - TZ=Asia/Shanghai # 设置时区
    container_name: redis-stand
    volumes:
      - ./data:/data # 数据挂在 宿主机:容器
      - ./conf/redis.conf:/etc/redis/redis-stand.conf #宿主机:容器
    command: redis-server /etc/redis/redis-stand.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限

redis.conf 配置

Redis 的配置文件 redis.conf 是一个非常详细的文本文件,包含了许多用于调整 Redis 实例行为的参数。下面是一些重要的配置项的详细介绍,以帮助你理解和配置 Redis:

  1. 网络设置:

    • bind: 指定 Redis 仅接受来自于这些 IP 地址的连接请求。通常用于控制访问权限。
    • protected-mode: 当没有密码设置,且 bind 配置为空时,保护模式会阻止不安全的访问。
    • port: 设置 Redis 服务器监听的端口号,默认为 6379。
    • tcp-backlog: 设置 TCP 监听端口的 backlog(未完成三次握手队列的大小),影响着客户端等待连接被接受的数量。
    • timeout: 设置客户端空闲多久后断开连接。0 表示禁用超时。
  2. 通用配置:

    • daemonize: 指定 Redis 是否以守护进程模式运行。
    • pidfile: 守护进程模式下,Redis 的 PID 文件路径。
    • loglevel: 日志的详细程度,可以是 debug, verbose, notice, warning
    • logfile: 日志文件的路径。空字符串表示输出到标准输出。
  3. 安全性:

    • requirepass: 设置客户端连接到 Redis 服务器时需要提供的密码。
    • rename-command: 重命名命令,提高安全性,防止有些危险命令被误用。
  4. 持久化:

    • save: 设置在多长时间内,如果有多少次更新操作,就将数据同步到磁盘。可以设置多个条件。
    • appendonly: 是否开启 AOF 持久化模式。
    • appendfilename: AOF 文件的名称。
    • appendfsync: AOF 文件更新到磁盘的频率。
  5. 内存管理:

    • maxmemory: Redis 最大可用内存量,超过这个内存会触发数据淘汰策略。
    • maxmemory-policy: 内存达到限制时的数据淘汰策略。
    • maxmemory-samples: 淘汰过程中样本的大小。
  6. 数据淘汰策略:

    • volatile-lru: 只对设置了过期时间的键进行 LRU(最近最少使用)淘汰。
    • allkeys-lru: 对所有键进行 LRU 淘汰。
    • volatile-random: 随机淘汰设置了过期时间的键。
    • allkeys-random: 随机淘汰所有键。
    • volatile-ttl: 淘汰即将过期的键。
    • noeviction: 禁止淘汰数据。
  7. 复制:

    • slaveof: 设置该 Redis 服务器为其他服务器的从属服务器(复制)。
    • masterauth: 如果主服务器设置了密码,从服务器连接主服务器时的密码。
    • slave-serve-stale-data: 当与主服务器失去连接时,是否继续提供服务。
  8. 集群:

    • cluster-enabled: 是否启用 Redis 集群模式。
    • cluster-config-file: 集群配置文件的名称。
    • cluster-node-timeout: 集群节点超时时间。
  9. Lua 脚本:

    • lua-time-limit: Lua 脚本最长执行时间。
  10. 慢查询日志:

    • slowlog-log-slower-than: 记录慢查询的阈值。
    • slowlog-max-len: 慢查询日志的最大长度。

这只是 redis.conf 中的一小部分配置项。实际上,该文件包含了上百个配置项,每个配置项都有详细的注释说明。你应该根据自己的使用场景来调整这些配置。在修改配置之前,建议仔细阅读每个配置项的说明,以确保理解其作用和潜在影响。

修改项

默认配置修改两个参数

  • bind 127.0.0.1 注释,
  • 修改protected-mode no 允许远程连接

测试

连接工具使用 redis Desktop Manager RedisDesktopManager下载 我用的是 1.6.0 最新版是1.6.6 我windows11 无法打开 所以降级可以使用的 还有一个官方的工具官网redis 连接工具下载 也不错推荐使用

端口是6379 image.png 可以正常链接

安装 sentinel 1主2从3哨兵集群

节点

1台 master 2台salvel 3台 sentinel集群

名称ip端口
master172.20.192.16379
slavel1172.20.192.16380
slavel2172.20.192.16381
sentinel1172.20.192.126379
sentinel2172.20.192.126380
sentinel3172.20.192.126381

docker-compose配置

version: '3'
services:
  master:
    image: redis:6.2.13
    container_name: redis-master
    ports:
      - "6379:6379"
    volumes:
      - ./master/conf/redis.conf:/usr/local/etc/redis/redis-master.conf
    command: redis-server /usr/local/etc/redis/redis-master.conf # 启动 Redis 时使用自定义配置文件
  slave1:
    image: redis:6.2.13
    container_name: redis-slave-1
    ports:
      - "6380:6379"
    volumes:
      - ./slave1/conf/redis.conf:/usr/local/etc/redis/redis-slave1.conf
    command: redis-server /usr/local/etc/redis/redis-slave1.conf --slaveof 172.20.192.1 6379
    depends_on:
      - master
  slave2:
    image: redis:6.2.13
    container_name: redis-slave-2
    ports:
      - "6381:6379"
    volumes:
      - ./slave1/conf/redis.conf:/usr/local/etc/redis/redis-slave2.conf
    command: redis-server /usr/local/etc/redis/redis-slave2.conf --slaveof 172.20.192.1 6379
    depends_on:
      - master
  sentinel1:
    image: redis:6.2.13
    container_name: redis-sentinel-1
    ports:
      - "26379:26379"
    volumes:
      - ./conf/sentinel1/sentinel.conf:/usr/local/etc/redis/sentinel1.conf
    command: redis-sentinel /usr/local/etc/redis/sentinel1.conf --port 26379
    depends_on:
      - master
      - slave1
      - slave2
  sentinel2:
    image: redis:6.2.13
    container_name: redis-sentinel-2
    volumes:
      - ./conf/sentinel2/sentinel.conf:/usr/local/etc/redis/sentinel2.conf
    ports:
      - "26380:26379"
    command: redis-sentinel /usr/local/etc/redis/sentinel2.conf
    depends_on:
      - master
      - slave1
      - slave2
  sentinel3:
    image: redis:6.2.13
    container_name: redis-sentinel-3
    volumes:
      - ./conf/sentinel3/sentinel.conf:/usr/local/etc/redis/sentinel3.conf
    ports:
      - "26381:26379"
    command: redis-sentinel /usr/local/etc/redis/sentinel3.conf
    depends_on:
      - master
      - slave1
      - slave2

redis.conf配置

  • bind 127.0.0.1 注释,
  • 修改protected-mode no 允许远程连接

sentinel.conf配置

# 哨兵集群 mymaster 名称可以随便起一个,172.20.192.1 6379 主节点 ip:端口 ,
# 2将这个主服务器判断为失效至少需要 2 个 Sentinel 进程的同意,只要同意 Sentinel 的数量不达标,自动failover就不会执行
sentinel monitor mymaster 172.20.192.1 6379 2
# 设置redis 主服务已经宕机所需要的毫秒数
sentinel down-after-milliseconds mymaster 5000
# 设置故障转移超时时间,如果这个时间内故障转移没有成功完成,哨兵会立即停止并尝试重新开始
sentinel failover-timeout mymaster 60000
# 设置在执行故障转移时,可以同时对新的主服务器进行同步的从服务器数量
sentinel parallel-syncs mymaster 1

sentinel1,sentinel2,sentinel3 配置相同

连接

只要写三台其中一台哨兵节点即可

image.png

安装 cluster

sentinel.conf配置

集群1

# 宿主机ip  后续链接使用这个Ip
cluster-announce-ip 172.20.192.1
cluster-announce-port 7000
cluster-announce-bus-port 17000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

集群2

# 宿主机ip  后续链接使用这个Ip
cluster-announce-ip 172.20.192.1
cluster-announce-port 7001
cluster-announce-bus-port 17001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

集群3

# 宿主机ip  后续链接使用这个Ip
cluster-announce-ip 172.20.192.1
cluster-announce-port 7002
cluster-announce-bus-port 17002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

集群4

# 宿主机ip  后续链接使用这个Ip
cluster-announce-ip 172.20.192.1
cluster-announce-port 7003
cluster-announce-bus-port 17003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

集群5

# 宿主机ip  后续链接使用这个Ip
cluster-announce-ip 172.20.192.1
cluster-announce-port 7004
cluster-announce-bus-port 17004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

集群6

# 宿主机ip  后续链接使用这个Ip
cluster-announce-ip 172.20.192.1
cluster-announce-port 7005
cluster-announce-bus-port 17005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  • port:节点端口;
  • requirepass:添加访问认证;
  • masterauth:如果主节点开启了访问认证,从节点访问主节点需要认证;
  • protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
  • daemonize:是否以守护线程的方式启动(后台启动),默认 no;
  • appendonly:是否开启 AOF 持久化模式,默认 no;
  • cluster-enabled:是否开启集群模式,默认 no;
  • cluster-config-file:集群节点信息文件;
  • cluster-node-timeout:集群节点连接超时时间;
  • cluster-announce-ip:集群节点 IP,填写宿主机的 IP;
  • cluster-announce-port:集群节点映射端口;
  • cluster-announce-bus-port:集群节点总线端口。

docker-compose.yml配置

version: '3'
services:
  redis1:
    image: redis:6.2.13
    container_name: redis-cluster1
    networks:
      cluster-net:
        ipv4_address: 172.16.238.10
    ports:
      - "7000:7000"
      - "17000:17000"
    volumes:
      - ./conf/redis1.conf:/etc/redis/redis-cluster1.conf
    command: redis-server /etc/redis/redis-cluster1.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
  redis2:
    image: redis:6.2.13
    container_name: redis-cluster2
    networks:
      cluster-net:
        ipv4_address: 172.16.238.11
    volumes:
      - ./conf/redis2.conf:/etc/redis/redis-cluster2.conf
    ports:
      - "7001:7001"
      - "17001:17001"
    command: redis-server /etc/redis/redis-cluster2.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
  redis3:
    image: redis:6.2.13
    container_name: redis-cluster3
    networks:
      cluster-net:
        ipv4_address: 172.16.238.12
    volumes:
      - ./conf/redis3.conf:/etc/redis/redis-cluster3.conf
    ports:
      - "7002:7002"
      - "17002:17002"
    command: redis-server /etc/redis/redis-cluster3.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
  redis4:
    image: redis:6.2.13
    container_name: redis-cluster4
    networks:
      cluster-net:
        ipv4_address: 172.16.238.13
    ports:
      - "7003:7003"
      - "17003:17003"
    volumes:
      - ./conf/redis4.conf:/etc/redis/redis-cluster4.conf
    command: redis-server /etc/redis/redis-cluster4.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
  redis5:
    image: redis:6.2.13
    container_name: redis-cluster5
    networks:
      cluster-net:
        ipv4_address: 172.16.238.14
    volumes:
      - ./conf/redis5.conf:/etc/redis/redis-cluster5.conf
    ports:
      - "7004:7004"
      - "17004:17004"
    command: redis-server /etc/redis/redis-cluster5.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
  redis6:
    image: redis:6.2.13
    container_name: redis-cluster6
    networks:
      cluster-net:
        ipv4_address: 172.16.238.15
    ports:
      - "7005:7005"
      - "17005:17005"
    volumes:
      - ./conf/redis6.conf:/etc/redis/redis-cluster6.conf
    command: redis-server /etc/redis/redis-cluster6.conf
    privileged: true # 使用该参数,container内的root拥有真正的root权限。否则, container内的root只是外部的一个普通用户权限
networks:
  # 创建集群网络,在容器之间通信
  cluster-net:
    ipam:
      config:
        - subnet: 172.16.238.0/24

虚拟出 172.16.238.0/24 网络ip 用于 redis集群内部通信,docker 启动成功后进入任意节点执行下面命令,根据提示 再次 输入 yes 等待集群创建成功

redis-cli --cluster create \
172.16.238.10:7000 \
172.16.238.11:7001 \
172.16.238.12:7002 \
172.16.238.13:7003 \
172.16.238.14:7004 \
172.16.238.15:7005 \
--cluster-replicas 1

注意 Ip 连接的使用宿主机 172.18.80.1

image.png

项目 地址 gitee.com/q_tuanzahng…