当并发量达到一定程度时,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。
原理
如果master的rdb还没生成完成,此时如果有其他slave连进来,是可以直接使用这个rdb以及缓冲区的命令的,如果已经生成完,则会重新生成rdb文件。
虽然从库的数据可以作为备份,但是还是建议开启主库的持久化。如果没有开启,当主库宕机重启后,主库的数据是空的,而从库就会把空的数据复制过来并清空自身的数据,则从库的数据也变成空的了。
以上流程是第一次同步的时候,redis也支持断点续传。master中记录了backlog,master和redis都记录了对应的offset,master根据这个offer进行同步数据,如果没有对应的offset,只能全量复制了。
一主多从
生成rdb时,是fork了一个子进程来处理,此时并不影响master接收客户端的命令,但是redis处理命令的效率会降低。如果我们需要多个slave,会导致master的性能下降的严重,所以我们可以采用一主多从的方式来做。
当从服务器1从master同步的时候,他会断开从服务器a、b、c的连接,同步完成后,再把数据以master的形式同步给服务器a、b、c。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。