前言

本章内容

  1. 为什么需要主从集群?
  2. 主从架构整体是怎样的?
  3. 怎么配置主从集群?

redis为什么需要主从集群?

单节点redis的处理能力是有上限的, 所以我们需要配置主从集群

配置主从集群的最终目的是 读写分离

master 节点主要负责写

slave 节点主要负责读

那么redis主从集群的整体架构是怎样的?

redis主从架构整体是怎样的?

我将redis主从集群设计为一主二从

redis集群 bind配置_docker

Q: 那么redisClient怎么知道写操作丢给master, 读操作丢给slave的?

A: 这个我们可以在springboot中配置一个Bean就能解决

@Bean public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){ return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED); }

这个bean中配置的就是读写策略,包括四种:

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
  • REPLICA:从slavereplica)节点读取
  • REPLICA_PREFERRED:优先从slavereplica)节点读取,所有的slave都不可用才读取master

怎么配置主从集群?

我推荐使用docker配置redis主从集群功能

我这里选择redis 7.0.9 版本

文件整体结构:

redis集群 bind配置_spring boot_02

大体步骤:

  1. 准备redis.conf配置文件
  2. 编写Dockerfile(这一步骤可以不需要)
  3. 编写docker-compose.yml文件

redis.conf

主节点的redis.conf

port 6379
bind 0.0.0.0
protected-mode no
daemonize no
# 数据库数量,设置为1
databases 1
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000
# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes
# RDB文件名称
dbfilename dump.rdb
# 文件保存的路径目录
dir ./
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no
# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
# 配置master密码
requirepass 123456
# 宕机后成为从要连接master的密码
masterauth 123456

从节点的redis.conf

port 6379
bind 0.0.0.0
protected-mode no
daemonize no
# 数据库数量,设置为1
databases 1
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000
# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes
# RDB文件名称
dbfilename dump.rdb
# 文件保存的路径目录
dir ./
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no
# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
replicaof 192.168.7.2 6379
# 成为master后的密码
requirepass 123456
# 连接master密码
masterauth 123456

从节点和主节点的区别在于: replicaof 192.168.7.2 6379

这里的192.168.7.2是master节点的ip, 我们可以在docker-compose.yml文件中配置master的ip

这些配置在前一篇文章中有讲解, 这里就不细讲咯

编写Dockerfile(可选)

这一步骤我只给他添加了几层layer

FROM redis:7.0.9
MAINTAINER zhazha<222@qq.com>
RUN apt update
RUN apt -y install iputils-ping
RUN apt -y install iproute2
RUN apt -y install net-tools
EXPOSE 6379
EXPOSE 16379
CMD redis-server /usr/local/etc/redis/redis.conf

编写docker-compose.yml

version: '3.9'

services:
  redis-master-6379:
    build: .
    restart: always
    privileged: true
    hostname: redis_6379
    container_name: redis_6379
    ports:
      - 6379:6379
      - 16379:16379
    volumes:
      - /root/redis_cluster/master/6379/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/master/6379/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.2
    command: redis-server /usr/local/etc/redis/redis.conf
  redis-slave-6380:
    build: .
    restart: always
    privileged: true
    hostname: redis_6380
    container_name: redis_6380
    ports:
      - 6380:6379
      - 16380:16379
    volumes:
      - /root/redis_cluster/slave/6380/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/slave/6380/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.3
    command: redis-server /usr/local/etc/redis/redis.conf
  redis-slave-6381:
    build: .
    restart: always
    privileged: true
    hostname: redis_6381
    container_name: redis_6381
    ports:
      - 6381:6379
      - 16381:16379
    volumes:
      - /root/redis_cluster/slave/6381/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /root/redis_cluster/slave/6381/data:/data
    networks:
      redis_cluster:
        ipv4_address: 192.168.7.4
    command: redis-server /usr/local/etc/redis/redis.conf
networks:
  redis_cluster:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.7.1/24

redis集群 bind配置_redis集群 bind配置_03

redis集群 bind配置_docker_04

进入主节点查看主从复制状态

127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.7.3,port=6379,state=online,offset=294,lag=0
slave1:ip=192.168.7.4,port=6379,state=online,offset=294,lag=0
master_failover_state:no-failover
master_replid:ce79d26f13b6dbc569630b65845d00d2359051b3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:294
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:294

看上图打印, 基本上没什么问题了

可以试试 set username admin 然后在另一个集群中 get username 试试就行了