共计 3888 个字符,预计需要花费 10 分钟才能阅读完成。
前言
最近学习 Redis6.x,特做笔记以备忘,与大家共学。课程是从私塾在线下载的,他们把架构师课程都放进去了,大家能够去下载学习,不要钱的,地址是 http://t.hk.uy/eK7, 课程很不错,值得学习!要害是不要钱,嘻嘻!
复制概述
Redis 反对复制的性能,以实现当一台服务器的数据更新后,主动将新的数据异步同步到其它数据库。
Redis 复制实现中,把数据库分为主数据库 master 和从数据库 slave,主数据库能够进行读写操作,从数据库个别是只读的,当主数据库数据变动的时候,会主动同步给从数据库。
复制带来的益处
1:能够实现读写拆散
2:利于在主数据库解体时的数据恢复
3:程度扩容撑持高并发
复制根本配置
主数据库不做配置;从数据库须要在配置中设置“replicaof 主数据库 ip 主数据库端口”
复制的基本操作命令
1:info replication:能够查看复制节点的相干信息
2:slaveof:可在运行期间批改 slave 节点的信息,如果该数据库曾经是
某个主数据库的从数据库,那么会进行和原主数据库的同步关系,转而
和新的主数据库同步
3:slaveof no one:使以后数据库进行与其余数据库的同步,转成主数据库
复制局部的配置详解
1:replicaof:指定某一个 redis 作为另一个 redis 的从服务器,通过指定 IP
和端口来设置主 redis
2:masterauth:如果主 redis 设置了验证明码的话(应用 requirepass 来设置),则在从 redis 的配置中要应用 masterauth 来设置校验明码,否则的话,主 redis
会回绝从 redis 的拜访申请
3:replica-read-only:设置从 Redis 为只读
4:repl-ping-replica-period:设置从 redis 会向主 redis 收回 PING 包的周期,默认是 10 秒
5:replica-serve-stale-data:设置当从 redis 失去了与主 redis 的连贯,或者主从同步正在进行中时,redis 该如何解决内部发来的拜访申请。如果设置为 yes(默认),则从 redis 仍会持续响应客户端的申请。如果设置为 no,则从 redis 会对客户端的申请返回“SYNC with master in progress”,当然也有例外,当客户端发来 INFO 申请和 SLAVEOF 申请,从 redis 还是会进行解决。6:repl-timeout:设置主从同步的超时工夫,要确保这个时限比
repl-ping-replica-period 的值要大,否则每次主 redis 都会认为从 redis 超时。7:repl-disable-tcp-nodelay:设置在主从同步时是否禁用 TCP_NODELAY,如果开启,那么主 redis 会应用更少的 TCP 包和更少的带宽来向从 redis 传输数据。然而这可能会减少一些同步的提早,大略会达到 40 毫秒左右。如果敞开,那么数据同步的延迟时间会升高,然而会耗费更多的带宽。8:repl-backlog-size:设置同步队列长度。队列长度(backlog) 是主 redis 中的
一个缓冲区,在与从 redis 断开连接期间,主 redis 会用这个缓冲区来缓存应该发给
从 redis 的数据。这样的话,当从 redis 从新连贯上之后,就不用从新全量同步数据,只须要同步这部分增量数据即可
9:repl-backlog-ttl:设置主 redis 要期待的工夫长度,如果主 redis 等了这么
长时间之后,还是无奈连贯到从 redis,那么缓冲队列中的数据将被清理掉。设置为 0,则示意永远不清理。默认是 1 个小时。10:replica-priority:设置从 redis 优先级,在主 redis 继续工作不失常的状况,优先级高的从 redis 将会降级为主 redis。而编号越小,优先级越高。当优先级
被设置为 0 时,这个从 redis 将永远也不会被选中。默认的优先级为 100
11:min-replicas-to-write:设置执行写操作所需的起码从服务器数量,如果
至多有这么多个从服务器,并且这些服务器的提早值都少于 min-replicas-max-lag
秒,那么主服务器就会执行客户端申请的写操作
12:min-replicas-max-lag:设置最大连贯提早的工夫,min-replicas-to-write 和
min-replicas-max-lag 中有一个被置为 0,则这个个性将被敞开。默认状况下
min-replicas-to-write 为 0,而 min-replicas-max-lag 为 10
13:repl-diskless-sync:是否开启无盘复制,默认是 no
14:repl-diskless-sync-delay:设置无盘复制延时开始秒数,默认是 5 秒,意思是当 PSYNC 触发的时候,master 延时多少秒开始向 slave 传送数据流,以便期待更多的 slave 连贯能够同时传送数据流,因为一旦 PSYNC 开始后,如果有新的 slave 连贯 master,只能期待下次 PSYNC。能够配置为 0 勾销期待,立刻开始
15:repl-diskless-load:是否应用无磁盘加载,这是个实验性的性能,目前
有三个选项:disabled:不要应用无磁盘加载,先将 rdb 文件存储到磁盘
on-empty-db:只有在齐全平安的状况下才应用无磁盘加载 swapdb:解析时在 RAM 中保留以后 DB 内容的正本,间接从套接字获取数据。
复制的基本原理
1:slave 启动时,会向 master 发送 psync 申请,如果这是 slave 从新连贯 master,那么 master 仅仅会复制给 slave 短少的数据; 如果是第一次连贯 master,那么会触发一次全量复制
2:主数据库接到 psync 申请后,如果是全量复制,会在后盾保留快照,就是实现 RDB 长久化,并将保留快照期间接管到的命令缓存起来
3:快照实现后,主数据库会将快照文件和所有缓存的命令发送给从数据库
4:从数据库接管后,会载入快照文件并执行缓存的命令,从而实现复制的初始化
5:如果是从新连贯,Master 会查看 backlog 外面的 offset,master 和 slave 都会保留一个复制的 offset 还有一个 master id,offset 是保留在 backlog 中的。Master 只会把曾经复制的 offset 前面的数据复制给 Slave,相似断点续传。
6:在数据库应用阶段,主数据库会主动把每次收到的写命令同步到从服务器
7:Slave 在复制的时候,不会阻塞 Master 的失常工作;也不会阻塞对本人的查问操作,它会用旧的数据集来提供服务; 然而复制实现的时候,须要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
8:强烈建议:Master 肯定要长久化
乐观复制策略
Redis 采纳乐观复制的策略,容忍在肯定工夫内主从数据库的内容不同,当然最终的数据会是一样的。这个策略保障了性能,在复制的时候,主数据库并不阻塞,照样解决客户端的申请。
Redis 提供了配置来限度只有当数据库至多同步给指定数量的从数据库时,主数据库才可写,否则返回谬误。配置是:min-replicas-to-write、min-replicas-max-lag
无硬盘复制
Master 间接创立一个子过程,来生成 RDB 文件的内容,并通过网络间接传送给 Slave,也就是 RDB 文件不保留到磁盘上。
以前:当复制产生时,主数据库会在后盾保留 RDB 快照,即便你敞开了 RDB,它也会这么做,这样就会导致:
1:如果主数据库敞开了 RDB,当初强行生成了 RDB,那么下次主数据库启动的
时候,可能会从 RDB 来复原数据,这可能是旧的数据。2:因为要生成 RDB 文件,如果硬盘性能不高的时候,会对性能造成肯定影响
因而从 2.8.18 版本,引入了无硬盘复制的性能。
异步复制导致的数据失落
在主备切换的过程中,可能会导致数据失落。因为数据复制是异步的,可能有局部数据还没复制到 slave,master 就宕机了,此时这些局部数据就失落了
脑裂导致的数据失落
脑裂:当某个 master 所在机器忽然脱离了集群的网络,跟其余 slave 机器不能连贯,然而实际上 master 还运行着,此时哨兵可能会认为 master 宕机了,而后开启选举,将其它 slave 切换成了 master,这个时候,集群里就会有两个 master,也就是所谓的脑裂。
这种状况下可能会产生数据失落:
1:此时尽管某个 slave 被切换成了 master,然而客户端可能还没来得及切换到
新的 master,还持续向旧 master 写数据,这些数据可能就失落了
2:当旧 master 再次复原的时候,会被作为一个 slave 挂到新的 master 下来,那么旧 master 原来的数据就会清空,从新从新的 master 复制数据
解决数据失落的形式
配置 min-replicas-to-write 和 min-replicas-max-lag 两个参数,比方:min-replicas-to-write 1
min-replicas-max-lag 10
要求至多有 1 个 slave,数据复制和同步的提早不能超过 10 秒
如果说一旦所有的 slave,数据复制和同步的提早都超过了 10 秒钟,那么这个时候,master 就不会再接管任何申请了
如果呈现了脑裂,一个 master 跟其它 slave 丢了连贯,那么下面两个配置能够确保说,如果不能持续给指定数量的 slave 发送数据,而且 slave 超过 10 秒没有给本人应答音讯,那么就间接回绝客户端的写申请
后记
我会继续的把我学习 Redis6.x 过程的笔记记录下来,跟大家一起学习。心愿能坚持下去!