【2023】Redis主从复制模式集群

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【2023】Redis主从复制模式集群
资源有限,本文使用Docker部署

🎶主从模式介绍

主从模式中,由一个主服务器和多个从服务器组成,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统就能切换到从节点去读写数据,提升系统的可用性。

再采用主从复制模式里默认的读写分离机制,就能提升系统的缓存读写性能。

总结:

  • 提高系统可用性
  • 提升读写性能

主从模式简述:

当有应用向一台Redis服务器中写数据时,这个数据可以复制同步到一台或多台Redis服务器,这个数据源服务器被称为主服务器(master),其他服务器被称为从服务器(slave)。

结构图:

  • 一主一从

394e73acfcfe47999c908356931798f5 (1).png

一主多从

68a61c49c5c84bf08935b73e04c4a74a.png

🎶 搭建主从模式集群

🎶 使用命令搭建主从集群

  • 运行一个容器作为master节点,端口为6379
docker run -itd --name redis-master -p 6379:6379 redis:6.0 
  • 再运行一个容器作为slave节点,端口为6380(注意:因为在同一台宿主机,所以端口不能重复)
docker run -itd --name redis-slave -p 6380:6380 redis:6.0 
  • 查看master容器信息,找到该容器的IP地址,可以看出IP地址为172.17.0.2
# docker inspect redis-master | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
  • 进入master容器,连接客户端,查看当前主从模式状态
# docker exec -it redis-master /bin/bash
root@dd22f11d3b8c:/data# redis-cli 
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
  • 只需要信息的前几行能看到集群信息即可,可以看出此容器为主服务器,并且当前没有从服务器
  • 此时通过名称为从节点的容器进入查看集群状态应该是一样的,因为此时两者并没有关联
[root@localhost ~]# docker exec -it redis-slave /bin/bash
root@ff390708266d:/data# redis-cli 
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
  • 在从节点输入以下命令,指定该节点为从节点
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
  • 再次查看集群信息,发现可以看到集群状态,该容器已成为从节点,主节点为172.17.0.2
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
  • 回到redis-master容器上查看状态,确认集群状态
[root@localhost ~]# docker exec -it redis-master /bin/bash
root@dd22f11d3b8c:/data# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.3,port=6379,state=online,offset=364,lag=1
  • 至此集群搭建成功

如果还有其他的从节点,操作步骤同上

🎶 通过配置文件搭建主从模式集群

注意:将上个实验的容器删除,重新部署,所以名称相同

  • 同样创建主redis容器一个
docker run -itd --name redis-master -p 6379:6379 redis:6.0 
  • 创建从服务器的配置文件,并启动从服务器容器指定该配置文件
[root@localhost ~]# mkdir /data/redis/redisConf -p
[root@localhost ~]# vim /data/redis/redisConf/redisslave.conf
[root@localhost ~]# cat /data/redis/redisConf/redisslave.conf 
port 6380
slaveof 172.17.0.2 6379
[root@localhost ~]# docker run -itd --name redis-slave -v /data/redis/redisConf:/redisConfig:rw -p 6380:6380 redis:6.0 redis-server /redisConfig/redisslave.conf
  • 进入到slave容器连接服务器查看redis集群状态
[root@localhost redisConf]# docker exec -it redis-slave /bin/bash
root@0fea9993d4e3:/data# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
slave_read_only:1

至此,通过配置文件的redis主从集群已经配置完成

🎶配置读写分离

从主从服务器上通过info replication查看状态发现一行slave_read_only:1代表是只读的含义

在从服务器输入以下命令发现报错,也证明了是不可写的

127.0.0.1:6380> set test 100
(error) READONLY You can't write against a read only replica.

只需要在上例配置文件中加入slave-read-only no然后删除旧容器创建新容器即可生效,效果为可读可写

🎶 用心跳机制提高主从复制的可靠性

主从模式中,从服务器会默认以一秒一次的频率向主服务器发送REPLCONF ACK命令,依次来确保两者间连接通畅。

这种定时交互命令确保连接的机制就叫“心跳”机制。

可在主服务器通过以下命令查看到查看发送“心跳”间隔时间

[root@localhost redisConf]# docker exec -it redis-master /bin/bash
root@c9ced7408758:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.3,port=6380,state=online,offset=1666,lag=0

lag=0说明是实时的,没有数据延迟或失败情况

在配置文件中加入以下两行可增加可靠性:

min-slaves-to-write 2
min-slaves-max-lag 15
  • 第一行代表从服务器至少由两个
  • 第二行代表如果lag值大于15秒,则不执行主从服务
  • 两者为的关系

🎶 用偏移量检查数据是否一致

在主服务器中通过info replication可查看数据偏移量的master_repl_offset数据

master_repl_offset:1666

然后在从服务器上查看是否一致,如果一致,就说明主从服务器间的数据是同步的。

在主服务器上创建一个键值对,然后再次查看,如果主从服务器的master_repl_offset还是相同说明数据同步成功。

本文内从整理自基于Docker的Redis入门与实践






相关实践学习
基于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
目录
相关文章
|
27天前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
46 0
|
1月前
|
消息中间件 存储 缓存
深入理解Redis集群主从复制原理
该文章主要探讨了Redis集群中的主从复制原理,包括为何需要主从复制、配置方法、复制流程以及一些高级特性。
深入理解Redis集群主从复制原理
|
1月前
|
存储 缓存 NoSQL
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
|
1月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
1月前
|
NoSQL Java 调度
Lettuce的特性和内部实现问题之Redis的管道模式提升性能的问题如何解决
Lettuce的特性和内部实现问题之Redis的管道模式提升性能的问题如何解决
|
1月前
|
NoSQL 网络协议 安全
Lettuce的特性和内部实现问题之Lettuce天然地使用管道模式与Redis交互的问题如何解决
Lettuce的特性和内部实现问题之Lettuce天然地使用管道模式与Redis交互的问题如何解决
|
1月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
36 0
|
1月前
|
NoSQL 关系型数据库 MySQL
简述redis的单线程模式
简述redis的单线程模式
|
1月前
|
NoSQL Linux Redis
使用docker-compose搭建redis-cluster集群
使用docker-compose搭建redis-cluster集群
168 0
|
1月前
|
NoSQL Linux Redis
基于redis6搭建集群
基于redis6搭建集群