节点角色 | IP 地址 | 端口 | 状态 |
---|---|---|---|
主节点(master) | 192.168.153.221 | 7001 | 运行正常 |
从节点(slave) | 192.168.153.222 | 7002 | 连接主节点同步中 |
Redis 主从复制简述:
-
主节点:负责写入操作,同时将数据同步到从节点。
-
从节点:从主节点获取数据副本,通常用于读操作,帮助减轻主节点的负载。
环境配置(两台服务器都要做)
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭selinux 安全策略
setenforce 0
# 永久 注意需要重启才能生效。
sed -i 's/enforcing/disabled/' /etc/selinux/config
安装 Redis (两台服务器都要做)
# 安装 Redis 依赖的软件包:gcc(GNU 编译器)、make(构建工具)、wget(下载工具)、tcl(测试工具)
sudo yum install -y gcc make wget tcl
# 下载 Redis 的压缩包版本 6.2.14
wget https://download.redis.io/releases/redis-6.2.14.tar.gz
# 解压下载的 Redis 源码包
tar xzf redis-6.2.14.tar.gz
#重命名redis
mv redis-6.2.14 redis
# 进入解压后的 Redis 目录
cd redis
# 使用 `make` 命令进行编译,`-j$(nproc)` 选项会并行使用所有可用的 CPU 核心来加速编译过程
make -j$(nproc)
# 安装 Redis,将 Redis 安装到 `/usr/local/redis` 目录
sudo make PREFIX=/usr/local/redis install
# 创建 Redis 所需的目录,例如配置文件目录和数据目录
sudo mkdir -p /etc/redis /var/lib/redis
# 复制 Redis 默认的配置文件到 `/etc/redis/` 目录
sudo cp redis.conf /etc/redis/redis.conf
添加到systemd 管理
#创建 Redis 的 systemd 服务单元文件
sudo vim /etc/systemd/system/redis.service[Unit]
Description=Redis In-Memory Data Store
Documentation=http://redis.io/documentation
After=network.target[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
User=root
Group=root
PrivateTmp=yes
LimitNOFILE=65536[Install]
WantedBy=multi-user.target#重新加载并启动服务:
sudo systemctl daemon-reload
sudo systemctl start redis
#查看状态
sudo systemctl status redis
#设置开机自启
systemctl enable redis配置环境变量
#使用编辑器打开 .bash_profile 文件:
vim ~/.bash_profile
添加:
export PATH=$PATH:/usr/local/redis/bin#执行以下命令,使新的配置生效:
source ~/.bash_profile
#查看版本
redis-server --version
配置主节点 (192.168.153.221)
#编辑主节点的 Redis 配置文件
sudo vim /etc/redis/redis.conf修改以下配置项:
bind 0.0.0.0 # 允许所有IP连接
protected-mode no # 关闭保护模式
daemonize yes # 以守护进程运行
port 7001 #配置主节点端口为7001
requirepass 123456 # 设置密码(可选但推荐)#保存并退出,然后启动 Redis 服务:
sudo systemctl start redis
sudo systemctl enable redis
#查看状态
sudo systemctl status redis
配置从节点 (192.168.153.222)
#编辑从节点的 Redis 配置文件:
sudo vim /etc/redis/redis.conf修改以下配置项:
bind 0.0.0.0 # 允许所有IP连接
protected-mode no # 关闭保护模式
daemonize yes # 以守护进程运行
port 7002 #配置从节点端口为7002
#slaveof 192.168.153.221 7001 # 指定主节点IP和端口(旧版本的配置(Redis 4.x 及之前版本):
replicaof 192.168.153.221 7001 # 指定主节点IP和端口(新版本的配置(Redis 5.x 及之后版本):
masterauth 123456 # 如果主节点设置了密码,需要填写
requirepass 123456 # 设置与主节点相同的密码(可选)#保存并退出,然后启动 Redis 服务:
sudo systemctl start redis
sudo systemctl enable redis
#查看状态
sudo systemctl status redis
验证主从复制
#在主节点上(192.168.153.221)
[root@localhost]# redis-cli -p 7001
127.0.0.1:7001> auth 123456
OK
127.0.0.1:7001> ping
PONG
127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.153.222,port=7002,state=online,offset=126,lag=1
master_failover_state:no-failover
master_replid:012561c18193a46de3bec19570e5fcd9bf66672d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126
127.0.0.1:7001> SLAVEOF 192.168.153.222 7002
OK
127.0.0.1:7001> exit
#在从节点上面(192.168.153.222)
[root@localhost redis]# redis-cli -p 7002
127.0.0.1:7002> auth 123456
OK
127.0.0.1:7002> ping
PONG
127.0.0.1:7002> info replication
# Replication
role:slave
master_host:192.168.153.221
master_port:7001
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:168
slave_repl_offset:168
master_link_down_since_seconds:85
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:012561c18193a46de3bec19570e5fcd9bf66672d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
127.0.0.1:7002> SLAVEOF 192.168.153.221 7001
OK Already connected to specified master
报错:从节点显示 master_link_status:down 原因 复制循环了,必须为master_link_status:up
#解决方法:
在主节点 7001 上执行:(这个命令用于 将 Redis 实例恢复为独立的主节点(Master),取消它作为其他节点的从节点)
redis-cli -p 7001 -a 123456 SLAVEOF NO ONE在从节点 7002 上执行命令:
redis-cli -p 7002 -a 123456 INFO replication[root@localhost redis]# redis-cli -p 7002 -a 123456 INFO replication
# Replication
role:slave
master_host:192.168.153.221
master_port:7001
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:182
slave_repl_offset:182
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4ff822a26d919b9b0651d3381a421a0bd241c1aa
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:169
repl_backlog_histlen:14#如何确认是否成功配置主从,出现以下情况表示成功。
主节点:
role:master
从节点:
role:slave
master_link_status:up#测试是否可以同步数据
主节点:
[root@localhost ~]# redis-cli -p 7001
127.0.0.1:7001> auth 123456
OK
127.0.0.1:7001> SET mykey "Hello, Redis!"
OK
127.0.0.1:7001> 从节点:
[root@localhost redis]# redis-cli -p 7002
127.0.0.1:7002> auth 123456
OK
127.0.0.1:7002> get mykey
"Hello, Redis!"
127.0.0.1:7002> 成功!
RDB 持久化配置
RDB 是快照形式的持久化,在 redis.conf 中配置:
#编辑redis.conf
vim /etc/redis/redis.conf
#快速查找 save 3600 1save 900 1 # 900秒(15分钟)内至少有1个key被改变
save 300 10 # 300秒(5分钟)内至少有10个key被改变
save 60 10000 # 60秒内至少有10000个key被改变dbfilename dump.rdb # RDB文件名
dir /var/lib/redis # RDB文件保存目录
stop-writes-on-bgsave-error yes # 当后台保存出错时停止写入
rdbcompression yes # 压缩RDB文件,(影响CPU非必要开启)
rdbchecksum yes # 对RDB文件进行校验
AOF 持久化配置
AOF 记录所有写操作命令:
#编辑redis.conf
vim /etc/redis/redis.confappendonly yes # 启用AOF持久化
appendfilename "appendonly.aof" # AOF文件名# 同步策略(选择一种):
appendfsync always # 每次写操作都同步,最安全但性能最低
appendfsync everysec # 每秒同步一次,推荐设置
appendfsync no # 由操作系统决定何时同步,性能最好但可能丢失数据auto-aof-rewrite-percentage 100 # AOF文件增长比例超过100%时触发重写
auto-aof-rewrite-min-size 64mb # AOF文件最小重写大小
aof-load-truncated yes # 加载被截断的AOF文件
#重启服务以生效
systemctl restart redis
Redis 数据恢复
RDB 数据恢复
方法1:
自动恢复:
-
Redis 启动时会自动检查配置的
dir
目录下的dump.rdb
文件 -
如果找到 RDB 文件,Redis 会自动加载其中的数据
方法2:
手动恢复:
# 停止Redis服务
systemctl stop redis# 将备份的RDB文件复制到Redis数据目录
cp /backup/dump.rdb /var/lib/redis/dump.rdb# 启动Redis
systemctl start redis
特点
-
恢复速度快(二进制格式,直接加载到内存)
-
只能恢复到最后一次快照时的数据状态
-
恢复期间Redis不可用
AOF 数据恢复
方法1:
自动恢复:
-
如果启用了 AOF (
appendonly yes
),Redis 会优先使用 AOF 文件恢复 -
Redis 会重新执行 AOF 文件中的所有写命令来重建数据集
方法2:
手动恢复:
# 停止Redis服务
systemctl stop redis# 将备份的AOF文件复制到Redis数据目录
cp /backup/appendonly.aof /var/lib/redis/appendonly.aof# 启动Redis
systemctl start redis
特点
-
恢复速度较慢(需要重新执行所有命令)
-
可以恢复到更近的数据状态(取决于同步策略)
-
支持部分恢复(可编辑 AOF 文件删除错误命令)
混合恢复(RDB+AOF)
如果同时启用了 RDB 和 AOF:
-
Redis 4.0+ 会优先使用 AOF 文件恢复(因为 AOF 通常包含更完整的数据)
-
如果 AOF 不可用,会回退到使用 RDB 文件
redis-cli
常用命令:
命令 | 描述 | 示例 |
---|---|---|
SET | 设置键的值 | redis-cli SET key value |
GET | 获取键的值 | redis-cli GET key |
DEL | 删除键 | redis-cli DEL key |
EXISTS | 检查键是否存在 | redis-cli EXISTS key |
INCR | 对键进行自增操作 | redis-cli INCR key |
DECR | 对键进行自减操作 | redis-cli DECR key |
MSET | 一次设置多个键值对 | redis-cli MSET key1 value1 key2 value2 |
MGET | 一次获取多个键的值 | redis-cli MGET key1 key2 |
EXPIRE | 设置键的过期时间(单位:秒) | redis-cli EXPIRE key 3600 |
TTL | 查看键的剩余生存时间 | redis-cli TTL key |
LPUSH | 将元素推入列表的左端 | redis-cli LPUSH listname value |
RPUSH | 将元素推入列表的右端 | redis-cli RPUSH listname value |
LPOP | 从列表的左端弹出元素 | redis-cli LPOP listname |
RPOP | 从列表的右端弹出元素 | redis-cli RPOP listname |
SADD | 向集合中添加元素 | redis-cli SADD setname value |
SREM | 从集合中移除元素 | redis-cli SREM setname value |
HSET | 向哈希中添加一个键值对 | redis-cli HSET hashname field value |
HGET | 获取哈希中的某个字段的值 | redis-cli HGET hashname field |
HDEL | 删除哈希中的某个字段 | redis-cli HDEL hashname field |
ZADD | 向有序集合中添加成员 | redis-cli ZADD zsetname score member |
ZREM | 从有序集合中移除成员 | redis-cli ZREM zsetname member |
SLAVEOF | 让当前节点成为从节点并指定主节点 | redis-cli SLAVEOF <master-ip> <master-port> |
INFO replication | 查看复制状态 | redis-cli INFO replication |
MONITOR | 实时监控 Redis 服务器的请求 | redis-cli MONITOR |
CLIENT LIST | 查看当前所有连接的客户端 | redis-cli CLIENT LIST |
INFO | 查看 Redis 实例的统计信息 | redis-cli INFO |
FLUSHDB | 删除当前数据库的所有键 | redis-cli FLUSHDB |
FLUSHALL | 删除所有数据库的所有键 | redis-cli FLUSHALL |
SELECT | 选择数据库(默认是数据库 0) | redis-cli SELECT 1 |
AUTH | 认证 Redis 实例(如果设置了密码) | redis-cli AUTH password |
SAVE | 强制保存当前数据库到磁盘 | redis-cli SAVE |
BGSAVE | 异步保存当前数据库到磁盘 | redis-cli BGSAVE |
KEYS | 查看所有匹配的键 | redis-cli KEYS pattern |
SCAN | 逐步迭代数据库中的键(适合大数据量) | redis-cli SCAN 0 |
exit | 退出 redis-cli 客户端 | exit |
这个表格总结了 Redis CLI 常用的命令和操作,帮助你快速进行 Redis 数据库的管理与操作。
查看redis.conf 文件中关键配置项
配置项 | 说明 | 示例 |
---|---|---|
bind | 指定 Redis 实例绑定的 IP 地址 | bind 127.0.0.1 |
port | 指定 Redis 实例监听的端口号 | port 6379 |
protected-mode | 启用或禁用 Redis 的保护模式 | protected-mode yes |
requirepass | 设置访问 Redis 的密码 | requirepass mypassword |
replicaof (或 slaveof ) | 配置当前实例为从节点,指定主节点地址和端口 | replicaof 192.168.1.100 6379 |
masterauth | 设置连接主节点时的密码 | masterauth mymasterpassword |
daemonize | 是否以后台进程运行 Redis | daemonize yes |
Redis 持久化(RDB 和 AOF)相关的常见配置项
配置项 | 说明 | 示例 |
---|---|---|
save 900 1 | 900秒内至少有1个key被改变 | save 900 1 |
save 300 10 | 300秒内至少有10个key被改变 | save 300 10 |
save 60 10000 | 60秒内至少有10000个key被改变 | save 60 10000 |
dbfilename | RDB文件名 | dbfilename dump.rdb |
dir | RDB文件保存目录 | dir /var/lib/redis |
stop-writes-on-bgsave-error | 当后台保存出错时停止写入 | stop-writes-on-bgsave-error yes |
rdbcompression | 是否压缩RDB文件 | rdbcompression yes |
rdbchecksum | 对RDB文件进行校验 | rdbchecksum yes |
appendonly | 启用AOF持久化 | appendonly yes |
appendfilename | AOF文件名 | appendfilename "appendonly.aof" |
appendfsync | AOF同步策略 | appendfsync everysec |
auto-aof-rewrite-percentage | AOF文件增长百分比超过此值时触发重写 | auto-aof-rewrite-percentage 100 |
auto-aof-rewrite-min-size | AOF文件最小重写大小 | auto-aof-rewrite-min-size 64mb |
aof-load-truncated | 加载被截断的AOF文件 | aof-load-truncated yes |