主从复制

原理

一台主服务器配多台从服务器,主服务器宕机后,从服务器挑选一台顶上去。

从服务器同步主服务器的数据,这个同步是单向的,并且从服务器不能设置值,否则会造成数据的混乱

功能

0.故障处理:slave故障,master故障
1.解决机器故障;容量瓶颈;QPS瓶颈
2.一主一从,一主多从
3.做读写分离
4.做数据副本
5.扩展数据性能
6.一个maskter可以有多个slave
7.一个slave只能有一个master
8.数据流向是单向的,从master到slave

主从配置操作

# 6379是主,6380是从,在6380上执行(去从库配置,链接主库)
1.在从库执行(链接主库的主机和端口)
slaveof 127.0.0.1 6379
# 断开关系,取消复制,不会把之前的数据清除
slaveof no one
2.配置文件(配在从库的配置文件中)
slaveof 127.0.0.1 6379
# 从库节点只读,因为可读可写,数据会乱
slave-read-only yes # docker配置一主两从
# docker学习:https://www.cnblogs.com/hkwJsxl/p/17164139.html
'''
cd /home/
mkdir -p redis1/conf redis1/data redis2/conf redis2/data redis3/conf redis3/data mkdir /home/conf
vim /home/conf/redis.conf
# redis.conf配置(10.0.0.10是虚拟机的ip)
daemonize no
pidfile redis.pid
bind 0.0.0.0
protected-mode no
port 6379
timeout 0
logfile redis.log
dbfilename dump.rdb
dir ./
slaveof 10.0.0.10 6379
# 主机是no,从机是yes
slave-read-only yes cp /home/conf/redis.conf /home/redis1/conf/redis.conf
cp /home/conf/redis.conf /home/redis2/conf/redis.conf
cp /home/conf/redis.conf /home/redis3/conf/redis.conf docker run -p 6379:6379 --name redis_6379 -v /home/redis1/conf/:/etc/redis/ -v /home/redis1/data:/data -d redis:redis7 redis-server /etc/redis/redis.conf
docker run -p 6378:6379 --name redis_6378 -v /home/redis2/conf/:/etc/redis/ -v /home/redis2/data:/data -d redis:redis7 redis-server /etc/redis/redis.conf
docker run -p 6377:6379 --name redis_6377 -v /home/redis3/conf/:/etc/redis/ -v /home/redis3/data:/data -d redis:redis7 redis-server /etc/redis/redis.conf info replication
'''

复制常见问题

  • 读写分离

    • 读流量分摊到从节点

    • 可能遇到问题:复制数据延迟,读到过期数据,从库节点故障

  • 主从配置不一致

    • maxmemory不一致:丢失数据

    • 数据结构优化参数:主节点做了优化,从节点没有设置优化,会出现一些问题

  • 规避全量复制

    • 第一次全量复制,不可避免:小主节点,低峰(夜间)

    • 节点运行id不匹配:主节点重启(运行id变化)

    • 复制挤压缓冲区不足:增大复制缓冲区大小,rel_backlog_size

  • 规避复制风暴

    • 单主节点复制风暴,主节点重启,所有从节点复制

子进程开销和优化

cpu

开销:rdbaof文件生成,属于cpu密集型

优化:不做cpu绑定,不和cpu密集型的服务一起部署

内存

开销:fork内存开销,copy-on-write,

优化:单机部署尽量少重写

硬盘

开销:aofrdb写入,可以结合分析工具使用

优化:

  • 不要和高硬盘负载的服务部署在一起:存储服务,消息队列
  • aof重写期间,不要对aof进行追加:no-appendfsync-on-rewrite=yes
  • 根据写入量决定磁盘类型:例如ssd
  • 单机多实例持久化考虑分盘

两大阻塞

fork阻塞:CPU的阻塞

Redis中,众多因素导致Redis单机内存不能过大。

  • 当面对请求暴增时,需要从库扩容,如果单机内存过大会导致扩容时间过长;
  • 当主机宕机后,切换主机需要重新挂载从库,Redis内存过大会导致挂载速度过慢;
  • 持久化过程中的fork操作

fork操作

fork是同步操作,与内存量息息相关:内存越大,耗时越长,跟机型也有关系

info:latest_fok_usec:查看持久化执行时间

改善fork:

  • 有限使用无机或高效支持fork操作的虚拟化技术

  • 控制redis实例最大可用内存:maxmemory

  • 合理配置linux内存分配策略

  • 降低fork频率,例如放宽aof重写自动触发时机,不必要的全量复制

aof追加阻塞

在AOF中,如果AOF缓冲区的文件同步策略为everysec,则在主线程中,命令写入aof_buf后调用操作系统write操作,write完成后主线程返回;fsysnc同步文件操作由专门的文件同步线程每秒调用一次。

这种做法的问题在于,如果硬盘负载过高,那么fsysnc操作可能会超过1s;如果Redis主线程持续高速向aof_buf写入命令,硬盘的负载可能会越来越大,IO资源消耗会更快。如果此时Redis异常退出,会导致数据丢失可能远超过1s。

为此,Redis的处理策略是这样的:主线程每次进行AOF会对比上次fsync成功的时间;如果距上次不到2s,主线程直接返回;如果超过2s,则主线程阻塞直到fsync同步完成。因此,如果系统硬盘负载过大导致fsync速度太慢,会导致Redis主线程的阻塞;此外,使用everysec配置,AOF最多可能丢失2s的数据,而不是1s。

问题

aof everysec配置最多可能丢失2秒数据,不是1秒。

如果系统fsync缓慢,将会导致Redis主线程阻塞影响效率。

AOF追加阻塞问题定位的方法:

  • 监控redis-cli info persistence中的aof_delayed_fsync:当AOF追加阻塞发生时(即主线程等待fsync而阻塞),该指标会累加。

  • 看日志:AOF阻塞时的Redis日志:

Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

  • 如果AOF追加阻塞频繁发生,说明系统的硬盘负载太大;可以考虑更换IO速度更快的硬盘,或者通过IO监控分析工具对系统的IO负载进行分析,如iostat(系统级io)、iotop(io版的top)、pidstat等。

05-Redis系列之-主从复制配置和优化,fork和aof两大阻塞的更多相关文章

  1. Redis系列(五)--主从复制

    单机环境存在的问题: 1.机器故障,直接凉凉 2.容量瓶颈 3.QPS瓶颈 主从复制 对于可拓展平台来说,复制(replication)是必不可少的.replication可以让其他服务器slave拥 ...

  2. 四、redis系列之主从复制与哨兵机制

    1. 绪言 在现实应用环境中,出于数据容量.容灾.性能等因素的考虑,往往不会只使用一台服务器,而是使用集群的方式.Redis 中也有类似的维持一主多从的方式提高 Redis 集群的高可用性的方案,而其 ...

  3. Redis系列七 主从复制(Master/Slave)

    主从复制(Master/Slave) 1.是什么 也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主. 2 ...

  4. redis系列:主从复制

    1 简介 这篇文章主要讲述Redis的主从复制功能.会依次从环境搭建.功能测试和原理分析几个方面进行介绍. 2 准备工作 服务器架构图如下 启动主服务器101,使用info replication命令 ...

  5. redis系列之------主从复制

    什么是主从复制 Redis的主从复制机制是指可以让从服务器(slave)能精确复制主服务器(master)的数据,如下图所示: 或者    主从复制的方式和工作原理 工作方式: Redis主从复制主要 ...

  6. 05 - Tomcat 线程池的配置与优化

    添加 Executor 在server.xml中的Service节点里面,增加executor节点,然后配置connector的executor属性,如下: <Executor name=&qu ...

  7. Redis系列目录

    第一章 Redis系列之-redis初识 第二章 Redis系列之-常用命令及API的使用 第三章 Redis系列之-高级用法 第四章 Redis系列之-持久化 第五章 Redis系列之-使用常见问题 ...

  8. 实现Redis的主从复制配置

    实现Redis的主从复制配置比较简单,而且容易明白. 下图是要配置的主从复制结构图: 1.说明 Redis主从复制中一个主服务可以有多个从服务,一个从服务可以有多个从服务. 配置比较简单,只需要更改r ...

  9. Redis系列--内存淘汰机制(含单机版内存优化建议)

    https://blog.csdn.net/Jack__Frost/article/details/72478400?locationNum=13&fps=1 每台redis的服务器的内存都是 ...

  10. redis系列--主从复制以及redis复制演进

    一.前言 在之前的文章已经详细介绍了redis入门基础已经持久化相关内容包括redis4.0所提供的混合持久化. 通过持久化功能,Redis保证了即使在服务器宕机情况下数据的丢失非常少.但是如果这台服 ...

随机推荐

  1. [转帖]一起来体验96核心、192线程CPU——第四代AMD EPYC处理器独家测试

    http://k.sina.com.cn/article_1882475282_70344b12027010s1x.html 与第三代EPYC 7003系列处理器相比,新一代EPYC 9004系列处理 ...

  2. JAVA多线程并发编程-避坑指南

    作者:京东零售 肖朋伟 一.前言 开发过程中,多线程的应用场景可谓十分广泛,可以充分利用服务器资源,提高程序处理速度.我们通常也会使用池化技术,去避免频繁创建和销毁线程. 本篇旨在基于编码规范.工作中 ...

  3. CCPC Finals 2021 H Harie Programming Contest (网络流&支配树的妙用)

    Link 题意: 给一个二分图,求有多少种方案删去恰好两个点,使得最大匹配数不变.\(n,m\le 2\times 10^5\). 二话不说先跑一遍 Dinic 网络流,设残量网络形成的图为 \(G\ ...

  4. 如何处理开发环境没有问题,线上环境有问题这个bug

    解决思路 首先确认开发环境有没有这个问题: 如果没有这个问题: 将你的地址切换为线上的环境,看看线上环境有没有这个问题: 如果切换为线上环境有这个问题,就可以调试了: 如果切换为线上环境没有这个问题, ...

  5. 【JS 逆向百例】建筑市场监管平台企业数据

    声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关. 逆向目标 目标:住房和城乡建设部&全国建筑市场监管公共服务平台的企业数据 主页:http: ...

  6. springboot项目导入外部jar包的bean的几种方式

    背景 公司封装了基础包和日志包,将公共的配置抽取出来,供所有项目使用,因此就需要考虑,怎么引入外部jar包的Bean实例: 思考 因为公司的jar包就是普通的jar,不支持springboot的自动配 ...

  7. 【Jmeter】Request1输出作为Request2输入-后置处理器

    [Jmeter]基础介绍-详细 接上文,继续介绍Jmeter,本文关注点为如何解决上文中提到的第一个问题,即: 需要实现Request1的返回作为Request2的RequestBody或Header ...

  8. 人工智能LLM模型:奖励模型的训练、PPO 强化学习的训练、RLHF

    人工智能LLM模型:奖励模型的训练.PPO 强化学习的训练.RLHF 1.奖励模型的训练 1.1大语言模型中奖励模型的概念 在大语言模型完成 SFT 监督微调后,下一阶段是构建一个奖励模型来对问答对作 ...

  9. NFS实现部署Linux文件共享

    NFS 即网络文件系统,是一种使用于分布式文件系统的协议,由Sun公司开发,于1984年向外公布,功能是通过网络让不同的机器,不同的操作系统能够彼此分享各自的数据,让应用程序在客户端通过网络访问位于服 ...

  10. 《Java 面经手册》PDF,417页11.5万字,完稿!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 我膨胀了 ,在看了大部分以面试讲解的 Java 文章后,发现很多内容的讲解都偏向于翻 ...