Redis主从拷贝的特点
- 同一个Master可以拥有多个Slaves。
- Master下的Slave还可以接受同一架构中其它slave的链接与同步请求,实现数据的级联复制,即Master->Slave->Slave模式;
- Master以非阻塞的方式同步数据至slave,这将意味着Master会继续处理一个或多个slave的读写请求;
4.Slave端同步数据也可以修改为非阻塞是的方式,当slave在执行新的同步时,它仍可以用旧的数据信息来提供查询;否则,当slave与master失去联系时,slave会返回一个错误给客户端;
- 主从复制具有可扩展性,即多个slave专门提供只读查询与数据的冗余,Master端专门提供写操作;
- 通过配置禁用Master数据持久化机制,将其数据持久化操作交给Slaves完成,避免在Master中要有独立的进程来完成此操作。
Redis主从拷贝的过程
slave连接上master之后,slave发送一个SYNC命令到master,master接收到命令之后,无论是第一次同步建立的连接,还是连接断开后的重新连接,master会开启BGSAVE操作,启动一个后台进程,保存一份当前master内存快照,并且开始保存从调用BGSAVE之后的所有写命令,master生成完快照之后,发送内存快照rdb文件给slave。slave接收到master发送过来的rdb文件之后,将清空所有旧数据,加载接收到的rdb文件到内存中,发送完rdb文件给slave之后,开始发送刚刚保存的写操作日志给slave,slave执行这些写操作,至此,主从数据保存一致。发送完写日志之后,master会增量发送之后的写操作给slave,使主从一致。
ps: 当master和slave的连接断开时,slave可以自动重新建立连接。如果master同时收到多个slave发来的同步连接命令,只会使用启动一个进程来写内存快照,然后发送给所有的slave
Master write, Slave read机制
redis的主从复制,通过程序实现数据的读写分离,让master负责处理些请求,slave负责处理读请求,通过扩展slave处理更多的并发请求,减轻master端的负载。
ps:在程序中判断用户的读写请求,将write请求发送给master,read请求发送给slave处理
redis主从拷贝配置
开启主从复制,最简单的方式,连接上从机redis,执行slaveof <主机host> <主机端口>,另外也可以在从机的配置文件中加入slaveof <主机host> <主机端口>,这样从机启动的时候,就会自动连接主机,并且同步数据。
slaveof 192.168.100.126 6379 # 配置主机信息
masterauth # 如果主机设置了密码,配置密码
slave-serve-stale-data yes # 配置当从机正在和主机进行同步的时候是否响应,如果配置是,有可能客户端会读到旧数据,如果配置否,当请求读数据的时候,将会报错SYNC with master in progress
slave-read-only yes # 从机是否只读。这边设置可写,不会同步到主机,
repl-ping-slave-period 10 # 从机发送ping命令到主机的间隔时间。
repl-timeout 60 # 主机响应超时时间,这个包括传输超时,IO超时,ping超时,注意这边时间必须大于上面的间隔时间,要不然会一直报超时错误。
repl-disable-tcp-nodelay no # 是否禁用TCP NODELAY。官方对这个配置用法的建议是:
# By default we optimize for low latency, but in very high traffic conditions
# or when the master and slaves are many hops away, turning this to “yes” may
# be a good idea.
# 默认情况下,我们优化目的是为了低延迟,但是在高传输条件或者主从机分布在路由很多跳之外的,建议禁用掉tcp-nodelay。
slave-priority 100 # 如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master