Redis主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用
-
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
-
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
-
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在 写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
-
读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
-
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从复制原理
主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。
在从节点执行 slaveof 命令后,复制过程便开始运作,下面图示大概可以看到,
从图中可以看出复制过程大致分为6个过程
开工
建立复制
-
主节点和从节点:主节点一般理解为对外提供服务的节点,而从节点是备份节点或者备用节点,默认情况下,redis的节点都是主节点,但可以手工设置为从节点,一点设置了从节点后,数据只能从主节点流向从节点,也就是单向的,不能从 从节点流向主节点。
-
设置 连接复制命令的三种方式:
在配置文件中配置:slaveof 主节点IP地址 主节点端口号 启动命令中指定参数:redis-server slaveof 主节点IP地址 主节点端口 --port 从节点端口号 在 从节点 redis-cli 交互窗口直接输入命令:slaveof 主节点IP地址 主节点端口号
-
演示 连接
-
启动 主-从服务端
redis-server --port 6379 redis-server --port 6380
-
进入 从从节点 客户端,设置连接的主节点
redis-cli -p 6380 127.0.0.1:6380> slaveof 127.0.0.1 6379 OK
此时就已经连接成功了,我们测试一下
-
主节点存储数据
127.0.0.1:6379> set name "zhangsan" OK
-
从节点查看
127.0.0.1:6380> get name "zhangsan"
-
我们刚才也提到了,一旦 redis 变成了从机,就会不存储数据了
127.0.0.1:6380> set age 18 (error) READONLY You can't write against a read only slave.
-
主节点查看从节点信息
127.0.0.1:6379> info replication # Replication role:master # 本节点角色 connecteed_slaves:1 # 已连接的节点数 slave:ip=127.0.0.1,port=6380,state=online,offset=35197452,lag=0 # 从节点的信息
-
从节点查看主节点
127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:6 # 主节点最后一次IO的时间 master_sync_in_progress:0 slave_repl_offset:35197620
- 断开连接
-
断开与当前主节点 的连接:
slaveof no one
:切开与主节点连接,原来的数据不会删除 -
切换新的主节点:
slaveof 新的主节点IP 新主节点端口号
,同样执行 上面的操作再来一遍就OK了。
原来的数据 也还是存在,需要自己删除。(不删除 还是很有便捷性的,比如下文要说的 哨兵)