我们在业务中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等要求
下面总结介绍下:
1,主从复制的配置
2,复制的过程和原理
默认情况下redis都是master,每个从节点只能有一个master,但主节点同时可有多个slave。复制的数据流是单向的,只能由主节点复制到从节点,且是异步复制(主节点只负责将要复制的数据发出,至于从节点是否有接收或者同步完成,主节点不关心),配置复制(从节点)方式有以下三种:
1,redis的配置文件redis.conf 中加入 slaveof masterHost masterPort 重启redis生效
2,启动redis启动时候指定参数 redis-server启动命令后增加 --slaveof masterHost masterPort
3,redis-cli 下直接使用命令 slaveof masterHost masterPort
开启主从复制,主实例 bind 127.0.0.1 需要注释或者bind 0.0.0.0 ,并将protected-mode 保护模式配置为no
redis-cli下命令info replication 可查看主从状态复制的状态信息。
断开复制:从节点redis-cli 下执行slave no one 即可断开。另外尝试连接从节点不会主动终止,连接失败会持续重试。
在从节点执行slaveof后,复制过程便开始运作,整个复制过程大致分为6个阶段
socket连接建立后,从节点发送ping请求进行首次通信,ping的主要目的在于 检测主从之前网络连接是否可用,检测主节点当前是否可接受处理命令,如果发送ping命令后,从节点没有收到主节点pong回复或者超市(如网络超时、主节点在阻塞中无法响应命令),从节点会断开复制连接,下次定时发起重连(每隔1s,轮询重试)
如果主节点master的redis.conf 有配置requirepass 123456,从节点的配置项主节点密码需保持一致masterauth 123456。如果验证失败复制将终止,从节点重新发起复制流程。
一般用于初次复制的场景
psync runid offset
runid是从节点保存的主节点的runid,没有默认则为?。runid作为节点唯一ID,主节点发生重启,runid会发生改变。在主从关系中,若从节点没有关闭slaveof的情况下,主节点发生重启,会导致从节点数据全部重写(如果主节点清空数据并做重启操作,会导致从节点数据也清空)
offset是值参与复制的节点各自所维护的自身复制偏移量,主节点在处理完写入命令后,会对offset做记录更新,从节点也会每秒上报自身复制偏移量给主节点,同时每接收完数据会更新自身的复制偏移量。
复制客户端缓冲区
从节点在接收主节点发送的rdb文件的期间,主节点会正常响应业务请求,这期间的命令写入会保存在复制客户端缓冲区内,当从节点完成rdb文件加载后,主节点再把缓冲区数据发送给从节点,从而保证双方数据一致。
对应的配置项为 client-output-buffer-limit salve 256MB 64MB 60 (如果缓冲区数据持续60s大于64M,或直接大于256M,则主节点将直接关闭复制客户端连接,造成全量同步失败)。若主节点数据写入量大的情况,需根据情况调整此参数。
2. 部分复制
复制积压缓冲区
此缓冲区在主节点有连接的从节点时候会被创建,默认大小为1M,主节点在响应业务写入时,除了将数据同步给从节点,同时也会将其写入复制积压缓冲区,区内的数据为先进先出,只保留最新的。
部分复制发生在已经建立主从关系的双方由于各种原因出现中断时,如果超过repl-timeout配置时间(默认为60s),主节点会中断复制连接。
最后,腾讯云的redis高可用也是采用主从的方式,当redis实例很不幸发生物理机异常等情况,能切换从实例读写,减少由于此种情况对业务的影响~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。