redis(五)——管道、主从复制
管道
Redis管道是一种网络优化技术,允许客户端一次性发送多个命令到服务器,然后一次性接收所有响应,而不是每个命令都等待响应。主要就是解决执行一个命令需要建立一次链接,如何发送到redis服务器执行,执行完后再返回客户端,返回后客户端才能再执行下一条命令,这样的时间就太长了,管道就是通过一次性向redis服务器推送多个命令,然后命令全部执行完再返回客户端,解决了中间来回往返等待的时间RTT。
那和事务有什么区别?
层面 | 事务(Transaction) | 管道(Pipeline) |
|---|---|---|
服务器支持 | ✅ 有MULTI/EXEC等命令 | ❌ 无专门命令 |
实现位置 | 服务端+客户端 | 纯客户端实现 |
技术本质 | Redis协议功能 | 网络优化技术 |
最大的区别就是,事务multi在服务器端是有专门的事务队列的,可以保证全部执行/全部不执行的原子性(不能全部成功/全部失败的原子性),而管道是在客户端开辟的一个命令队列,客户端使用exec命令会一次性发给redis服务器,这个中途是可以被其他客户端的命令插队的,事务是必须队列里的命令全部执行完才允许其他客户端的命令执行的。
那和原生mset,mget批量有什么区别?
区别也是差不多的,mset,mget都是一次命令,其他客户端命令是要等待这个命令执行完的,而管道就不是。
主从复制
这个其实也和mysql的主从复制差不多,都是读写分离,主机负责写,从机负责读。我们先来看相关的配置
配置项 | 默认值 | 作用 | 使用场景 | 示例 |
|---|---|---|---|---|
🔐 基本配置 | ||||
| 无 | 设置主节点地址和端口(新版本叫REPLICAOF | 从节点配置 |
|
| 无 | 连接主节点的密码 | 主节点有密码时 |
|
|
| 从节点是否只读 | 防止从节点数据修改 |
|
| 无 | 从节点对外公布的IP | NAT网络环境 |
|
⚙️ 性能优化 | ||||
|
| 复制积压缓冲区大小 | 优化部分重同步 |
|
|
| 主节点下线后缓冲区保留时间(秒) | 故障恢复 |
|
|
| 复制超时时间(秒) | 网络不稳定环境 |
|
|
| 从节点ping主节点间隔(秒) | 心跳检测 |
|
|
| 是否使用无盘复制 | 网络带宽好时 |
|
|
| 无盘复制前等待时间(秒) | 等待更多从节点 |
|
🛡️ 安全配置 | ||||
| 无 | Redis实例密码 | 安全认证 |
|
| 无 | 连接主节点的密码 | 主从认证 |
|
|
| 主节点宕机时是否提供旧数据 | 高可用性 |
|
|
| 哨兵模式下的优先级 | 故障转移 |
|
📊 监控调试 | ||||
|
| 是否禁用TCP_NODELAY | 网络优化 |
|
|
| 最少从节点数才接受写操作 | 数据安全 |
|
|
| 从节点最大延迟(秒) | 数据一致性 |
|
最重要的其实就是以下几个配置或者命令
slaveof <ip> <port>或者replicaof <ip> <port>
这个可以是命令也可以是配置写到配置文件中,这个就是确定谁是主机,使用命令的话可以更换配置中的主角,但是如果重启服务还是会从配置文件中读取配置,上次的命令是不会保存到配置文件中的。如果使用命令更改主机会清除当前的数据,重新拷贝新主机的数据。
SLAVEOF NO ONE 或者REPLICAOF NO ONE
这个命令是自己不再是从机了,造反自立山头变成主机了
info replication
这个命令是查看当前的主从复制信息的具体内容如下:
# 主节点输出示例
127.0.0.1:6379> INFO replication
# Replication
role:master #角色主机
connected_slaves:2 #俩从机lag表示延迟秒数
slave0:ip=192.168.1.101,port=6380,state=online,offset=1098,lag=0
slave1:ip=192.168.1.102,port=6381,state=online,offset=1098,lag=1
master_repl_offset:1098
repl_backlog_active:1 #积压缓冲区是否激活,1表示激活
repl_backlog_size:1048576 #缓存区大小
repl_backlog_first_byte_offset:1 #缓存区起始偏移量
repl_backlog_histlen:1098 #缓冲区历史长度主从复制的一些问题,
1个是主机挂了,从机还是从机不会自动上位的,这个期间数据不会丢失可以读但是不能写,从机只能读,不然不就乱套了,他会一直等待主机重新在线。
2是如果有三台redis机器,A是主机,B是A的从机,C是B的从机,那么不管A是否在线B都是不能执行写操作的,只是这种链式架构可以减轻A主机的压力。
总结的重点就是主机才可以写,从机只能读,除非当主机SLAVEOF NO ONE。
流程和缺点
流程
从机只要启动就会等待主机上线,第一次链接到主机后就会清空本地数据,然后全量复制主机的数据,主机在接到从机的链接请求后会立刻生成当前最新的RDB文件,在保存RDB文件的的时候会把客户端的命令缓存(当主机还是会执行的,因为RDB是后台进程,是上一个时刻的快照)然后一起把RDB文件和缓存的命令发到从机进行复制。然后主机会持续给从机发送心跳(repl-ping-replica-period 10默认10秒),如果从机没回复就会发现从机挂了,如果定期主机没发心跳那么超时就是主机挂了。
然后就是增量复制阶段了,主机持续把修改的命令传递到从机。如果从机下线了再上线,那么master会检查backlog里面的offset偏移量,master和slave都会保存一个复制的offset还有一个masterld,offset是保存在backlog中的。 Master只会把已经复制的offset后面的数据复制给Slave,类似浙点续传。
缺点
缺点很明显,一个就是延迟,尤其是一主多从的情况下,延迟会越来越高,一方面对主机的性能压力比较大,另一方面是向上面说的ABC主机情况延迟会越来越严重。
其次就是从机只能读,主机只要一挂就必须人为干预了,不能自己选一个老大出来,这个也是是否让人老火的,那怎么办看主包下期吧。
总结
主要讲的就是管道和主从复制。
