Redis高可用-主从复制

这里写目录标题

Redis主从复制

虽然 Redis 可以实现单机的数据持久化,但无论是 RDB 也好或者 AOF 也好,都解决不了单点宕机问题,即一旦 redis 服务器本身出现系统故障、硬件故障等问题后,就会直接造成数据的丢失,因此需要使用另外的技术来解决单点问题。

主从复制过程

Redis 支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从主服务器备份数据,而且从服务器还可与有从服务器,即另外一台 redis 服务器可以从一台从服务器进行数据同步,redis 的主从同步是非阻塞的,其收到从服务器的 sync(2.8 版本之前是 PSYNC)命令会 fork 一个子进程在后台执行 bgsave 命令,并将新写入的数据写入到一个缓冲区里面,bgsave执行完成之后并生成的将 RDB 文件发送给客户端,客户端将收到后的 RDB 文件载入自己的内存,然后主 redis 将缓冲区的内容在全部发送给从 redis,之后的同步从服务器会发送一个 offset 的位置(等同于 MySQL 的 binlog 的位置)给主服务器,主服务器检查后位置没有错误将此位置之后的数据包括写在缓冲区的积压数据发送给 redis 从服务器,从服务器将主服务器发送的挤压数据写入内存,这样一次完整的数据同步,再之后再同步的时候从服务器只要发送当前的 offset 位 置给主服务器,然后主服务器根据响应的位置将之后的数据发送给从服务器保存到其内存即可。Redis 全量复制一般发生在 Slave 初始化阶段,这时 Slave 需要将 Master 上的所有数据都复制一份。

具体步骤如下:
1)从服务器连接主服务器,发送 SYNC 命令;
2)主服务器接收到 SYNC 命名后,开始执行 BGSAVE 命令生成 RDB 快照文件,并使用缓冲区记录此后执行的所有写命令;
3)主服务器 BGSAVE 执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
7)后期同步会先发送自己 slave_repl_offset 位置,只同步新增加的数据,不再全量同步。

环境搭建

程序端连接到高可用负载的 VIP,然后连接到负载服务器设置的 Redis 后端 real server,此模式不需

要在程序里面配置 Redis 服务器的真实 IP 地址,当后期 Redis 服务器 IP 地址发生变更只需要更改

redis 相应的后端 real server 即可,可避免更改程序中的 IP 地址设置。

从节点配置

Redis Slave 也要开启持久化并设置和 master 同样的连接密码,因为后期 slave 会有提升为 master 的

可能,Slave 端切换 master 同步后会丢失之前的所有数据。

一旦某个 Slave 成为一个 master 的 slave,Redis Slave 服务会清空当前 redis 服务器上的所有数据并

将 master 的数据导入到自己的内存,但是断开同步关系后不会删除当前已经同步过的数据。

vim redis.conf
slaveof 192.168.37.17 6379
masterauth 123456 #master 如果密码需要设置

验证复制

master上
# redis-cli -a 123456 set name mage

slave上:
[root@node27 redis]# redis-cli -a 123456 get name
"mage"

Slave上只读

[root@node27 redis]# redis-cli -a 123456 set k27 v27
(error) READONLY You can't write against a read only slave.

slave切换master

[root@node27 redis]# redis-cli -a 123456 slaveof no one

常见问题

1) 127.0.0.1:6379> REPLICAOF 192.168.37.17 6379

(error) ERR unknown command REPLICAOF, with args beginning with: 192.168.37.17, 6379,

REPLICAOF  host port 命令是 SLAVEOF host port在Redis5.0新增的,所以5.0版本之前使用SLAVEOF

参考:
https://redis.io/commands/replicaof

2) [root@node27 redis]# redis-cli -a 123456 info replication

...

master_link_status:down

master 重启可以

3) 不同的 redis 版本之间存在兼容性问题,因此各 master 和 slave 之间必须保持版本一致

主从模式缺点

上一个步骤的主从架构无法实现 master 和 slave 角色的自动切换,即当 master 出现 redis 服务异

常、主机断电、磁盘损坏等问题导致 master 无法使用,而 redis 高可用无法实现自故障转移(将 slave

提升为 master),需要手动改环境配置才能切换到 slave redis 服务器,另外也无法横向扩展 Redis 服

务的并行写入性能,当单台 Redis 服务器性能无法满足业务写入需求的时候就必须需要一种方式解

决以上的两个核心问题,

1.master 和 slave 角色的无缝切换,让业务无感知从而不影响业务使用

2.可以横向动态扩展 Redis 服务器,从而实现多台服务器并行写入以实现更高并发的目的。

Redis 集群实现方式:客户端分片 代理分片 Redis Cluster

相关推荐
Code apprenticeship9 分钟前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站13 分钟前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶15 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
丁总学Java1 小时前
git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表
git
pubuzhixing2 小时前
开源白板新方案:Plait 同时支持 Angular 和 React 啦!
前端·开源·github
黄名富4 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
yylの博客4 小时前
Windows通过git-bash安装zsh
windows·git·bash·zsh
G_whang5 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
丁总学Java5 小时前
(Z Shell)zsh: no matches found: ? 使用单引号包裹
git·zsh
.生产的驴5 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven