fsync

redis 详解(4)持久化

故事扮演 提交于 2019-12-16 10:14:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 定义 redis 所有数据保存在内存中,对数据更新将异步保存到磁盘 持久化的作用 方式 说明 快照 mysql dump,redis RDB 日志 mysql binlog,redis AOF,hbase Hlog RDB 定义 redis 创建二进制的 RDB 文件 redis 启动载入已经存在的 RDB 文件 三种主要方式触发 save(同步) client 发送 save 命令到 server,server 创建 RDB 文件,会阻塞主进程 如果存在老文件,新文件会替换老文件 时间复杂度 O(n) bgsave(异步) client 发送 bgsave 命令到 server,server fork 一个子进程创建 RDB 文件 server 返回给 client 成功信息 命令 save bgsave IO 类型 同步 异步 是否阻塞 是 是,阻塞发送在 fork 时间复杂度 O(n) O(n) 优点 不会消耗额外内存 不阻塞客户端命令 缺点 阻塞客户端命令 需要 fork,消耗内存 自动配置 配置 seconds changes save 900 1 save 300 10 save 60 10000 其他方式触发 全量复制 debug reload shutdown 总结 RDB 是 redis

Git clone fsync input/output error in linux

北慕城南 提交于 2019-12-07 23:21:02
问题 I am trying to clone the tensorflow/models repo. I am connected to the remote machine with ssh. I tried many suggestions out there for fixing the issue but none worked for me. git clone --recursive https://github.com/tensorflow/models.git Cloning into 'models'... remote: Counting objects: 1670, done. remote: Compressing objects: 100% (28/28), done. remote: Total 1670 (delta 10), reused 0 (delta 0), pack-reused 1642 Receiving objects: 100% (1670/1670), 49.23 MiB | 8.44 MiB/s, done. Resolving

Redis持久化存储详解(一)

家住魔仙堡 提交于 2019-12-05 19:25:33
为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失。 持久化存储分类 在 Redis 中,持久化存储分为两种。一种是 aof 日志追加的方式,另外一种是 rdb 数据快照的方式。 RDB持久化存储 什么是RDB持久化存储 RDB持久化存储即是将redis存在内存中的数据以快照的形式保存在本地磁盘中。 .RDB持久化存储分为自动备份和手动备份 1.手动备份通过 save 命令和 bgsave 命令。save是同步阻塞,而 bgsave 是非阻塞(阻塞实际发生在 fork 的子进程中)。因此,在我们实际过程中大多是使用bgsave命令实现备份. redis> SAVE OK redis> BGSAVE Background saving started 2.自动备份 a.修改配置项 save m n即表示在 m 秒内执行了 n 次命令则进行备份. b.当Redis 从服务器项主服务器发送复制请求时,主服务器则会使用 bgsave命令生成 rbd 文件,然后传输给从服务器. c.当执行 debug reload 命令时也会使用 save 命令生成rdb文件. d.当使用

Redis持久化(Persistence):了解如何配置redis的持久化。

半世苍凉 提交于 2019-12-05 06:51:39
Redis持久化机制 RDB持久化方式 :在指定时间间隔对数据进行快照存储 AOF持久化方式 :每次写操作都会记录下来,当服务器重启的时候会重新执行这些命令来恢复原始数据。AOF命令以redis协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。 同时开启两种持久化机制: 在这种情况下,当Redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。 不使用任何持久化方式 :如果你只希望你的数据在服务器运行时候存在,你也可以不使用任何持久化方式。 RDB的优点 RDB是一个非常紧凑的文件,它保存了某个时间点的数据集,非常 适用于数据集的备份 ,比如:你可以每个小时保存一下过去24h内的数据,同时每天保存过去30天的数据,这样即使出了问题也可以根据需求恢复到不同版本的数据集。 RDB是一个紧凑的单一文件,很方便的传送到另一个远端数据中心,非常 适用于灾难恢复 。 RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部交给子进程来完成,可以 最大化Redis的性能 。 与AOF相比,在恢复大的数据集的时候, RDB方式会更快一些 。 RDB的缺点 redis宕机丢失数据更多 :如果你希望在redis意外停止工作(假如电源中断

磁盘优化思路

怎甘沉沦 提交于 2019-12-04 10:27:18
磁盘优化思路 性能定位套路 和之前类似,我们不可能出现性能问题就把所有工具都跑一遍,而是先运行那几个支持指标较多的工具,如 top,iostat,vmstat等来缩小范围 先用top, iostat 发现磁盘 I/O 性能瓶颈; 再借助 iotop, pidstat 等定位出导致瓶颈的进程; 随后用strace, lsof等分析进程的 I/O 行为; 最后,结合应用程序的原理,分析这些 I/O 的来源。 性能优化思路 由于影响磁盘I/O性能的因素众多,我们对磁盘I/O优化分应用程序,文件系统,磁盘三方面来说 1.应用程序优化 应用程序处于整个 I/O 栈的最上端,它可以通过系统调用,来调整 I/O 模式(如顺序还是随机、同步还是异步), 同时,它也是 I/O 数据的最终来源。 在我看来,可以有这么几种方式来优化应用程序的 I/O 性能: 1).可以用追加写代替随机写,减少寻址开销,加快 I/O 写的速度。 2).可以借助缓存 I/O ,充分利用系统缓存,降低实际 I/O 的次数。 3).可以在应用程序内部构建自己的缓存,或者用 Redis 这类外部缓存系统。这样,一方面,能在应用程序内部,控制缓存的数据和生命周期;另一方面,也能降低其他应用程序使用缓存对自身的影响。 4).在需要频繁读写同一块磁盘空间时,可以用 mmap 代替 read/write,减少内存的拷贝次数。 5)

How to do fsync on an ofstream?

萝らか妹 提交于 2019-12-03 06:55:45
问题 I want to make sure that an ofstream has been written to the disk device. What's the portable way (portable on POSIX systems) of doing this? Does that solve the problem if I open the file separately in read-only append mode to get a file descriptor and call fsync with it? Like this: ofstream out(filename); /* ... write content into out ... */ out.close(); int fd = open(filename, O_APPEND); fsync(fd); close(fd); 回答1: If you're able to use Boost, try a file_descriptor_sink based stream, eg.:

How to do fsync on an ofstream?

妖精的绣舞 提交于 2019-12-02 20:39:50
I want to make sure that an ofstream has been written to the disk device. What's the portable way (portable on POSIX systems) of doing this? Does that solve the problem if I open the file separately in read-only append mode to get a file descriptor and call fsync with it? Like this: ofstream out(filename); /* ... write content into out ... */ out.close(); int fd = open(filename, O_APPEND); fsync(fd); close(fd); mrtimdog If you're able to use Boost, try a file_descriptor_sink based stream, eg.: boost::filesystem::path filePath("some-file"); boost::iostreams::stream<boost::iostreams::file

Explanation/information sought: Windows write I/O performance with “fsync” (FlushFileBuffers)

拟墨画扇 提交于 2019-12-01 04:52:43
This question is in follow up of an earlier question I posted: Windows fsync (FlushFileBuffers) performance with large files . Where I found a possible solution but also new questions. While benchmarking different scenarios for fsynced writes, I found a number of surprising results. I am hoping someone can help explain or point me in the direction of information that explains these results. What this benchmark does is writing random blocks (pages 4096 bytes large) to a file sequentially in batches of 8 pages (32 K) and then flushing the writes. It writes a total of 200000 pages, amounting to a

How to durably rename a file in POSIX?

♀尐吖头ヾ 提交于 2019-11-30 10:39:58
问题 What's the correct way to durably rename a file in a POSIX file system? Specifically wondering about fsyncs on the directories . (If this depends on the OS/FS, I'm asking about Linux and ext3/ext4). Note : there are other questions on StackOverflow about durable renames, but AFAICT they don't address fsync-ing the directories (which is what matters to me - I'm not even modifying file data). I currently have (in Python): dstdirfd = open(dstdirpath, O_DIRECTORY|O_RDONLY) rename(srcdirpath + '/'

Redis持久化

走远了吗. 提交于 2019-11-30 05:55:47
 这节介绍Redis的持久化,包括RDB和AOF两种方式。 1.RDB持久化  Redis能够将内存中的数据持久化到RDB文件中,避免数据丢失。RDB文件的格式如下示:  第一部分是开头的5个字节,值为REDIS,第二部分是长度为4个字节的版本号,值为一个字符串表示的整形。database部分包含零个或任意多个数据库,以及各个数据库中的键值对数据,database的结构如下示:  EOF为1字节的结束符号,check_sum为8字节长的校验和,这个校验和是通过前面4个部分计算出来的。  可以使用SAVE或者BGSAVE命令生成RDB文件。SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。BGSAVE命令则会派生出一个子进程,然后由子进程负责创建RDB文件,父进程继续处理命令请求。  BGSAVE除了可以通过命令来手动执行外,还可以通过配置项来定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。配置格式为: save N M  表示服务器在N秒内对数据进行了至少M次修改。该配置可以有多个,只要满足其中一个条件就会触发BGSAVE。当BGSAVE命令执行时,父进程会fork一个子进程,子进程会将当前内存中的数据写到磁盘上的一个临时文件。当临时文件写完后会将原来的RDB文件替换掉,这样的好处是可以使用