Redis(二十七)- Redis的主从复制说明

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 单机的Redis服务器既需要读有需要写,Redis服务器的压力会比较大。所以,在实际的开发中一般会采取读写分离的形式。主从复制就是读写分离的一种形式。主服务器(master)以写为主,从服务器(slave)以读为主,主机数据更新后根据配置和策略,自动同步到备份机的master/slaver 机制。

1. 简介

单机的Redis服务器既需要读有需要写,Redis服务器的压力会比较大。所以,在实际的开发中一般会采取读写分离的形式。主从复制就是读写分离的一种形式。主服务器(master)以写为主,从服务器(slave)以读为主,主机数据更新后根据配置和策略,自动同步到备份机的master/slaver 机制。

主从复制有两大优势:

1.读写分离,性能可以大大提升

2.容灾快速恢复

2. 主从复制的结构

在主从复制的结构中都是一主多从,一般是一主两从。


之所以只能有个一个主服务器,是因为如果有多个主服务器的话,从服务器复制数据的时候不知道复制那个主服务器的数据。

之所以要有多个从服务器,是因为如果一个从服务器宕机之后,这个主从复制模式就失去了意义。

3. 主从复制如何配置?

这里我是本地模拟,在同一个服务器下,复制三个 redis.conf 文件模拟三台redis服务器。

具体的操作步骤是:

3.1. 创建/myredis文件夹

在根目录下创建myredis 文件夹用于存放redis.conf 配置文件,方便后期管理

3.2. 复制redis.conf 配置文件

复制redis.conf配置文件到3.1步创建的文件夹 myredis中。

cp /etc/redis.conf /myredis

复制完成之后,为了方便起见将 appendonly yes 改成no。

3.3. 配置一主两从,创建三个配置文件

服务器 角色
6379 master
6380 slaver
6381 slaver

创建redis6379.conf,向该配置文件中写入如下内容:

include /myredis/redis.conf
pidfile /var/redis_6379.pid
port 6379
dbfilename dump6379.rdb

这里通过include /myredis/redis.conf 配置引入 /myredis/redis.conf 配置文件里的配置,

这里另外设置了三个配置:

通过 pidfile /var/redis_6379.pid 指定pid文件;

通过port 6379 指定该服务的端口号是6379;

通过dbfilename dump6379.rdb 指定了rdb文件为 dump6379.rdb。

redis6380.conf和redis6380.conf 两个配置文件的配置也类似。

2. 创建redis6380.conf,向该配置文件中写入如下内容:

include /myredis/redis.conf
pidfile /var/redis_6380.pid
port 6380
dbfilename dump6380.rdb

创建redis6381.conf,向该配置文件中写入如下内容:

include /myredis/redis.conf
pidfile /var/redis_6381.pid
port 6381
dbfilename dump6381.rdb

3.4 启动三个redis服务分别启动 6379,6380,6381这三个redis服务。启动结果如下图所示:

3.5. 查看三个redis服务的运行情况

通过 redis-cli -p 6379 命令连接 6379服务

执行 info replication 查看当前主机的运行情况

可以看到该服务器的角色是 master,并且没有与之关联的 slave。

通过 redis-cli -p 6380 命令连接 6380服务

执行 info replication 查看当前主机的运行情况

通过 redis-cli -p 6381 命令连接 6381服务

执行 info replication 查看当前主机的运行情况

从上图可以看出这时候三个redis服务的角色都是master,三个redis服务是独立的,没有主从关系。

3.6. 配置主从关系

配置主从关系,只需要在从库执行如下命令即可,其中ip是master的ip,port是master的端口号。

slaveof  <ip> <port>

执行完成之后,我们可以看到 6379服务上的角色还是 master,但是 connected_slaves 变成了2。

而6380服务和6381服务的角色变成了slave,指定的master均是6379。

这就说明我们的一主两从 配置好了在从服务器 6380上执行 写命令set k1 v1 会报错。

4. 主从复制的复制原理

Slave 启动成功连接到master后会发送一个sync命令

Master 接到命令会启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master 将传送整个数据文件(rdb文件)到slave上,salve拿到rdb文件之后进行读取,最终完成一次完全同步。

全量复制: 而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。

但是只要重新链接master,一次完全同步(全量复制)将被自动执行。

5. 一主两从的特点

5.1 从服务器挂了

从服务器挂了,再重启该从服务器,该从服务器会变成独立的主服务器。就脱离了原有的一主两从的体系。需要通过slaveof <ip> <port> 命令其设置为从服务器,设置完成之后它会从头开始复制主服务器的数据。

5.2 主服务器挂了主服务器挂掉了之后,从服务器知道主服务器的状态,但是从服务器不会上位,主服务器重启之后还是主服务器。


6. 薪火相传

薪火相传是指在一主多从的情况下,当从服务器太多情况下,,一个主服务器管理不了那么多从服务器,可以通过从服务器来管理从服务器。类似于:你的老板管理小组长,小组长管理你。


这里做一个演示,在6380上执行 slaveof 127.0.0.1 6381。执行完成之后,查看三个redis服务的运行情况可以看出。

从上图可以看出,当6381这时候是作为6379的slave,但是他又有自己slave,他的slave是6380。而6380的master变成了6381。 6379的slave变成了6381。

7. 反客为主

当一个master宕机后,后面的slave 可以立刻升为master,其后面的slave不用做任何修改。

这里首先在6379上执行 shutdown命令,使之宕机。接着在6381上执行 slaveof no one 命令,可以看到6381的角色立即变成了master。

8934c81cf7e77ee8d793420dfe9467a5_bd6271ce3f334c0cb5552e70665ad007.png

总结

本文详细介绍了Redis主从复制模式的搭建,其实本质上就是在从服务器上指定其master服务器,通过slaveof <ip> <port>命令执行。接着介绍了主从复制的复制原理,其原理就是主服务器将其rdb文件传给从服务器。但是主从复制有个问题就是主服务宕机之后,其余从服务器不能主动晋升为主服务器。后面会介绍哨兵模式,这种模式会解决这个问题。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 负载均衡 NoSQL
Redis之主从复制
【1月更文挑战第8天】主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(masterleader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。 默认情况下,每台Redis服务器都是主节点; 且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
188 4
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis高可用之主从复制架构(第一部分)
Redis高可用之主从复制架构(第一部分)
|
1月前
|
监控 NoSQL 容灾
【Redis】主从复制
【Redis】主从复制
|
27天前
|
存储 监控 负载均衡
redis 集群 (主从复制 哨兵模式 cluster)
redis 集群 (主从复制 哨兵模式 cluster)
|
22天前
|
存储 NoSQL 网络协议
主从复制,Could not connect to Redis at 127.0.0.1:6380: Connection refusednot connected> exit,1.主从模式如何指
主从复制,Could not connect to Redis at 127.0.0.1:6380: Connection refusednot connected> exit,1.主从模式如何指
|
1月前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
1月前
|
监控 NoSQL Redis
Redis - 主从复制那些事与高可用sentinel
Redis - 主从复制那些事与高可用sentinel
43 0
|
1月前
|
监控 NoSQL Redis
redis主从复制
redis主从复制
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群
|
1月前
|
负载均衡 NoSQL 容灾