上节学习了Redis的持久化,到底需不需要对数据持久化,看我们业务需求。当我们把Redis当成缓存来使用(像memcache一样),不建议开启持久功能;当我们需要把Redis当成存储系统来使用,需要开启持久化功能。两者需求都有,建议开启两个Redis实例。
在同一台服务器可以开启多个Redis实例,需要分别设置端口号。不同的实例之间可以是独立的,也可以建立主从关系。不仅是在同一台服务器,使用多台服务器多个Redis实例,可以做一个功能强大的Redis主从服务架构。
Redis主从复制
在Redis中实现主从复制比较简单,只需要修改slave服务器的redis.conf中的slaveof。下面利用一个具体的实例展示主从同步。
1)目前有一个Redis实例
我们把它当成主Redis服务,意为“master”。master可以有多个slave(从Redis服务),master主要用来做写操作,slave用来做读操作。
除了多个slave连接到master外,slave也可以连接到其他slave,形成网状结构。
2)配置slave(从Redis服务)
拷贝一份配置文件,当做slave的配置文件。
修改配置文件如下参数:
改下port(端口号为6380),不要和主Redis端口号重复。
加上如下内容:
slaveof 127.0.0.1 6379 # 设置master服务器IP和端口 slave-read-only yes # slave是否只读,从服务器负责读操作,主服务器负责写操作,从而实现读写分离
3)启动slave并检验主从复制效果
(-p 指定请求Redis实例的端口号)启动完那一刻,立马就同步了master的所有数据。
备注:role命令可以查看当前的Redis实例角色:
因为我们设置了slave只读,所以添加数据会报错。
在master下添加数据看看slave下会不会立马显示(用两个窗口测试):
在master添加的“p4”键在slave中立马就显示了。
4)修改下RDB备份文件名字
因为master与slave的RDB备份文件是同一个,然后我们再新开个salve(端口为6381),使用新的RDB备份文件,看看效果如何?
通过以上演示,可看出,即便RDB备份文件不一样,也能立马同步。
下面来研究下slave服务器和master服务器间是如何建立起主从同步机制的。
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部署流程:
不是主从关系的实例是否是独立的?
一个Redis实例如果不与其他实例建立主从关系,也就是配置文件中没有这行配置
slaveof 127.0.0.1 6379 # 设置master服务器IP和端口
两个实例之间的数据是不是不一样?演示:
配置文件:
port 6382 dbfilename dump3.rdb #两个不同的实例备份文件不要一样,不然两个实例的备份会相互覆盖
不是主从关系的实例的确是相互独立的。
一般建立这种主从关系的架构是在多台服务器建立的,在一台服务器上开启这么多Redis实例建立主从关系没有必要。