主从模式的概念:
主从模式就是N个redis实例,可以是1主N从,也可以N主N从(N主N从则不是严格意义上的主从模式了,后续的集群模式会说到,N主N从就是N+N个redis实例。)
主从模式的一个作用是备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据因为有备份,可以方便恢复。
另一个作用是负载均衡,所有客户端都访问一个节点肯定会影响Redis工作效率,有了主从以后,查询操作就可以通过查询从节点来完成
redis主从需要了解的概念
一个Master可以有多个Slaves,可以是1主N从。
默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止(readonly)。
不要修改配置让slave节点支持写操作,没有意义,原因一,写入的数据不会被同步到其他节点;原因二,当master节点修改同一条数据后,slave节点的数据会被覆盖掉。
slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来。
master节点挂了以后,不影响slave节点的读,Redis将不再提供写服务,master节点启动后Redis将重新对外提供写服务。
特别说明:该种模式下,master节点挂了以后,slave不会竞选成为master。哨兵模式(Sentinel)下会进行master的竞选,后续我们再尝试
主从模式的搭建
- 启动一个节点,把它当做master节点(port:7001)
- 配置slave节点(port:7000)有两种方法
- 我们可以直接在配置文件中加入配置
slaveof 192.168.3.67 7001
然后启动就可以了
- redis-cli 进入操作界面后
192.168.3.67:7000> slaveof 192.168.3.67 7001
OK Already connected to specified master
测试主从节点
master节点上的信息
192.168.3.67:7001> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.3.67,port=7000,state=online,offset=2379,lag=0
master_replid:ed564db30c302becd3995539e7ce9b30ad5d5af6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2379
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2379
slave几点上的信息
192.168.3.67:7000> info Replication
# Replication
role:slave
master_host:192.168.3.67
master_port:7001
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:2337
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ed564db30c302becd3995539e7ce9b30ad5d5af6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2337
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2337
在master上set key-value
然后在从节点get
192.168.3.67:7001> set test hello
OK
192.168.3.67:7000> get test
"hello"
从节点只读,写的话会报错
192.168.3.67:7000> set test nihao
(error) READONLY You can't write against a read only replica.
断开主从关系
通过slaveof <masterip> <masterport>命令建立主从复制关系以后,可以通过slaveof no one断开。需要注意的是,从节点断开复制后,不会删除已有的数据,只是不再接受主节点新的数据变化。
从节点执行slaveof no one后,打印日志如下所示;可以看出断开复制后,从节点又变回为主节点
参考文章
-
主从复制
搭建以及主从之间数据复制的问题 -
redis 服务器的安装、主从复制的搭建
搭建和测试