最近学习Redis6.x,特作笔记以备忘,与你们共学。课程是从私塾在线下载的,他们把架构师课程都放出来了,你们能够去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值得学习!关键是不要钱,嘻嘻!node
Redis支持复制的功能,以实现当一台服务器的数据更新后,自动将新的数据异步同步到其它数据库。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的正常工做;也不会阻塞对本身的查询操做,它会用旧的数据集来提供服务; 可是复制完成的时候,须要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了 less
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过程的笔记记录下来,跟你们一块儿学习。但愿能坚持下去!