Redis 主从搭建笔记

Redis 主从搭建笔记

学习视频:

Redis入门到精通:

https://url90.ctfile.com/d/51188890-157896900-8b14ca?p=3489 (访问密码: 3489)

一、主从架构核心说明

Redis 主从复制(Master-Slave)是实现数据冗余、读写分离的基础架构:

  • 主库(Master):负责写操作,可同步数据到从库;

  • 从库(Slave/Replica):只读(默认),从主库同步数据,分担读压力;

  • 核心价值:数据备份、读写分离、故障恢复(需配合哨兵/集群实现自动切换)。

二、前置准备

1. 环境要求

  • 操作系统:Linux(CentOS 7/8、Ubuntu 20.04 等,本文以 CentOS 7 为例);

  • Redis 版本:建议 5.0+(本文用 6.2.18,5.0+ 配置项有调整,如 slaveofreplicaof);

  • 节点规划(示例):

    |--------|------------------------------|------|
    | 角色 | IP | 端口 |
    | Master | [192.168.1.1](192.168.1.1) | 6379 |
    | Slave1 | [192.168.1.2](192.168.1.2) | 6380 |
    | Slave2 | [192.168.1.3](192.168.1.3) | 6381 |

2. 基础环境配置

复制代码
# 关闭防火墙(生产建议仅开放Redis端口)
systemctl stop firewalld && systemctl disable firewalld

# 关闭SELinux
setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 安装依赖(编译Redis需要)
yum install -y gcc-c++ make

3. Redis 安装(所有节点)

复制代码
bash 复制代码
# 下载并解压Redis
cd /usr/local/src
wget https://download.redis.io/releases/redis-6.2.18.tar.gz
tar -zxvf redis-6.2.18.tar.gz
cd redis-6.2.18

# 编译安装(PREFIX指定安装目录)
make && make PREFIX=/usr/local/redis install

# 创建目录(配置、数据、日志、pid)
mkdir -p /usr/local/redis/{conf,data,log,pid}

# 复制默认配置文件到自定义目录
cp /usr/local/src/redis-6.2.18/redis.conf /usr/local/redis/conf/

三、主库(Master)配置

1. 修改主库配置文件

编辑 /usr/local/redis/conf/redis.conf,关键配置如下(注释掉默认项,新增/修改):

复制代码
bash 复制代码
# 1. 基础配置
bind 0.0.0.0                # 绑定所有IP(生产可指定内网IP)
port 6379                   # 端口
daemonize yes               # 后台运行
pidfile /usr/local/redis/pid/redis_6379.pid  # PID文件路径
logfile /usr/local/redis/log/redis_6379.log  # 日志文件路径
dir /usr/local/redis/data/  # 数据目录(RDB/AOF文件存放)

# 2. 安全配置
protected-mode no           # 关闭保护模式(否则非本机无法连接)
requirepass 123456          # 主库密码(生产建议复杂密码)

# 3. 持久化配置(必开!避免主库重启后从库同步空数据)
save 900 1                  # 900秒内至少1次写操作触发RDB
save 300 10                 # 300秒内至少10次写操作触发RDB
save 60 10000               # 60秒内至少10000次写操作触发RDB
rdbcompression yes          # RDB压缩
dbfilename dump.rdb         # RDB文件名

# 4. 复制相关(主库默认开启,无需额外配置)
repl-disable-tcp-nodelay no # 优化网络延迟
repl-backlog-size 1gb       # 复制积压缓冲区大小(应对从库断连后增量同步)

2. 启动主库

复制代码
bash 复制代码
# 启动命令(指定配置文件)
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

# 验证启动状态
ps -ef | grep redis-server | grep 6379
# 或通过Redis客户端连接
/usr/local/redis/bin/redis-cli -p 6379 -a 123456 ping  # 返回PONG则正常

四、从库(Slave)配置

以 Slave1(6380 端口)为例,Slave2 仅需修改端口为 6381,其余配置一致。

1. 复制并修改从库配置文件

复制代码
bash 复制代码
# 复制配置文件(区分端口)
cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis_6380.conf

编辑 /usr/local/redis/conf/redis_6380.conf,关键配置如下:

复制代码
bash 复制代码
# 1. 基础配置(修改端口、PID、日志路径)
bind 0.0.0.0
port 6380                   # 从库端口
daemonize yes
pidfile /usr/local/redis/pid/redis_6380.pid
logfile /usr/local/redis/log/redis_6380.log
dir /usr/local/redis/data/

# 2. 安全配置
protected-mode no
requirepass 123456          # 从库自身密码(建议和主库一致)
masterauth 123456           # 连接主库的密码(必须和主库requirepass一致)

# 3. 核心:指定主库地址(Redis5.0+用replicaof,5.0-用slaveof)
replicaof 192.168.1.1 6379  # 主库IP+端口

# 4. 从库只读(默认yes,生产建议保持)
replica-read-only yes

# 5. 持久化(建议开启,避免从库重启后重新全量同步)
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump_6380.rdb

2. 启动从库

复制代码
bash 复制代码
# 启动Slave1
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6380.conf

# 启动Slave2(修改配置文件端口为6381后)
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6381.conf

# 验证启动状态
ps -ef | grep redis-server | grep -E "6380|6381"

五、验证主从复制

1. 主库查看从库状态

复制代码
bash 复制代码
# 连接主库
/usr/local/redis/bin/redis-cli -p 6379 -a 123456

# 查看复制信息
127.0.0.1:6379> info replication

输出关键内容(connected_slaves 显示从库数量,slave0/slave1 显示从库信息):

复制代码
bash 复制代码
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.2,port=6380,state=online,offset=123,lag=0
slave1:ip=192.168.1.3,port=6381,state=online,offset=123,lag=0
...

2. 从库查看主库状态

复制代码
bash 复制代码
# 连接Slave1
/usr/local/redis/bin/redis-cli -p 6380 -a 123456

# 查看复制信息
127.0.0.1:6380> info replication

输出关键内容(role=slavemaster_link_status=up 表示连接正常):

复制代码
bash 复制代码
# Replication
role:slave
master_host:192.168.1.1
master_port:6379
master_link_status:up  # up表示主从连接正常,down则异常
...

3. 数据同步验证

复制代码
bash 复制代码
# 主库写入数据
/usr/local/redis/bin/redis-cli -p 6379 -a 123456 set name "redis-master"

# 从库读取数据(能读到则同步正常)
/usr/local/redis/bin/redis-cli -p 6380 -a 123456 get name  # 返回"redis-master"
/usr/local/redis/bin/redis-cli -p 6381 -a 123456 get name  # 返回"redis-master"

# 从库尝试写入(默认只读,会报错)
/usr/local/redis/bin/redis-cli -p 6380 -a 123456 set age 18
# 报错:(error) READONLY You can't write against a read only replica.

六、临时配置主从(应急场景)

若需临时配置(重启失效),可直接在从库客户端执行:

复制代码
bash 复制代码
# 连接从库
/usr/local/redis/bin/redis-cli -p 6380 -a 123456

# 临时指定主库
127.0.0.1:6380> replicaof 192.168.1.1 6379

# 临时设置主库密码
127.0.0.1:6380> config set masterauth 123456

七、常见问题排查

  • 原因1:防火墙未开放端口 → 开放Redis端口(6379/6380/6381);

  • 原因2:主库开启保护模式 → 主库配置 protected-mode no

  • 原因3:主库绑定IP为[127.0.0.1](127.0.0.1) → 主库配置 bind 0.0.0.0 或内网IP;

  • 原因4:masterauth 密码错误 → 核对主库 requirepass 和从库 masterauth

  • 原因5:网络不通 → ping 主库IPtelnet 主库IP 6379 验证。

2. 主从数据不同步

  • 原因1:主库未开启持久化 → 主库配置RDB/AOF,避免主库重启后从库同步空数据;

  • 原因2:从库启动早于主库 → 重启从库;

  • 原因3:复制积压缓冲区不足 → 主库增大 repl-backlog-size(如1gb)。

3. 从库无法写入

  • 默认配置 replica-read-only yes → 如需写入,改为 no(生产不建议)。

八、生产注意事项

  1. 主库必须开启持久化(RDB/AOF),否则主库重启后从库会同步空数据;

  2. 从库数量建议3-5个,过多会增加主库复制压力;

  3. 可配置级联复制(从库作为其他从库的主库),减轻主库压力;

  4. 主从架构无自动故障切换,生产需搭配 Redis哨兵(Sentinel)Redis集群(Cluster)

  5. 密码建议通过配置文件设置,避免明文在命令行暴露;

  6. 定期备份主库RDB/AOF文件,防止数据丢失;

  7. 生产环境建议给Redis配置系统服务(systemd),方便启停/开机自启。

九、Redis 系统服务配置(可选)

创建 /usr/lib/systemd/system/redis.service,内容如下:

复制代码
bash 复制代码
[Unit]
Description=Redis Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 -a 123456 shutdown
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

复制代码
bash 复制代码
systemctl daemon-reload
systemctl start redis && systemctl enable redis
相关推荐
云老大TG:@yunlaoda3607 小时前
如何确保数据在腾讯云国际站代理商的归档存储服务中的安全性?
数据库·云计算·腾讯云
NocoBase7 小时前
如何快速搭建一个替换 Excel 的系统?(完整指南)
数据库·低代码·开源·excel·个人开发·零代码·无代码
7 小时前
TIDB——TIDB Server
数据库·分布式·tidb
Mr_wilson_liu7 小时前
通过DBeaver22.0.5 连接数据库ck(clickhouse)、pg(postgres)
数据库·clickhouse
Ashley_Amanda7 小时前
FICO 校验与替代技术点
数据库
碧海潮生_CC7 小时前
【三维重建笔记】02 OpenMVS 流程主要 API 整理
笔记·三维重建
黑白极客7 小时前
项目启动时报错找不到UserDetailsService
数据库·oracle
武子康7 小时前
Java-197 消息队列应用场景:缓存预热+限流排队+Redis Lua 扣库存+MQ 削峰填谷
java·redis·缓存·性能优化·消息队列·rabbitmq·java-rabbitmq
深蓝海拓9 小时前
PySide6从0开始学习的笔记(四)QMainWindow
笔记·python·学习·pyqt