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压力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/81200.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/81200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小结:ipsec-ike

IPSec 手动配置与自动配置&#xff08;IKE动态协商&#xff09; 手动配置IPSec 逻辑图 #mermaid-svg-eNMnNEwnoTjF8fkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eNMnNEwnoTjF8fkV .error-icon{fill:#552222;}…

潇洒郎: 100% 成功搭建Docker私有镜像仓库并管理、删除镜像

1、Registry Web管理界面 2、拉取Registry-Web镜像 创建配置文件 tee /opt/zwx-registry/web-config.yml <<-EOF registry:url: http://172.28.73.90:8010/v2name: registryreadonly: falseauth:enabled: false EOF 拉取docker-registry-web镜像并绑定Registry仓库 …

《机器学习中的过拟合与模型复杂性:理解与应对策略》

《机器学习中的过拟合与模型复杂性&#xff1a;理解与应对策略》 摘要 在机器学习中&#xff0c;过拟合是模型在训练数据上表现良好但在新数据上泛化能力差的现象。本文深入探讨了过拟合与模型复杂性之间的关系&#xff0c;分析了复杂模型导致过拟合的原因&#xff0c;并介绍…

linux中sigint和sigterm的区别

SIGINT 和 SIGTERM 是在 Unix 及类 Unix 系统&#xff08;包括 Linux&#xff09;中用于进程间通信的信号&#xff0c;它们都可以用于请求进程终止&#xff0c;区别如下&#xff1a; 1、信号编号与定义 在信号机制里&#xff0c;每个信号都有对应的编号&#xff0c;这便于系统…

一套SaaS ERP管理系统源码,支持项目二开商用,SpringBoot+Vue+ElementUI+UniAPP

ERP管理系统源码&#xff0c;一款适用于小微企业的SaaS ERP管理系统源码, 采用最新的技术栈开发(SpringBootVueElementUIUniAPP)&#xff0c;让企业简单上云。 专注于小微企业的应用需求&#xff0c;如企业基本的进销存、询价&#xff0c;报价, 采购、销售、MRP生产制造、品质…

2025 新生 DL-FWI 培训

摘要: 本贴给出 8 次讨论式培训的提纲, 每次培训 1 小时. 1. Basic concepts 主动学习: 提问, 理解, 继续追问. 通过不断迭代, 逐步提升问题的质量, 加深理解. 1.1 Seismic exploration 问 DeepSeek (下同): 为什么进行地震勘探? 问: 地震勘探一般的深度是多少? 1.2 Sesmi…

mac电脑pytest生成测试报告

时隔了好久再写代码&#xff0c;感觉我之前的积累都白费了&#xff0c;全部忘记了&#xff0c;看来每一步都有记录对于我来说才是最好的。 最近又要重新搞接口自动化&#xff0c;然而是在mac电脑&#xff0c;对于我长期使用windows的人来说真的是个考验&#xff0c;对此次过程…

神经辐射场(NeRF)技术解析:3D重建与虚拟世界的未来

神经辐射场&#xff08;NeRF&#xff09;技术解析&#xff1a;3D重建与虚拟世界的未来 ——从算法突破到元宇宙基础设施的演进之路 摘要 本文通过算法演进图谱、训练流程解析、PyTorch代码实战及产业应用洞察&#xff0c;构建从学术创新到工程落地的完整技术框架。实验数据显…

ES搜索知识

GET /categories/1/10?name手机 // 按名称过滤 GET /categories/1/10?type电子产品 // 按类型过滤 GET /categories/1/10?name手机&type电子产品 // 组合过滤 查询参数 ApiOperation(value "获取商品分类分页列表")GetMapping("{page}/{limit}")…

【Docker】Docker拉取部分常用中间件

一、拉取MySQL 这里以Docker拉取MySQL5.7为例 #拉取镜像 docker pull mysql:5.7 docker run -d --name oj-mysql -p 3306:3306 -e "TZAsia/Shanghai" -e "MYSQL_ROOT_PASSWORD123456" mysql:5.7 -e 参数用于设置容器内的环境变量。TZ 是用于设置时区的环…

在 Ubuntu 上离线安装 ClickHouse

在 Ubuntu 上离线安装 ClickHouse 的步骤如下: 一.安装验证 # 检查服务状态 sudo systemctl status clickhouse-server #删除默认文件 sudo rm /etc/clickhouse-server/users.d/default-password.xml # 使用客户端连接 clickhouse-client --password

Linux 部署以paddle Serving 的方式部署 PaddleOCR CPU版本

强烈建议您在Docker内构建Paddle Serving&#xff0c;更多镜像请查看Docker镜像列表。 提示-1&#xff1a;Paddle Serving项目仅支持Python3.6/3.7/3.8/3.9&#xff0c;接下来所有的与Python/Pip相关的操作都需要选择正确的Python版本。 提示-2&#xff1a;以下示例中GPU环境均…

AOSP Android14 Launcher3——Launcher的状态介绍LauncherState类

Launcher3中有一个跟Launcher状态相关的类&#xff0c;叫LauncherState LauncherState 是 Launcher3 中定义各种用户界面状态的抽象基类。你可以把它想象成一个状态机&#xff0c;定义了 Launcher 可能处于的不同视觉和交互模式&#xff0c;例如主屏幕、所有应用列表、最近任务…

鸿蒙NEXT开发动画(方块动画旋转)

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件&#xff0c;代码如下&#xff1a; /*** SpinKit 风格的旋转加载动画组件。** component* param spinSize - 动画容器大小&#xff08;必须为正数&#xff09;* param spinColor - 动画颜色&#xff08;支持资源引用&#xf…

深入解析Java架构师面试:从核心技术到AI应用

深入解析Java架构师面试&#xff1a;从核心技术到AI应用 在互联网大厂的Java求职者面试中&#xff0c;技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构&#xff08;拥有十年研发及架构设计经验&#xff09;之间的对话为背景&#xff0c;详细展示了…

Qt窗口关闭特效:自底而上逐渐消失

废话不多说&#xff0c;直接上代码&#xff1a; 构造函数&#xff1a; MyWidget(QWidget *parent nullptr) {// 设置窗口属性&#xff1a;支持透明背景setAttribute(Qt::WA_TranslucentBackground);// 移除窗口边框setWindowFlags(Qt::FramelessWindowHint);} closeEvent函数…

AI对IT行业的重塑:挑战与机遇并存的技术革命

一、必要性&#xff1a;AI成为IT行业的基础设施 在云计算、大数据和物联网构成的数字生态中&#xff0c;AI技术已成为IT行业的"水电煤"。以微软Azure为例&#xff0c;其AI云服务支撑着全球超过85%的《财富》500强企业&#xff0c;通过机器学习模型自动优化服务器集群…

[论文梳理] 足式机器人规划控制流程 - 接触碰撞的控制 - 模型误差 - 自动驾驶车的安全合规(4个课堂讨论问题)

目录 问题 1&#xff1a;足式机器人运动规划 & 控制的典型流程 (pipline) 1.1 问题 1.2 目标 1.3 典型流程&#xff08;Pipeline&#xff09; 1.3.1 环境感知&#xff08;Perception&#xff09; 1.3.2 高层规划&#xff08;High-Level Planning&#xff09; 1.3.3 …

阿里云短信接入实现示例

1&#xff09;构建Springboot项目 2) 添加依赖 <!--阿里云短信--> <dependency><groupId>com.aliyun</groupId><artifactId>alibabacloud-dysmsapi20170525</artifactId><version>3.0.0</version> </dependency><…

逻辑回归之参数选择:从理论到实践

一、逻辑回归概述 逻辑回归虽然名字中带有“回归”&#xff0c;但它是一种用于处理二分类或多分类问题的算法。其核心思想是通过构建一个线性模型&#xff0c;将输入特征进行线性组合&#xff0c;再利用逻辑函数&#xff08;如Sigmoid函数&#xff09;将线性组合的结果映射到0…