复制机制的调优
主要研究一个参数:repl-backlog-size,通过调整该参数以充分利用部分重新同步的优势来实现更好的主从复制性能。
实验步骤:
切断主从之间的网络连接,在网络连接断开期间,在主实例生成一些测试数据,然后恢复网络连接,这时候观察两个Redis实例的日志
结论
在上面的实验步骤中可以发现,不同大小的测试数据会引发不用类型的数据重新同步。当数据量较小时采用的部分重新同步,而数据量较大的时候采用的完全重新同步。发生这种情况的原因是,在Redis主实例与从实例网络断开期间,主实例的一段内存(一个环形缓冲区)会跟踪最近所有的写入命令。这个缓冲区实际是一个固定长度的列表。
在Redis中,这个缓冲区称为replication backlog。Redis使用这个backlog缓冲区来决定究竟进行完全重新同步还是部分重新同步。在发出SLAVEOF命令后,从实例使用最后一个offset和最后一个主实例ID(master_replid)向主实例发送一个部分重新同步请求。当主实例和从实例之间建立连接后,主实例会检查请求中的master_replid是否与它自己的master_replid一致。然后主实例会检查请求中的offset能否从backlog缓冲区中获取。如果offset位于backlog的范围内,那么就可从中获得连接断开期间的所有写入命令,这时候就会进行部分重新同步,否则,如果主实例在连接断开期间接收到了写入命令的数据量超过了backlog缓冲区的容量,那么部分重新同步请求会被拒绝,此时,完全重新同步就会被启动。
默认情况下,backlog缓冲区的大小为1MB,这个容量在连接断开期间只能容纳少量的写入命令。
在主实例与从实例之间网络连接断开时,backlog缓冲区默认大小并不能应对高写入流量的情况,在多数情况下,我们需要把这个参数进行调整为更高的值满足需求。可以通过峰值期间使用INFO命令计算master_repl_offset的变化量,可以估算backlog缓冲区的合适大小:
t*(master_repl_offset2-master_repl_offset1)/(t2-t1)
我们也可以使用这个公式来估算主实例和从实例之间的网络流量。
一般来说,这个值设置为比RDB快照大小还大的值是毫无意义的。
有关backlog的另一个参数repl-backlog-ttl。该参数的含义是:如果所有的从实例与主实例的连接全部断开后,那么主实例等待多久释放backlog占用的内存。该参数的默认值为:3600s。一般这个数字不会有什么问题,因为与Redis实例占用的内存相比backlog缓冲区是非常小的。
处理backlog的大小之外,还有一些其他的配置在某些情况下进行调优以获得更好的性能,从网络传输的角度看,我们可以通过设置参数repl-disable-tcp-nodelay设置为yes来减少宽带的使用,如果设置为yes,Redis会将几个小包合成一个包,这个在主实例和从实例位置相距较远的情况下有些作用,但是需要注意的是,这个选项可能造成约40毫秒的复制延迟。
在使用Docker时,经常会犯一个错,误以为latest镜像会自己更像到最小版本,其实这样理解是有问题的,latest就是一个标签,没有自动更新到最新版本的功能,本文就是对latest标签进行介绍。
图像添加(高斯/椒盐/泊松/斑点)噪声
最近使用VSCode来编写Markdown,但是每次遇到截图保存图片的时候就感觉非常麻烦,就想有没有一款插件支持复制和截图保存的,果然确实有这样一款插件:Paste Image。下面将介绍如何安装和使用该插件
Redis可以通过对键设置过期时间来自动删除过期的键信息。当设置了一个过期时间后,过期时间会被存储为一个绝对的UNIX的时间戳。这样做的目的是即使Redis服务器宕机了一段时间,这个时间戳也会被持久化到RDB文件中,当Redis服务器启动时,这个用来判断键是否过期的时间戳不会发生变化,一旦超过了这个时间戳,键就过期了。
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。