redis笔记2-命令
文章目录
reds主从复制笔记
关于redis的风险问题讨论
- 机器出现故障
如果机器产生故障,数据丢失会对业务项目造成灾难性后果
- 容量产生瓶颈
机器的内存,硬盘是有限的,如果一直采用单机,那么内存就要一直升级。
- I/O开销
如果对单一服务器总是进行读写操作,开销是非常大的。需要缓解压力。
**由此,要避免服务器产生故障,我们要准备多台服务器,用来组成集群,互相连通,读写分离,将数据复制成多个副本,并保存在不同的节点上,而且保证数据都是同步的,当一台机器出现宕机的情况,其他的服务器不会受到影响,继续提供服务。**因而我们需要提供一些高可用方案来实现这些功能。
redis主从复制,也就是将master中的数据即时有效的复制到slave中。例如:
集群的方案:
-
提供数据:master,主节点,负责写数据,做操作时会将变化的数据自动同步到slave
-
接收数据:slave,从节点,负责读数据,禁止写数据
主从复制作用
- 读写分离:master写,slave读,提高服务器读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
主从复制
1.主从连接
首先slave会发送命令slaveof ip port,master接收到命令开始响应,slave保存master的ip和端口,根据保存的信息创建连接master的socket,为了保证连接正常,slave会周期发送ping命令,master再响应pong,有密码的话,slave会发送auth password,master验证授权,最后slave发送端口信息,master保存slave端口号。(步骤都会在启动日志中有显示)
三种方式:
①.使用客户端命令: slaveof
②.启动服务器时加参数:redis-server -slaveof
③.修改配置文件:在slave节点的conf文件中添加:slaveof
如果设置了密码,那么slave的conf文件中还要加入masterauth ,要不然无法授权
这里选择用第三种方式来连接。
master节点
slave节点
然后向master中写一个数据,成功在slave中读取到
如果想断开连接的话,我们在slave节点客户端使用命令:slaveof no one即可。
2.数据同步
slave初次连接master之后,master会将所有数据复制到slave中,将slave的状态更新成master的当前状态。数据同步的阶段主要是两步,第一步做全量复制,第二步做部分复制。
全量复制:slave请求同步数据,然后master创建rdb同步数据,通过socket发送给slave,slave接收rdb并清空数据,执行rdb恢复,并发送命令告诉master,rdb恢复完成。
但是有一点,在执行全量复制过程中,master复制缓冲区中还是会有一条条的指令过来,这时候的状态并不在全量复制的快照中,所以,需要再进行第二步,部分复制。
部分复制:slave请求部分同步数据,然后master复制缓冲区的信息给slave,slave接收信息并执行,恢复数据。
如果复制缓冲区的大小设置不合理,会导致数据溢出,比如说,全量复制的周期长了,由于缓冲区是一个FIFO队列,满了的情况下,再进来命令,那么前面的命令就会丢失,所以进行部分复制的时候会有数据丢失,那么又要进行第二次全量复制,导致slave陷入死循环。
所以我们可以自行在配置文件中配置合适的repl-backlog-size的大小
文章作者 halface
上次更新 2020-04-30