fsync

Kafka如果丢了消息,怎么处理的?

倖福魔咒の 提交于 2021-02-20 16:02:27
Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。 Broker Broker丢失消息是由于Kafka本身的原因造成的,kafka为了得到更高的性能和吞吐量,将数据异步批量的存储在磁盘中。消息的刷盘过程,为了提高性能,减少刷盘次数,kafka采用了批量刷盘的做法。即,按照一定的消息量,和时间间隔进行刷盘。这种机制也是由于linux操作系统决定的。将数据存储到linux操作系统种,会先存储到页缓存(Page cache)中,按照时间或者其他条件进行刷盘(从page cache到file),或者通过fsync命令强制刷盘。数据在page cache中时,如果系统挂掉,数据会丢失。 服务器上高速读写以及同步到Replica 上图简述了broker写数据以及同步的一个过程。broker写数据只写到PageCache中,而pageCache位于内存。这部分数据在断电后是会丢失的。pageCache的数据通过linux的flusher程序进行刷盘。刷盘触发条件有三: 主动调用sync或fsync函数 可用内存低于阀值 dirty data时间达到阀值。dirty是pagecache的一个标识位,当有数据写入到pageCache时,pagecache被标注为dirty,数据刷盘以后,dirty标志清除。 Broker配置刷盘机制

ext4/fsync situation unclear in Android (Java)

孤人 提交于 2021-02-17 08:48:26
问题 Tim Bray's article "Saving Data Safely" left me with open questions. Today, it's over a month old and I haven't seen any follow-up on it, so I decided to address the topic here. One point of the article is that FileDescriptor.sync() should be called to be on the safe side when using FileOutputStream. At first, I was very irritated, because I never have seen any Java code doing a sync during the 12 years I do Java. Especially since coping with files is a pretty basic thing. Also, the standard

What is the difference between `O_DIRECT | O_SYNC` + write() and `O_DIRECT` + write() + fsync()

随声附和 提交于 2021-02-11 12:49:01
问题 I want to know the difference between char *text = (char *)malloc(4096); memset(text, 'a', 4096); int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT); for(int i=0; i<1000; i++) { write(fd, (void *)text, 4096); fsync(fd); } close (fd); and char *text = (char *)malloc(4096); memset(text, 'a', 4096); int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT | O_SYNC); //<----Difference for(int i=0; i<1000; i++) { write(fd, (void *)text, 4096); // fsync(fd); <------------------------------------------

浅谈 Linux IO

梦想与她 提交于 2021-01-31 23:21:27
来源于:360云计算 1 前言 linux IO是文件存储的基础。本文参考了网上博主的一些文章,主要总结了linuxIO的基础知识。 2 linux IO栈 linux文件IO采用分层的设计。分层有两个好处: 架构清晰; 功能解耦; linux文件IO的时候,从通用性和性能的角度考虑,采用了一个折中的方案来满足我们日常写磁盘。 例如: void foo() { char *buf = malloc(MAX_SIZE); strncpy(buf, src, MAX_SIZE); fwrite(buf, MAX_SIZE, 1, fp); fclose(fp); } 上面代码的说明如下: malloc的buf对应图中的application buffer。调用fwrite之后,操作系统将数据从application buffer拷贝到libc buffer,即c库标准IO buffer。fwrite 返回后,数据还保存在libc buffer,如果这个时候进程退出,这些数据将会丢失,没有写到磁盘上。 当调用fclose的时候,fclose只会刷新libc buffer到page cache,如果确保数据写到磁盘,kernel buffer也必须flush。例如使用sync,fsync。 除了fclose方法外,还有一个主动刷新接口fflush函数

sysbench压力测试工具简介

江枫思渺然 提交于 2021-01-17 17:01:35
问:罗列的数据是什么含义? 答: General statistics(综合统计) total time: 10.0004s total number of events: 25875 CPU测试,在10s范围内进行素数计算这个行为一共进行了25875次,实际执行时间为10.0004s; Latency (ms): min: 0.36 avg: 0.39 max: 16.12 95th percentile: 0.44 sum: 9884.06 这部分数据应该统计的是线程真正执行的时间,总共9884.06ms, 单次执行最少时间为0.36ms, 最多时间为16.12ms, 平均时间为0.39ms, 95%次的执行时间在0.44ms左右; Threads fairness: events (avg /stddev): 43084.0000/ 0.00 execution time (avg /stddev): 9.8626/ 0.00 归纳总结,线程执行时间为9.8626s, 执行平均次数为43084次; Threads fairness: events (avg/stddev): 9498.5000/5.50 #平均每个线程完成envet的次数,后一个值是标准差 execution time (avg/stddev): 29.9980/0.00 #平均每个线程平均耗时

Linux性能优化(二)——sysbench压力测试工具

佐手、 提交于 2021-01-17 10:33:23
一、sysbench简介 1、sysbench简介 sysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。sysbench提供如下测试: (1)CPU性能 (2)磁盘IO性能 (3)调度程序性能 (4)内存分配及传输速度 (5)POSIX线程性能 (6)数据库性能(OLTP基准测试) sysbench支持 MySQL、PostgreSQL、Oracle 数据库。 2、sysbench安装 Build构建依赖安装: yum -y install make automake libtool pkgconfig libaio-devel yum -y install mariadb-devel openssl-devel yum -y install postgresql-devel 源码下载: git clone https://github.com/akopytov/sysbench.git 生成配置工具: autogen.sh 配置选项: --with-pgsql:支持PostgreSQL --with-oracle:支持Oracle --without-mysql:无MySQL支持 configure [options] 编译: make -j 安装: make install 3、sysbench命令 sysbench

ClickHouse和他的朋友们(14)存储计算分离方案与实现

不打扰是莪最后的温柔 提交于 2020-12-28 09:36:15
原文出处:https://bohutang.me/2020/09/18/clickhouse-and-friends-compute-storage/ 最后更新: 2020-09-18 如果多个 ClickHouse server 可以挂载同一份数据(分布式存储等),并且每个 server 都可写,这样会有什么好处呢? 首先,我们可以把副本机制交给分布式存储来保障,上层架构变得简单朴素; 其次,clickhouse-server 可以在任意机器上增加、减少,使存储和计算能力得到充分发挥。 本文就来探讨一下 ClickHouse 的存储计算分离方案,实现上并不复杂。 1. 问题 ClickHouse 运行时数据由两部分组成:内存元数据和磁盘数据。 我们先看写流程: w1. 开始写入数据 w2. 生成内存part信息,并维护part metadata列表 w3. 把part数据写到磁盘 再来看读流程: r1. 从part metadata定位需要读取的part r2. 从磁盘读取part数据 r3. 返回给上层数据 这样,如果 server1 写了一条数据,只会更新自己内存的 part metadata,其他 server 是感知不到的,这样也就无法查询到刚写入的数据。 存储计算分离,首先要解决的就是内存状态数据的同步问题。 在 ClickHouse 里,我们需要解决的是内存中

Redis面试总结

柔情痞子 提交于 2020-12-25 05:05:59
Redis port:6379 简介 redis3.0以上支持redis cluster redis :remote dictionary server 远程字典服务 nosql非关系型数据库:redis/memcached/mongoDB/hbase redis和memcached区别 1)redis支持存储多种数据结构 redis不仅仅支持简单的K/V数据类型的存储,同时还提供string(字符串)、list(列表)、set(集合)、zset(有序集合),hash(哈希数据)等数据结构的存储 支持更大的value数据:memcache单个key value最大,支持1MB,而redis最大支持512MB。 2)redis支持数据的备份 redis支持数据的备份,即master<----->slave模式的数据备份,redis通过哨兵(sentlinet)来进行主从的切换 从redis 3.0开始支持redis cluster 集群 3)redis支持数据持久化(RDB/AOF) 1:在redis中并不是所有的数据都一直存储在内存中的,这是redis和memcache最致命的优势,反之memcached存储的数据是完全存储在内存中的 2:另外redis单线程,memcached多线程(多线程的好处-->可以使用多核心cpu) 3:虽然

MySQL 8.0.22 GA!

大憨熊 提交于 2020-12-19 08:28:23
作者: Geir Hoydalsvik 翻译:管长龙 本文来源:原文翻译 *爱可生开源社区出品 ,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 MySQL 开发团队非常高兴地宣布,MySQL 8.0.22 现在可以下载了。除了 Bug 的修复,此版本中还添加了一些新功能。可以在 8.0.22 发行说明中找到更改和错误修复的完整列表。以下是该版本主要更新。 Perpared Statements 每个 DML 语句预处理一次(WL#9384) Perpared 语句只在 Perpare 时准备一次,而不是在每次执行时准备一次。同样,存储过程中的语句也将在第一次执行时准备一次。 这项工作的好处是: 性能增强:避免每次执行时进行昂贵的准备; 简化代码:避免繁琐的准备结构回滚。 SHOW PROCESSLIST 重新实现 SHOW PROCESSLIST(WL#9090) SHOW PROCESSLIST 将作为 PERFORMANCE_SCHEMA 中 processlist 表的视图实现,从 Performance Schema 而不是线程管理器中查询活动线程数据。当前的实现在保持全局互斥的同时,从线程管理器中跨活动线程进行迭代,这在繁忙的系统上可能是令人讨厌的。从 Performance Schema 中聚合相同的信息不会以任何方式影响用户负载。 可以通过系统变量: -

Redis基础、高级特性与性能调优

。_饼干妹妹 提交于 2020-12-18 05:04:51
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概览Redis提供的高级能力,并在部署、维护、性能调优等多个方面进行更深入的介绍和指导。 本文适合使用Redis的普通开发人员,以及对Redis进行选型、架构设计和性能调优的架构设计人员。 目录 概述 Redis的数据结构和相关常用命令 数据持久化 内存管理与数据淘汰机制 Pipelining 事务与Scripting Redis性能调优 主从复制与集群分片 Redis Java客户端的选择 概述 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用。 Redis支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hyperloglogs等。 Redis具备LRU淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过Redis Sentinel实现的高可用方案,同时还支持通过Redis Cluster实现的数据自动分片能力。 Redis的主要功能都基于单线程模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法时间复杂度,这些信息意味着: Redis是线程安全的(因为只有一个线程),其所有操作都是原子的,不会因并发产生数据异常