docker安装单机、主从、哨兵模式的redis

引言

redis自然是不必多说是一款高性能的非关系型数据库,本文的宗旨是借助docker来实现快速的搭建redis集群,以便于更好的学习redis。

官网下载redis.conf配置文件

下载配置文件的意义是借助docker的挂载,可以帮助我们在宿主机更好的修改配置。

配置文件下载链接

选择合适版本的配置文件即可!

单机版redis搭建

编写docker-compose文件

yml 复制代码
version: '3.2.0'
services:
  redis01:
    image: redis:6.2.10  
    container_name: redis01
    ports:
      - "6379:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis01/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf  #安装配置文件启动redis
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.2

networks:
  net-redis:
    name: net-redis
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16

客户端验证是否能正常访问

这里推荐一款官方推荐使用的客户端连接工具 RedisInsight

主从redis搭建

创建docker-compose文件

yml 复制代码
# 主从版 Redis 容器化部署
version: '3.2.0'
services:
  redis01:
    image: redis:6.2.10
    container_name: redis01
    ports:
      - "6379:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/redis01/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.2
  redis02:
    image: redis:6.2.10
    container_name: redis02
    ports:
      - "6380:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/redis02/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.3
  redis03:
    image: redis:6.2.10
    container_name: redis03
    ports:
      - "6381:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/redis03/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.4

networks:
  net-redis:
    name: net-redis
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16

修改配置文件

主服务器配置

  1. 绑定地址修改

在主服务器的redis.conf中将bind参数放开,修改成bind 0.0.0.0以便从服务器可以连接到主服务器。如果你希望主服务器只能被本机访问,可以设置为bind 127.0.0.1

txt 复制代码
bind 0.0.0.0
  1. 设置主服务器密码
txt 复制代码
requirepass redis01
  1. 配置持久化
txt 复制代码
save 3600 1
save 300 100
save 60 10000

从服务器配置

  1. 绑定地址修改

在主服务器的redis.conf中将bind参数放开,修改成bind 0.0.0.0以便从服务器可以连接到主服务器。如果你希望主服务器只能被本机访问,可以设置为bind 127.0.0.1

txt 复制代码
bind 0.0.0.0
  1. 指定主服务器地址
txt 复制代码
replicaof 172.19.0.2 6379 #有些版本这里是slaveof
  1. 设置主服务器的密码
txt 复制代码
masterauth redis01
  1. 配置持久化
txt 复制代码
save 3600 1
save 300 100
save 60 10000

运行docker创建redis容器

txt 复制代码
docker-compose -f docker-redis-compose.yml up -d

客户端验证

出从模式的缺点

主从模式,主节点负责写操作,从节点负责读操作,在一定程度上提高了redis的性能;但是相对的如果主节点挂了,就只能通过重启去进行数据的恢复,同时还需要重新的配置主从关系,这样相对就比较麻烦。

哨兵模式redis搭建

哨兵模式架构图

哨兵本质上也是由单个的redis组成的,为保证可用性最好哨兵也配置成多个

编写docker-compose文件

yml 复制代码
# 哨兵模式 Redis 容器化部署
version: '3.2.0'
services:
  redis01:
    image: redis:6.2.10
    container_name: redis01
    ports:
      - "6379:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/redis01/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.2
  redis02:
    image: redis:6.2.10
    container_name: redis02
    ports:
      - "6380:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/redis02/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.3
  redis03:
    image: redis:6.2.10
    container_name: redis03
    ports:
      - "6381:6379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/redis03/conf/redis.conf:/usr/local/etc/redis.conf"
    command: redis-server /usr/local/etc/redis.conf
    restart: no
    networks:
      net-redis:
        ipv4_address: 172.19.0.4

  sentinel01:
    image: redis:6.2.10
    container_name: sentinel01
    ports:
      - "16379:16379"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/sentinel01/conf:/usr/local/etc/sentinel01/conf"
    command: ["sh","-c","mkdir -p /usr/local/etc/sentinel01/conf && chmod -R 777 /usr/local/etc/sentinel01/conf && redis-sentinel /usr/local/etc/sentinel01/conf/sentinel.conf --sentinel"]
    restart: no
    depends_on:
      - redis01
      - redis02
      - redis03
    networks:
      net-redis:
        ipv4_address: 172.19.0.5
  sentinel02:
    image: redis:6.2.10
    container_name: sentinel02
    ports:
      - "16380:16380"
    volumes:
      - "/C/wh-workspace/work_demo/src/main/resources/redis/sentinel02/conf:/usr/local/etc/sentinel02/conf"
    command: [ "sh","-c","mkdir -p /usr/local/etc/sentinel02/conf && chmod -R 777 /usr/local/etc/sentinel02/conf && redis-sentinel /usr/local/etc/sentinel02/conf/sentinel.conf --sentinel" ]
    restart: no
    depends_on:
      - redis01
      - redis02
      - redis03
    networks:
      net-redis:
        ipv4_address: 172.19.0.6

networks:
  net-redis:
    name: net-redis
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16

配置sentinel.conf文件

txt 复制代码
# 哨兵节点默认开启的端口
port 16379
# 哨兵节点保证和其他服务通信
bind 0.0.0.0
# 设置监听的服务器名 IP 端口 2:表示两个哨兵节点都任务主服务下线才是真的下线
sentinel monitor redis01 172.19.0.2 6379 1
# 主节点密码
sentinel auth-pass redis01 redis01
# 哨兵保存日志
logfile "/var/log/sentinel01.log"
# 多少毫秒内没有应答,则判定为主节点下线
sentinel down-after-milliseconds redis01 5000

运行docker创建redis容器

txt 复制代码
docker-compose -f docker-redis-compose.yml up -d

查看哨兵状态

进入容器,进入redis-cli后查看哨兵信息

模拟先收到停调redis主节点,看看哨兵是否选举新的节点成为主节点.

主节已经发生了改变

哨兵模式的缺点

哨兵模式虽然实现了故障转移,从新选举出主节点保证系统的高可用,本质是还是基于中心化的集群配置,无法对海量数据进行分片存储实现数据的分布式管理,如果要实现数据的分片储存需要用到cluster集群来实现(后续要写一篇关于cluster集群的搭建),对于业务量不是很大的系统哨兵和主从模式的集群已经够用了。如果你的系统redis存储的数据量很大,建议使用cluster集群进行数据分片存储,同时每个集群新增哨兵模式保证部分节点宕机,能实现故障转移。

相关推荐
家有娇妻张兔兔21 分钟前
Redis 报错 “MISCONF Redis is configured to save RDB snapshots“?一文讲透根因与根除方案
数据库·redis·故障排查·misconf
JAVA面经实录91727 分钟前
Kafka面试题标准答案(面试背诵版)
分布式·面试·kafka
一嘴一个橘子44 分钟前
SpringDataRedis 操作 redis
java·redis
吴声子夜歌2 小时前
Java面试——Spark原理及应用(二)
java·面试·spark
敲上瘾2 小时前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存
吴声子夜歌2 小时前
Java面试——Spark原理及应用(一)
java·面试·spark
吴声子夜歌9 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
正儿八经的少年10 小时前
布隆过滤器(解决redis缓存穿透步骤之一)
数据库·redis·缓存
黄敬峰10 小时前
一文搞懂 Docker + Dockerfile:从镜像构建到全栈部署
面试
kyriewen15 小时前
我踩了3次同一个坑才明白:JavaScript里比0.1+0.2更隐蔽的5个数字陷阱
前端·javascript·面试