当前位置: 首页 > news >正文

Redis05-进阶-主从

零、文章目录

Redis05-进阶-主从

1、搭建主从架构

(1)概述
  • 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

(2)集群概况
  • 我们搭建的主从集群共包含三个节点,一个主节点,两个从节点。操作系统是 CentOS7.9。
  • 这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
IP配置文件路径PORT角色
192.168.119.171/etc/redis/7001/redis.conf7001master
192.168.119.171/etc/redis/7002/redis.conf7002slave
192.168.119.171/etc/redis/7003/redis.conf7003slave
(3)准备实例配置
  • **创建目录:**要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。我们创建三个文件夹,名字分别叫7001、7002、7003。
# 进入/tmp目录
cd /etc/redis/
# 创建目录
mkdir 7001 7002 7003
  • 配置文件/etc/redis/7001/redis.conf 配置如下,这个是 master 节点的配置
# 允许所有 IP 连接
bind 0.0.0.0# 关闭保护模式 
protected-mode no# 以守护进程启动
daemonize yes# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 关闭AOF
appendonly no# redis实例的声明 IP
replica-announce-ip 192.168.119.171# 端口改成7001
port 7001
# rdb文件存储路径改成当前路径
dir /etc/redis/7001/
  • 配置文件/etc/redis/7002/redis.conf 配置如下,这个是 slave 节点的配置
# 允许所有 IP 连接
bind 0.0.0.0# 关闭保护模式 
protected-mode no# 以守护进程启动
daemonize yes# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 关闭AOF
appendonly no# redis实例的声明 IP
replica-announce-ip 192.168.119.171# 端口改成7002
port 7002
# rdb文件存储路径改成当前路径
dir /etc/redis/7002/# 开启主从关系
slaveof 192.168.119.171 7001
  • 配置文件/etc/redis/7003/redis.conf 配置如下,这个是 slave 节点的配置
# 允许所有 IP 连接
bind 0.0.0.0# 关闭保护模式 
protected-mode no# 以守护进程启动
daemonize yes# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 关闭AOF
appendonly no# redis实例的声明 IP
replica-announce-ip 192.168.119.171# 端口改成7003
port 7003
# rdb文件存储路径改成当前路径
dir /etc/redis/7003/# 开启主从关系
slaveof 192.168.119.171 7001
  • 配置说明:
    • **持久化配置:**持久化模式改为默认的RDB模式,AOF保持关闭状态。
    • 修改**bind**** 参数:** bind 0.0.0.0 允许所有 IP 连接。
    • **修改实例的声明IP:**虚拟机本身有多个IP,为了避免混乱,我们需要指定每一个实例的 IP 信息。
    • **修改每个实例的端口、工作目录:**修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录。
    • **为每个slave 节点开启主从关系:**slaveof 192.168.119.171 7001
(4)启动实例
  • 防止端口的问题,先将防火墙关闭
# 关闭防火墙
sudo systemctl stop firewalld
# 关闭防火墙开机启动
sudo systemctl disable firewalld
  • 我们打开3个ssh窗口,分别启动3个redis实例,启动命令:
# 第1个
redis-server /etc/redis/7001/redis.conf
# 第2个
redis-server /etc/redis/7002/redis.conf
# 第3个
redis-server /etc/redis/7003/redis.conf
  • 如果要一键停止,可以运行下面命令:
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown
(5)开启主从关系
  • 要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
  • 有临时和永久两种模式:
    • 永久:修改配置文件,在redis.conf中添加一行配置:slaveof <masterip> <masterport>
    • 临时:使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效)。
    • 注意:在5.0以后新增命令replicaof,与salveof效果一致。
  • 上面已经用配置文件实现了主从关系,现在演示命令方式。
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.119.171 7001# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 192.168.119.171 7001# 连接 7001
redis-cli -p 7001
# 查看状态
info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.119.171,port=7002,state=online,offset=56,lag=1
slave1:ip=192.168.119.171,port=7003,state=online,offset=56,lag=1
master_failover_state:no-failover
master_replid:9416e12727f8b889f6293c3eedcb9f07de1670d6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
(6)测试
  • 利用redis-cli连接7001,执行set num 123
  • 利用redis-cli连接7002,执行get num,再执行set num 666
127.0.0.1:7002> get num
"123"
127.0.0.1:7002> set num 666
(error) READONLY You can't write against a read only replica.
  • 利用redis-cli连接7003,执行get num,再执行set num 888
127.0.0.1:7003> get num
"123"
127.0.0.1:7003> set num 888
(error) READONLY You can't write against a read only replica.
  • 可以发现,只有在7001这个master节点上可以执行写操作,7002和7003这两个slave节点只能执行读操作。
(7)设置开机启动
  • 为了使 Redis 在系统启动时自动运行,可以创建一个 systemd 服务文件:
# master节点服务文件
vi /etc/systemd/system/redismaster.service[Unit]
Description=redismaster
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /tmp/7001/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target
  • 保存并退出后,重新加载 systemd 配置:
systemctl daemon-reload
  • 可以用下面这组命令来操作redis:
# 启动
systemctl start redismaster
# 停止
systemctl stop redismaster
# 重启
systemctl restart redismaster
# 查看状态
systemctl status redismaster
# 开机自启
systemctl enable redismaster
  • 同样配置 redisslave01 节点
# slave01节点服务文件
vi /etc/systemd/system/redisslave01.service[Unit]
Description=redisslave01
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /tmp/7002/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target
  • 同样配置 redisslave02 节点
# slave02节点服务文件
vi /etc/systemd/system/redisslave02.service[Unit]
Description=redisslave02
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /tmp/7003/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target

2、数据同步原理

(1)主从第一次执行全量同步
  • slave节点请求增量同步
  • master节点判断replid,发现不一致,拒绝增量同步
  • master将完整内存数据生成RDB,发送RDB到slave
  • slave清空本地数据,加载master的RDB
  • master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
  • slave执行接收到的命令,保持与master之间的同步

(2)如何判断是第一次同步数据
  • Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
  • offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
  • 因此slave做数据同步,必须向master声明自己的replication id 和offset,master才可以判断到底需要同步哪些数据。
(3)slave重启后执行增量同步

  • repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步。
(4)主从集群优化
  • 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
  • Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
  • 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力

相关文章:

  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据信息查看操作
  • 文心一言开发指南06——千帆大模型平台新手指南
  • redis常用集合操作命令
  • 4月27日星期日今日早报简报微语报早读
  • 力扣hot100_子串_python版本
  • 8.Excel:数据验证和下拉列表
  • 大学之大:索邦大学2025.4.27
  • AI翻译LangChain实现的一点有趣思考
  • femap许可冲突
  • DLMS 协议(Green Book) —— AARQ、AARE、RLRQ、RLRE 和 Security Payload 详解
  • 日语学习-日语知识点小记-进阶-JLPT-N2阶段(9):语法单词
  • Linux命令#文件操作
  • WinForm真入门(18)——DateTimePicker‌控件解析
  • 【NVM】管理不同版本的node.js
  • Simulink与C的联合仿真调试
  • 业务校验工具包-validate-utils介绍
  • 【数据可视化-39】2009-2019年亚马逊50大畅销书数据集可视化分析
  • 【网络原理】 网络编程套接字
  • 探索排序算法的奥秘(上):冒泡排序、选择排序、插入排序
  • Babel、core-js、Loader之间的关系和作用全解析
  • 人社部:就业政策储备充足,将会根据形势变化及时推出
  • 伊朗港口爆炸已致40人死亡
  • 新任浙江省委常委、杭州市委书记刘非开展循迹溯源学习调研
  • 清华成立人工智能医院,将构建“AI+医疗+教育+科研”闭环
  • 哈马斯同意释放剩余所有以色列方面被扣押人员,以换取停火五年
  • 交警不在就闯红灯?上海公安用科技手段查处非机动车违法