第十八章:Redis的配置——主从模式

更新于:2019-02-28 11:13:21

上节学习了Redis的持久化,到底需不需要对数据持久化,看我们业务需求。当我们把Redis当成缓存来使用(像memcache一样),不建议开启持久功能;当我们需要把Redis当成存储系统来使用,需要开启持久化功能。两者需求都有,建议开启两个Redis实例。


在同一台服务器可以开启多个Redis实例,需要分别设置端口号。不同的实例之间可以是独立的,也可以建立主从关系。不仅是在同一台服务器,使用多台服务器多个Redis实例,可以做一个功能强大的Redis主从服务架构。


Redis主从复制


在Redis中实现主从复制比较简单,只需要修改slave服务器的redis.conf中的slaveof。下面利用一个具体的实例展示主从同步。


1)目前有一个Redis实例


1.png

我们把它当成主Redis服务,意为“master”。master可以有多个slave(从Redis服务),master主要用来做写操作,slave用来做读操作


1.png

除了多个slave连接到master外,slave也可以连接到其他slave,形成网状结构。


2)配置slave(从Redis服务)


1.png


拷贝一份配置文件,当做slave的配置文件。


修改配置文件如下参数:


1.png


改下port(端口号为6380),不要和主Redis端口号重复。


加上如下内容:

slaveof 127.0.0.1 6379 # 设置master服务器IP和端口
slave-read-only yes # slave是否只读,从服务器负责读操作,主服务器负责写操作,从而实现读写分离


3)启动slave并检验主从复制效果


1.png


(-p 指定请求Redis实例的端口号)启动完那一刻,立马就同步了master的所有数据。


备注:role命令可以查看当前的Redis实例角色:

271551248433106921.png


1.png


因为我们设置了slave只读,所以添加数据会报错。


在master下添加数据看看slave下会不会立马显示(用两个窗口测试):


1.png


在master添加的“p4”键在slave中立马就显示了。


4)修改下RDB备份文件名字


1.png


因为master与slave的RDB备份文件是同一个,然后我们再新开个salve(端口为6381),使用新的RDB备份文件,看看效果如何?


1.png


1.png


1.png


1.png


通过以上演示,可看出,即便RDB备份文件不一样,也能立马同步。


主从复制如何交互:


下面来研究下slave服务器和master服务器间是如何建立起主从同步机制的。

1.png


1.Slave服务启动,主动连接Master,并发送SYNC命令,请求初始化同步

2.Master收到SYNC后,执行BGSAVE命令生成RDB文件,并缓存该时间段内的写命令

3.Master完成RDB文件后,将其发送给所有Slave服务器,

4.Slave服务器接收到RDB文件后,删除内存中旧的缓存数据,并装载RDB文件

5.Master在发送完RDB后,即刻向所有Slave服务器发送缓存中的写命令

至此初始化完成,后续进行增量同步


上述主从复制模式链是非常脆弱的,一旦Master服务器发生宕机,会导致无法向redis中读取或者写入数据,高可用性较低。 需要搭建高可用性强的Redis主从架构,可阅读这篇分享文章《Redis的高可用性》。


常用的Redis部署流程:


1.png


不是主从关系的实例是否是独立的?


一个Redis实例如果不与其他实例建立主从关系,也就是配置文件中没有这行配置

slaveof 127.0.0.1 6379 # 设置master服务器IP和端口


两个实例之间的数据是不是不一样?演示:


1.png


配置文件:

port 6382
dbfilename dump3.rdb #两个不同的实例备份文件不要一样,不然两个实例的备份会相互覆盖


1.png


不是主从关系的实例的确是相互独立的。


一般建立这种主从关系的架构是在多台服务器建立的,在一台服务器上开启这么多Redis实例建立主从关系没有必要。