Redis 主从复制
Write by lyc at 2018-2-7
Modify by lyc at 2020-4-13 细化文档
参考博文:
Redis主从复制学习
Redis master-slave replication(配置Redis主从复制)
一、Redis主从复制原理
1.主从复制原理
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
2.Redis主从节能读写功能说明
- 一个master可以有多个slave
- 默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止,即开启只读
slave-read-only yes
- 不要修改配置让slave节点支持写操作,没有意义,原因是:
- 原因1:在slave写入的数据不会被同步到其他节点;
- 原因2:当master节点修改同一条数据后,slave节点的数据会被覆盖掉
- slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来
- master节点挂了以后,不影响slave节点的读,Redis将不再提供写服务,master节点启动后Redis将重新对外提供写服务。
3.对有密码的情况说明一下,当master节点设置密码时:
- 客户端访问master需要密码
- 启动slave需要密码,在配置中进行配置即可
- 客户端访问slave不需要密码
4.Master持久化功能关闭时主从复制的安全性
当有需要使用到主从复制机制时,一般都会强烈建议把master的持久化开关打开。即使为了避免持久化带来的延迟影响,不把持久化开关打开,那么也应该把master配置为不会自动启动的。
为了更好地理解当一个不进行持久化的master如果允许自动启动所带来的危险性。可以看看下面这种失败情形:
假设我们有一个redis节点A,设置为master,并且关闭持久化功能,另外两个节点B和C是它的slave,并从A复制数据。
如果A节点崩溃了导致所有的数据都丢失了,它会有重启系统来重启进程。但是由于持久化功能被关闭了,所以即使它重启了,它的数据集是空的。
而B和C依然会通过主从复制n机制从A复制数据,所以B和C会从A那里复制到一份空的数据集,并用这份空的数据集将自己本身的非空的数据集替换掉。于是就相当于丢失了所有的数据。
即使使用一些HA工具,比如说sentinel来监控master-slaves集群,也会发生上述的情形,因为master可能崩溃后迅速恢复。速度太快而导致sentinel无法察觉到一个failure的发生。
二、Redis主从搭建
1.slave 配置文件配置
1 | $ vim 6379_redis.conf |
slave-serve-stale-data yes
当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:slave-serve-stale-data yes
(默认设置),从库会继续响应客户端的请求。slave-serve-stale-data no
除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。
slave-read-only no
设置你的slave服务是否为只读,从库设置成yes,开启只读,命令行下可以通过CONFIG SET
来动态修改配置slave-priority 100
slave优先级,如果master不再正常工作了,哨兵将用它来选择一个slave提升为master。数字越小优先级越高,但是数字为0时这个slave永远不会提升为masterslaveof <masterip> <masterport>
设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步masterauth <master-password>
当master服务设置了密码保护时,slave服务连接master的密码。命令行下可以通过config set masterauth <password>
来动态修改配置
2.命令行配置
redis > slaveof 192.168.99.207 6379
- 或在redis-server启动命令后加上–slaveof 启动时生效。
3.断开主从
在redis命令行里执行 slaveof no one
可以让一个从库变成主库。
1 | # redis命令行在从库断开主从 |
三、总结:相关的参数,注释掉的参数都是使用默认值。
1 | ################################# REPLICATION ################################# |