当并发量达到一定程度时,web应用无法处理这么多请求,我们可以用nginx做负载均衡,连接多个web应用。当数据库无法支撑的时候,我们做主从架构,读写分离,分担数据库压力。在redis中,也可以用主从来分担压力。

简单配置

复制redis.windows.conf文件,修改端口,以及添加slaveof这行配置。slaveof用于指向主redis服务的ip和端口。

port 6380
slaveof 127.0.0.1 6379

先启动master,再启动slave,可以看到slave已经同步了master的数据,在master的操作,也会同步到slave中。
master的信息,可以看到他role是master,有个从服务器slave0,以及slave0的相关信息。

local:0>info replication
"# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=208,lag=1
master_repl_offset:208
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:207
"

salve的信息,可以看到他的role是slave,以及master的相关信息。

local6380:0>info replication
"# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:194
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
"

如果想让slave断开同步,则可以执行slaveof no one命令,再查看info replication时,发现他slave已经变成了master。如果继续同步,则执行slaveof 127.0.0.1 6379,此时查看info replication,role还是slave。

原理

image.png
如果master的rdb还没生成完成,此时如果有其他slave连进来,是可以直接使用这个rdb以及缓冲区的命令的,如果已经生成完,则会重新生成rdb文件。
虽然从库的数据可以作为备份,但是还是建议开启主库的持久化。如果没有开启,当主库宕机重启后,主库的数据是空的,而从库就会把空的数据复制过来并清空自身的数据,则从库的数据也变成空的了。
以上流程是第一次同步的时候,redis也支持断点续传。master中记录了backlog,master和redis都记录了对应的offset,master根据这个offer进行同步数据,如果没有对应的offset,只能全量复制了。

一主多从

生成rdb时,是fork了一个子进程来处理,此时并不影响master接收客户端的命令,但是redis处理命令的效率会降低。如果我们需要多个slave,会导致master的性能下降的严重,所以我们可以采用一主多从的方式来做。
image.png
当从服务器1从master同步的时候,他会断开从服务器a、b、c的连接,同步完成后,再把数据以master的形式同步给服务器a、b、c。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆