前言
本章内容
- 为什么需要主从集群?
- 主从架构整体是怎样的?
- 怎么配置主从集群?
redis为什么需要主从集群?
单节点redis的处理能力是有上限的, 所以我们需要配置主从集群
配置主从集群的最终目的是 读写分离
master 节点主要负责写
slave 节点主要负责读
那么redis主从集群的整体架构是怎样的?
redis主从架构整体是怎样的?
我将redis主从集群设计为一主二从
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
:从slave
(replica
)节点读取REPLICA_PREFERRED
:优先从slave
(replica
)节点读取,所有的slave
都不可用才读取master
怎么配置主从集群?
我推荐使用docker配置redis主从集群功能
我这里选择redis 7.0.9 版本
文件整体结构:
大体步骤:
- 准备redis.conf配置文件
- 编写Dockerfile(这一步骤可以不需要)
- 编写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
进入主节点查看主从复制状态
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
试试就行了