Redis 主从同步及实现(一)|学习笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习 Redis 主从同步及实现(一)

开发者学堂课程【Redis 入门实战演练 Redis 主从同步及实现(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/653/detail/10839


Redis 主从同步及实现(一)


 内容介绍:

一、基本介绍

二、解决方案

三、主从同步过程

四、主从同步优化

 

一、基本介绍

在学习 Redis 的常用命令之后,学习Redis高可用和集群。它的功能有以下方面可以实现:

一个是类似于 Mysql 主从一样,是 Redis 主和 Redis 从,是最简单的主从方式,是不具备自动切换功能的。这个自动切换功能是指的当主的 Redis 因为网络不好等导致断线网络不通,备用的 Redis 不能直接将内容接到主的 Redis,不能够自动切换的。

有这种结构的存在主要是实现了跨主从的处理备份功能。

还有一个是它的哨兵,这个比原来的主从结构多了一个功能,当主的传来之后,它的哨兵会在剩下的备用结点选出一个结点作为 master。而前面的结构是会断掉业务的,这个断掉业务的时间由花费将 Redis 备结点转换为 master 的时间来决定。需要人工来切换。切换的方式是由程序来连接之前学到过的 HAProxy,这个 HAProxy是可以高可利用的,它的后端服务器是默认指向的是Redis主。当主的过来之后,才会选择让 Redis 备份结点来接受协议请求,备份结点读是没有问题的。此时就算主的过来后,Redis 备依旧可以去读,但是写是不行的,原因是主存过来之后虽然HAProxy 是可以检测出主挂掉,并且 Redia 备的结点可以通过检测后可以挂到HAProxy 的后端服务器列表上。之前中讲过为了避免有些程序写错而导致数据写到Redis备库上去,会在Redis备上面设置一个备份的只读。默认情况下,备库是无法写数据的。如果需要写数据就需要在配置上设置一个可写的功能,具体在后面讲述。

如果想基于 HAProxy 的基础上实现 Redis 主和 Redis 从的自动切换,需要在 HAProxy 的后端服务器列表上设置至少两个 real server。一个设置为主 server,另一个为备 server。在主的后面加入简单信息、端口等,在备的 server 加上参数 backup。就是在默认情况下,备份的 server 是不在 HAProxy 的后端服务器列表上。当主的挂上之后会 HAProxy 才会把备的 server 挂在后端服务器上,挂完后就可以在备库上读写,或者是手动切换就可以正常使用。手动切换需要在添加一个叫slave of no one 的参数来可写。

早期的时候,还讲过一种直接在 Redis 服务器上装作为 VIP 的结构,这种 VIP 想办法默认让它在运行在 Redis 的主库上,也就是 musol 的R edis 的服务器,当挂完之后,就会让它这个 VIP 飘到备库上去。这样的话备库就不会设置为只读了。就是主存过来之后这个应用程序去连接到 VIP 上去就行。除此之外还有许多的方法,具体是要看所考量的内容。这些早期的内容都是在2.7或2.8多的时候,才会使用。

 到后期版本的时候,有了哨兵,到2.8时就正式稳定下来。目前更是4.0和5.0之后的版本,当然三点几的也是可以用的。还有就是这个哨兵可以实现主从的自动切换,主的过来之后,它会自动将备用的 Redis 提升为主的。提升之后,应用程序就可以在备的上面去完成读写了。当然前面的也必须挂上负载均衡,因为主的过来之后,地址也会发生变化,就是将备的结点提升为 master。所以具体使用哪一种结构是要根据所考核的方式及内容来决定的。

当是哨兵的时候,主的角色由备份结点自动接管,但是接管之后的地址信息发生变化。之后会告诉应用程序如何获取到备份结点的地址信息,这种解决方案是对于 Java 程序来讲会知道主从是否发生变化,这些内容会在哨兵的时候具体讲。

在后续的使用过程中,哨兵也不能满足需求。哨兵虽然解决了主从切换的问题,但是没有办法解决单机的性能。现代的三个或多个服务器都是单机的性能。单机的性能就是默认情况下还是往一个服务器中添加数据。这个写数据就是一个凭据,网卡就是所能传输的数据,所能传输的速率最快也就是每秒一百多兆,内存大小就是单个服务器的上限。根据服务器是16G 还是32G,来决定最大空间。这也促使后面 Redis 集群 cluster 产生,redis cluster 在3.0版本之后才稳定下来。在早期的版本是没有办法做 redis 集群的,会衍生出许多的 redis 集群方案,这些方案会在后续讲解。

到目前为止,就推荐使用 cluster 方案

image.png 

 

二、解决方案

(1)配置 redis 主从

主备模式,可以实现 Redis 数据的跨主机备份。

程序端连接到高可用负载的 VIP,然后连接到负载服务器设置的 Redis 后端 real server,此模式不需要在程序里面配置 Redis 服务器的真实 IP 地址,当后期 Redis 服务器 IP 地址发生变更只需要更改 redis 相应的后端 real server 即可,可避免更改程序中的 IP 地址设置。

image.png

(2)Slave 主要配置:

Redis Slave 也要开启持久化并设置和 master 同样的连接密码,因为后期 slave 会有提升为 master 的可能,Slave 端切换 master 同步后会丢失之前的所有数据。

一旦某个 Slave 成为一个master 的 slave,Redis Slave 服务会清空当前redis服务器上的所有数据并将master的数据导入到自己的内存,但是断开同步关系后不会删除当前已经同步过的数据。

对于 Slave 端切换 master 同步后会丢失之前的所有数据这句话,这种情况出现在一主多从的形式。假设在没有 VIP 的情况下,一主两备,放在哨兵中,这两个结点中有新的 master。在 Redis 主挂掉之后,会把 Redis 备1结点选为 master,此时 Redis 备2的 master不再是之前的 Redis 主,在之前主的存活是备2的 master 就是原来的 Redis 主,由于备1变为了 master,Redis备2会在Redis备1上同步数据。由于备2的 master 由主换位备1,那么Redis备2的所有数据会全部清空,清完会从备1中重新拉取一份。在这先有一个大概的了解,后面在讲解哨兵时会细说。这个就是当 Slave 结点的 master 改变时,它的数据内容会全部清空,再向当前的 master 同步一份最全最新的 master,以前的数据不再需要,以当前的 master 为准。

对于断开同步关系后不会删除当前已经同步过的数据的理解,这个在哨兵中学习这个概念较好。在备2和主的以及备1断开,因为此时的备1是 master,备2断开后不会删除自己的数据,但如果是更换 master,那它的数据会被全部清空掉。

(3)命令行配置:

实现最简单的主从同步的机制

当前状态为 master,需要转换为 slave 角色并指向 mater 服务器的IP+PORT+Password

首先在172.31.7.101的服务器上重新配置,编辑 apps 的 redis 下的 etc 进入。

之后把里面的密码进行打开,其他与之前配置的一致。只打开密码,这个密码是 Linux39,打卡之后重启 Redis。

输入重启语句:systemctl restart redis

需要完成主从是需要两个服务器的,一个服务器无法完成主从,这里提前准备好了是个虚拟机。在这里讲 server2设置为 server1的备份服务器,这个服务器是第一种原始的手动来配置的。这个配置的目的主要是为了实现主机的跨主机备份,也就是本机虽然可以实现 rdb、aof,但无法保证主机不会坏,也有可能会发生主机的内存故障,那么本地的一些文件就会丢失。通过 Redis 内置的功能这种手动配置的 Redis 的小的主从环境,把主机文件跨主机传到备份上去,此时就算是主的服务器上出现硬件的问题,只用将备的挂到线上即可。

实现的具体操作如下:

先连到172.31.7.102的服务器,之后是如何安装 Redis,注意 Redis 服务器上不需要装太大的内存,基本上1G 是足够的。为了快速安装 Redis 就需要在 cd 根下的 apps,接着输入语句systemctl stop redis。关闭后把之前安装好的Redis的目录打包。此时 redis 下有配置好的文件、日志目录、运行目录等等,这些都是提前配置好的信息,只用打个包拷过去,类似于之前的打包一样。

输入语句tar czvf redis.tar.gz ./*

image.png 

打完包之后要拷过去,把压缩包 redis.tar.gz 拷入到172.31.7.102服务器下的 apps 目录,这里缺少这个目录,还需要在服务器上添加这个目录,添加目录的语句  mkdir /apps。目录拷入之后就可以在102这个服务器上开启了。这个server的文件、Redis账号、密码需要提前准备,如果有 alltap 或是 server 就是比较好办,就可以批量往服务器里环境初始化,在把 Redis 包拷贝就结束了。

再将 server 文件拷过去,输入语句scp /usr/lib/system/system/redis.service172.31.7.102。另外需要注意的是在实现主从同步的过程中两个服务器的版本必须保持一致。之后再102中创建一个账号,语句为useradd redis -s /sbin/nologin;修改账号的权限,语句为chown redis.redis / apps/redi^C;由于还未解压需要在这个目录下把压缩包解压,进入apps目录下,语句cd /apps/、语句ll、以及语句tar xvf redis.tar.gz得到的结果中时间是不准确的,在172.31.7.101的服务器上输入语句date得到的时间是不准确的。再输入语句ntpdate www.time1.aliyun.com,把时间同步之后。在172.31.7.102的服务器上修改权限,语句为chown redis.redis /apps/ -R。这些内容改完之后就可以手动配置一下主从同步,在172.31.7.102的服务器上输入语句systemctl restart redis,

192.168.7.104:6379> REPLICAOF 192.168.7.103 6379

OK

192.168.7.104:6379> CONFIG SET masterauth 123456

OK

重启之后在172.31.7.101上重新写语句为:ntpdate time1.aliyun.com,此时这个服务器地址就是 www.time1.aliyun.com  ,这时时间是更新好的,如何使的102成为101的 slave?是需要进入到 redis 交互的窗口(输入语句redis/^C),先做一个连接,把二进制命令都用到 usr/bin(输入语句ln -sv /apps/redis/bin/redis-* /usr/bin/),如下图。

之后执行语句 redis -cli,进入 AUTH,密码是 linux39,回车后输入 INFO。可以看到在没有做主从同步之前,默认的状态都是 master。如下图。

要想使7.102成为7.101的 slave?如下图示意。有两种配置方式,一种是直接在命令行配置

image.png

直接在命令行配置:输入SLAVEOF host port

配置完成后查看,结果如下,显示此时依旧出现报错:显示输入的密码出现错误

image.png

在 172.31.7.101-server1 中的窗口查询配置密码,编辑 redis 到 etc 的 conf 文件,代码内容为:#vim redis/etc/redis.conf;查询之后得到结果密码就是linux39

再次查询日志,这个日志,会显示错误是认证失败。

输入语句:#ping 172.31.7.101

到这里重新同步信息,需要先删掉已经同步的信息,就类似于 MySQ L中的 reset,先清空软件信息。在配置文件中有大量的命令行在配置文件中有一个 REPLICATION,在这段配置文件中指定 master 的地址、配置文件、端口、还有密码,密码是通过 masterauth 来进行认证

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
消息中间件 NoSQL Linux
详解Redis的主从同步原理
只不过在主节点中叫做master_repl_offset; 从节点也有一个偏移量叫做slave_repl_offset,用来记录从节点已经从主节点的repl_backlog_buffer中同步到的最新写指令的位置;
1163 2
|
6月前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
110 0
|
消息中间件 监控 NoSQL
场景应用:如何解决Redis主从同步中出现的问题?
场景应用:如何解决Redis主从同步中出现的问题?
256 0
|
NoSQL Redis
Redis从入门到精通【面试篇】Redis 为什么主从全量复制使用RDB而不使用AOF
RDB 文件只是 Redis 备份的一种方式,它的频率和方式可以根据具体的业务需求进行配置。而 AOF 文件则是 Redis 提供的另一种持久化方式,它记录了每次写入操作,可以保证数据的实时性和可靠性,但相对来说会占用更多的磁盘空间和写入性能。因此,在实际应用中需要根据业务需求进行选择。
267 7
|
NoSQL 网络协议 Redis
Redis 主从同步原理
主从同步,就是将数据冗余备份,主库(Master)将自己库中的数据,同步给从库(Slave)。主从同步的必要性,在于数据的高可用。它可以保证机器故障时,还有其他的服务器可以进行故障转移。
104 0
|
NoSQL Redis
2021-05-13 Redis面试题 Redis集群会有写操作丢失吗?为什么?
2021-05-13 Redis面试题 Redis集群会有写操作丢失吗?为什么?
61 0
|
存储 缓存 NoSQL
Redis学习+集群搭建+持久化+主从复制(详细学习)(上)
Redis学习+集群搭建+持久化+主从复制(详细学习)(上)
205 0
|
负载均衡 NoSQL 网络协议
Redis学习+集群搭建+持久化+主从复制(详细学习)(中)
Redis学习+集群搭建+持久化+主从复制(详细学习)(中)
160 0
|
缓存 运维 监控
Redis学习+集群搭建+持久化+主从复制(详细学习)(下)
Redis学习+集群搭建+持久化+主从复制(详细学习)(下)
139 0
|
NoSQL 容灾 Redis
Redis(二十七)- Redis的主从复制说明
单机的Redis服务器既需要读有需要写,Redis服务器的压力会比较大。所以,在实际的开发中一般会采取读写分离的形式。主从复制就是读写分离的一种形式。主服务器(master)以写为主,从服务器(slave)以读为主,主机数据更新后根据配置和策略,自动同步到备份机的master/slaver 机制。
159 0
Redis(二十七)- Redis的主从复制说明
下一篇
无影云桌面