一、主从模式:
主从模式主要解决2个问题:
- Redis单点故障:分布式环境下不允许出现单点,也即当某个结点挂了,得有替补接上。
- 读写分离:Redis虽然是一个高性能的数据库,但单机总有瓶颈,所以增加从库来分担读压力。主库来接收写命令,各个从库分担大量的读请求。
二、搭建主从:
通过info replication 可以查看当前结点的身份信息,与当前结点的从库信息。
建立主从关系是在从库上进行配置的:
每个启动的Redis结点,默认是一个主库(master)。可以通过下面方式,让当前从库成为某个结点的从库(slave):
- 通过在redis.conf里配置
SALVEOF 主节点IP 主节点端口
,随时Redis的启动而建立联系; - 通过在启动Redis时,在 redis-server启动命令后,加上
SALVEOF 主节点IP 主节点端口
命令指定; - 在启动Redis后,通过
SALVEOF 主节点IP 主节点端口
命令指定。
断开主从关系:
从库执行salveof no one
后,从库断开与主库的连接,然后将自己变回master。
断开从库后,从库之前从主库同步的数据不会清除。
切换主从关系:
从库再次执行SALVEOF 主节点IP 主节点端口
后,将与旧的主库端来连接,并清除从旧的主库那里同步来的数据。然后与新的主库建立连接,开始同步新的主库数据。
注意:
- 安全性: 对于数据重要的主节点,会配置
requirepass
设置连接时的密码,从结点必须要配置masterauth
参数来设置密码。 - 只读: 由于数据只会从主库同步到从库。从结点应该设置为只读,否则从结点也接收写命令,只会造成主从数据不一致。使用
salve-of-readonly=yes
进行配置。 - 传输延迟:
repl-disable-tcp-nodelay
来控制传输延迟,默认是关闭的。
关闭时,主库接收到新的写命令,无论大小都会即时同步到从库。
开启时,主库会把较小的TCP数据包合并后,一起发送。
三、主从拓扑结构:
-
一主多从: 一个主节点直接连接多个从结点。
缺点:在写并发略高后,主库不仅要承受接收客户端的写命令,还要同步多个从库,这时多个从库的同步反而影响了主库的性能。 -
树状拓扑: 针对上面的缺陷,假设本来主库有10个从库,现在让主库只直接相连2个从库,这2个从库再作为主库(不开启接收写命令,只做中间同步的缓冲),将剩下的结点作为自己的从库。这样就减少了顶层主库(真正接收写命令)同步带来的消耗。
缺点: 降低了主从间数据一致性的延迟。
参考书籍:
《Redis开发与运维》