笔记-redis深入学习-1
笔记-redis深入学习-1
redis的基本使用已经会了,但存储和读取只是数据库系统最基础的功能;
数据库系统还得为可靠实现这两者提供一系列保证;
- 数据、操作备份和恢复,主要是持久化;
- 高可用:主要是主从和集群;
1. 持久化
redis是内存数据库,想将数据保存到磁盘上,需要配置持久化。
redis持久化有两种模式RDB和AOF。
1.1. RDB
RDB:全称redis database,在指定的时间点将内存中的数据集快照,在恢复时直接将快照文件读到内存里。
redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,主进程不进行IO。
1.1.1. 优劣
- 优点:
快;
基本不影响主进程;
- 缺点:
前面说过,快照+时间点,那么当下一定会有一段时间内的改变是没有记录的;行话说就是数据恢复的完整性不能保证;
另外一点就是fork的问题了,当数据集比较大时,fork的过程是非常耗时的,能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。
也得考虑内存使用的问题,在fork时,数据被克隆了一份,可能会超出内存容量限制。
1.1.2. 更多实现细节
fork一个与主进程一样的进程来完成持久化;
持久化数据保存在dump.rdb文件中;
具体过程:
- redis forks. we now have a child and a parent process.
- the child starts to write the dataset to a temporary RDB file.
- when the cild is done writing the new RDB file, it replaces the ols one.
1.1.3. 配置或命令操作
- 配置
在config文件中配置
save 900 1
save 300 10
save 60 10000
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
可以多个策略同时生效
- 命令
save:会阻塞请求;
bgsave:后台save,不会阻塞当前请求;
1.2. AOF
AOF:append only file,AOF记录每一次服务器收到的操作请求,在重启时会重演所有操作请求。
可以同时指定RDB和AOF,但当重启时会使用AOF恢复数据。
1.2.1. 优劣
- 优点:
更durable/?,简单来说就是备份策略更灵活,性能也有保障(fsync是用一个后台线程执行的),默认每秒进行写入也能保持高性能;
AOF日志文件是添加模式的,所以没有偏移和同步问题,如果突然断电,这个特性非常有用;另外如果日志末尾只有半截命令,也很容易处理;
当日志文件太大时,redis会自动使用一个等效的优化后的AOF文件替换它;
AOF日志文件可读性比较高;
- 缺点
AOF文件通常比等效的RDB文件大;
AOF可能比RDB慢(取决于具体设置);
1.2.2. 配置或命令操作
在配置文件中设置打开aof
appendonly yes
日志重写:日志重写的原理很简单,对一个key操作100次,当然日志会记录100次操作,但对于重建来说,前面的99次都是没有意义的,可以删除。
策略选择:
- # appendfsync always 每条命令都记录一次,慢,安全;
- appendfsync everysec每秒进行记录;
- # appendfsync no 不写日志;
默认策略是每秒写
如果AOF文件被破坏了怎么办?
Make a backup copy of your AOF file.
Fix the original file using the redis-check-aof tool that ships with Redis:
$ redis-check-aof --fix
Optionally use diff -u to check what is the difference between two files.
Restart the server with the fixed file.
AOF运作机制:
- redis forks, so now we have a child and a parent process.
- the child starts writing the new AOF in a temporary file.
- the parent accumulates all the new changes in an in-memory buffer(but at the same time it writes the new changes in the old append-only-file, so it rewriting fails, we are save).
- when the child is done rewriting the file, the parent gets a signal, and appends the in-memory buffer at the end of the file generated by the child.
- profit! now redis automically renames the old file into the new one, and starts appending new data to the new file.
2. 主从
目前推荐及常用的主从模式是主写,从读;
特性如下:
- Redis 使用异步复制,slave 和 master 之间异步地确认处理的数据量
- 一个 master 可以拥有多个 slave
- slave 可以接受其他 slave 的连接。除了多个 slave 可以连接到同一个 master 之外, slave 之间也可以像层叠状的结构(cascading-like structure)连接到其他 slave 。自 Redis 4.0 起,所有的 sub-slave 将会从 master 收到完全一样的复制流。
- Redis 复制在 master 侧是非阻塞的。这意味着 master 在一个或多个 slave 进行初次同步或者是部分重同步时,可以继续处理查询请求。
- 复制在 slave 侧大部分也是非阻塞的。当 slave 进行初次同步时,它可以使用旧数据集处理查询请求,假设你在 redis.conf 中配置了让 Redis 这样做的话。否则,你可以配置如果复制流断开, Redis slave 会返回一个 error 给客户端。但是,在初次同步之后,旧数据集必须被删除,同时加载新的数据集。 slave 在这个短暂的时间窗口内(如果数据集很大,会持续较长时间),会阻塞到来的连接请求。自 Redis 4.0 开始,可以配置 Redis 使删除旧数据集的操作在另一个不同的线程中进行,但是,加载新数据集的操作依然需要在主线程中进行并且会阻塞 slave 。
- 复制既可以被用在可伸缩性,以便只读查询可以有多个 slave 进行(例如 O(N) 复杂度的慢操作可以被下放到 slave ),或者仅用于数据安全。
- 可以使用复制来避免 master 将全部数据集写入磁盘造成的开销:一种典型的技术是配置你的 master Redis.conf 以避免对磁盘进行持久化,然后连接一个 slave ,其配置为不定期保存或是启用 AOF。但是,这个设置必须小心处理,因为重新启动的 master 程序将从一个空数据集开始:如果一个 slave 试图与它同步,那么这个 slave 也会被清空。
2.1. 主从配置
主从配置非常简单
在从库进行配置
slaveof <masterip> <masterport> # 主库地址,端口
masterauth <password> # 如果主库有密码
bind 0.0.0.0
port 6379 # 端口得改了
logfile "6379.log" # 日志也得改
dbfilename "dump-6379.rdb" # 持久化文件
daemonize yes
rdbcompression yes
同时启动三个服务,可以看到3个进程;
分别连接三个服务:
redis-cli –p 6379
redis-cli –p 6381
redis-cli –p 6382
在从库可以发现与主库的数据一致;
2.2. 主从同步原理
同步的开始:从服务器在连接时它发送了一个SYNC命令,不管它是第一次连接还是再次连接都没有关系。
接下来可能进行全量同步或部分同步。
全量同步:
从服务器向主服务器发送SYNC命令;
收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
部分同步:
每一个 Redis master 都有一个 replication ID :这是一个较大的伪随机字符串,标记了一个给定的数据集。每个 master 也持有一个偏移量,master 将自己产生的复制流发送给 slave 时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新 slave 的状态。复制偏移量即使在没有一个 slave 连接到 master 时,也会自增,所以基本上每一对给定的
Replication ID, offset
都会标识一个 master 数据集的确切版本。
当 slave 连接到 master 时,它们使用 PSYNC 命令来发送它们记录的旧的 master replication ID 和它们至今为止处理的偏移量。通过这种方式, master 能够仅发送 slave 所需的增量部分。但是如果 master 的缓冲区中没有足够的命令积压缓冲记录,或者如果 slave 引用了不再知道的历史记录(replication ID),则会转而进行一个全量重同步:在这种情况下, slave 会得到一个完整的数据集副本,从头开始。
这部分不用深究,了解即可,简单来说会根据id和offset组成的标识来决定同步哪一部分,如果id或offset超限、找不到,则进行全量同步。
另外从同步发起方而言可以分为两种同步:
- sync:由从服务器触发;
- command propagate:由主服务器触发,当数据改变时触发,同步更新从库的数据;
心跳检测:
在命令传播阶段,从服务器默认每秒向主服务器发送命令:REPLCONF ACK <replication_offset>
其中replication_offset是从服务器当前的复制偏移量。
发送REPLCONF ACK命令对于主从服务器有三个作用:
- 检测主从服务器的网络连接状态;
- 辅助实现min-slaves选项;
- 检测命令丢失。
2.3. 主从模式优缺点
- 优点:高可用,读写分离
- 缺点:延时
主库宕机后,从库仍可以读取;
有一个情况需要注意,在主库未持久化的情况下主库宕机,然后重新拉起服务,会导致从服务器丢失数据;原因是主库拉起后,因为没有持久化,所以没有数据,从库对此进行同步,会删除数据。
3. 哨兵sentinel
主从模式解决了数据备份和单例的性能问题,但新的问题是对具体的应用端而言,它一般只会访问一个从库,如果该从库宕机,应用仍无法访问数据库。
另外,如果主库下线,需要人工干预指定新的主库。
为了解决这两个问题,2.8版以后推出了哨兵sentinel。
哨兵的逻辑就是监控,如果发现主机不可连接,则根据规则在从库中选一个主库出来。
4. cluster
哨兵解决了状态监控和主库选择的问题,但并未解决单主机性能极限问题。
集群主要用于解决单主机性能极限问题。
集群的关键有三点:
- 数据分片:数据存储范围的划分
- 数据读取:怎么知道数据在哪台服务器上,怎么去读它
- 数据一致性:
数据分片:
Redis Cluster does not use consistent hashing, but a different form of sharding where every key is conceptually part of what we call an hash slot.
在redis 集群中有16384个hash slot,计算key属于哪个hash slot的方法是对key使用CRC16算法,然后对16384取余。
Every node in a Redis Cluster is responsible for a subset of the hash slots, so for example you may have a cluster with 3 nodes, where:
Node A contains hash slots from 0 to 5500.
Node B contains hash slots from 5501 to 11000.
Node C contains hash slots from 11001 to 16383.
数据读取:
To perform their tasks all the cluster nodes are connected using a TCP bus and a binary protocol, called the Redis Cluster Bus. Every node is connected to every other node in the cluster using the cluster bus. Nodes use a gossip protocol to propagate information about the cluster in order to discover new nodes, to send ping packets to make sure all the other nodes are working properly, and to send cluster messages needed to signal specific conditions. The cluster bus is also used in order to propagate Pub/Sub messages across the cluster and to orchestrate manual failovers when requested by users (manual failovers are failovers which are not initiated by the Redis Cluster failure detector, but by the system administrator directly).
节点不能代理请求,所以clients may be redirected to other nodes using redirection errors -MOVED
and -ASK
.
理论上可以访问集群中的任意一个节点并通过重定向定位到真正提供数据的节点,但是,明确访问数据真正存放的节点会提高效率。
数据一致性:
与主从类似,多份数据一定会面对的问题是一致性问题;这里与主从下的一致性问题是类似的。
redis集群没有提供强一致性。
其它特性或问题:
多键操作:
集群下,不同的key可能会分布于多个服务器中,如果同时操作这些key会带来问题。
Redis Cluster supports multiple key operations as long as all the keys involved into a single command execution (or whole transaction, or Lua script execution) all belong to the same hash slot. The user can force multiple keys to be part of the same hash slot by using a concept called hash tags.
如果一条命令/脚本中涉及到的key属于一个hash slot,则这条命令可以在cluster环境下执行。
当然有时需要指定key在同一主机内,为此redis支持强制多个key存在于一个hash slot内,这需要hash tags。
高可用:
为了保证可用性,redis集群使用了主从,为每一个节点配置了一个从节点。
例如:集群中包含节点ABC及它们的从节点abc,如果A挂了,会切换到a,但如果A和a都挂了,集群就挂了。
另外如果集群一半以上的主节点挂掉,无论是否有从节点,集群都不可用。
笔记-redis深入学习-1的更多相关文章
- Redis in Action : Redis 实战学习笔记
1 1 1 Redis in Action : Redis 实战学习笔记 1 http://redis.io/ https://github.com/antirez/redis https://ww ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- Redis:学习笔记-03
Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...
- Redis:学习笔记-02
Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...
- Redis:学习笔记-01
Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...
- memcache/redis 缓存学习笔记
0.redis和memcache的区别 a.redis可以存储除了string之外的对象,如list,hash等 b.服务器宕机以后,redis会把内存的数据持久化到磁盘上,而memcache则不会 ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
- redis入门学习记录(二)
继第一节 redis入门学习记录(一)之后,我们来学习redis的基本使用. 接下来我们看看/usr/local/redis/bin目录下的几个文件作用是什么? redis-benchmark:red ...
- 【笔记】MySQL学习之索引
[笔记]MySQL学习之索引 一 索引简单介绍 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. 普通 ...
随机推荐
- ChromiumFX
序言 开发C#桌面应用程序有很多选择,比如WinForm或WPF. 这里我们用ChromiumFX. 目录 一.Centos7 从零编译Nginx+PHP+MySql 二.Centos7 从零配置Ng ...
- Tomcat启动报Error listenerStart错误 | "beans" 必须匹配 DOCTYPE 根 "null" | java.lang.reflect.MalformedParameterizedTypeException
maven打包发布工程时,发布上去却报错FAIL - Deployed application at context path /ch but context failed to start 在服务器 ...
- selenium鼠标拖动
var builder = new Actions(_driver); builder.MoveToElement(_driver.GetElementByCssSelector("#com ...
- 使用fn_dblog函数查看事务日志和恢复数据
基本语法 SqlServer中有一个未在文档中公开的函数sys.fn_dblog,提供查询当前数据库事务日志的功能.通过这个函数,可以简单了解下数据库事务日志的机制 使用方法如下: select * ...
- 使用mongoDB时错误解决
接触mongodb遇到的错误,记录下来,后续遇到问题,会持续更新 为了让mongodb更直观,在windows使用了NoSQL Manager for MongoDB作为连接工具 1.在连接数据库时遇 ...
- vos语音业务规范操作承诺函
语音业务规范操作承诺函 *****网络科技有限公司: 我司开通固话2000线,话务价格为0.045元/分钟(仅拨打中国移动网内电话).为防止投诉.网外电话.欠费等语音话务风险,我司承诺如下:在业务上遵 ...
- Oracle VM VirtualBox 共享文件夹设置
在Windows平台下,这货完全没有VMware好用,但在Linux平台就很好用. 学校机房的电脑打开虚拟机就不能插优盘,一插优盘就卡死,所以,只好用共享文件夹了. 1.在虚拟机外部新建一个文件夹 假 ...
- python绘图 matplotlib教程
mark一个很好的python绘图教程 https://liam0205.me/2014/09/11/matplotlib-tutorial-zh-cn/
- myeclipse 10 创建webservice
java 快捷创建webservice 收集一下,方便一下查阅 详情去看一下这个老哥,里面写得非常详细: http://hyan.iteye.com/ -- http://www.cnblogs.co ...
- robotframework实战三--自定义关键字
在rf的实战1中,我的登录获取验证码就使用了自定义关键字,具体怎么做的,如下 1.新建文件夹 新建一个文件夹,我的MyLibrary,并且存放在site-packages下 2.编写代码 在pytho ...