Redis主从复制、哨兵、cluster集群原理+实验(好好等,会晚些,但会更好)(一)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Redis主从复制、哨兵、cluster集群原理+实验(好好等,会晚些,但会更好)(一)

前言


在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等).


高可用的计算公式是1-(宕机时间)/(宕机时间+运行时间)有点类似与网络传输的参数误码率,我们用9的个数表示可用性:


2个9:99%=1%365=3.6524h=87.6h


4个9:99.99%=0.01%36524*60=52.56min


5个9:99.999%=0.001%*365=5.265min


11个9:几乎一年宕机时间只有几分钟


但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等.


在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和Cluster集群,下面分别说明它们的作用,以及解决了什么样的问题.


持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而天失.

主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的.主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复.缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制.

哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复.缺陷:写操作无法负载均衡;存储能力受到单机的限制.

cluster集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案.


一、Redis主从复制


主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。


默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。


1.1 主从复制的作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。


1.2 主从复制流程

(1)若启动一个slave机器进程,则它会向Master机器发送一个sync command命令,请求同步连接.


(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中.


(3)后台进程完成缓存操作之后,Master机器就会向slave机器发送数据文件,slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给slave端机器.若slave出现故障导致宕机,则恢复正常后会自动重新连接.


(4)Master机器收到slave端机器的连接后,将其完整的数据文件发送给slave端机器,如果Mater同时收到多个slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的slave端机器,确保所有的slave端机器都正常.


1.3 搭建Redis主从复制


1.3.1 实验环境

主从 虚机 IP地址
master centos7-1 192.168.109.131
slave1 centos7-2 192.168.109.132
slave2 centos7-3 192.168.109.133

1.3.2 所有节点安装

#关闭防火墙
systemctl stop firewalld 
systemctl disabled firewalld 
setenforce 0
#下载编译工具
yum install -y gcc gcc-c++ make 
#上传软件包并解压
tar zxvf redis-5.0.7.tar.gz 
cd /opt/redis-5.0.7/
#指明安装路径开始安装
make && make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了Makefile文件,所以在解压完软件包后,不用先执行./configure 进行配置,可直接执行make与make install命令进行安装.
#执行软件包提供的insta11 server.sh 脚本文件设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh   #一直回车
Please select the redis executable path [] /usr/local/redis/bin/redis-server#需要手动修改为
/usr/local/redis/bin/redis-server #注意要一次性正确输入
#优化路径
ln -s /usr/local/redis/bin/* /usr/local/bin/
#查看端口状态
netstat -natp |grep redis


1.3.3 修改master节点

vim /etc/redis/6379.conf 
bind 0.0.0.0  #70行,修改监听地址为0.0.0.0
daemonize yes   #137行,开启守护进程
logfile /var/log/redis_6379.1og  #172行,指定日志文件目录
dir /var/lib/redis/6379      #264行,指定工作目录
appendonly yes   #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart


1.3.4 修改slave节点

vim /etc/redis/6379.conf 
bind 0.0.0.0  #70行,修改监听地址为0.0.0.0
daemonize yes   #137行,开启守护进程
logfile /var/log/redis_6379.log  #172行,指定日志文件目录
dir /var/lib/redis/6379  #264行,指定工作目录
replicaof 192.168.109.131 6379  #288行,指定要同步的Master节点Ip和端口
appendonly yes   #700行,开启AOF持久化功能
#传给另一台从
scp /etc/redis/6379.conf 192.168.109.133:/etc/redis/
#重启
/etc/init.d/redis_6379 restart






1.3.5 验证

主节点

cd /var/log/
[root@localhost log]# tail redis_6379.log 
56591:M 10 Jun 2022 09:38:24.942 * Background saving terminated with success
56591:M 10 Jun 2022 09:38:24.942 * Synchronization with replica 192.168.109.132:6379 succeeded
56591:M 10 Jun 2022 09:47:14.587 * Replica 192.168.109.133:6379 asks for synchronization
56591:M 10 Jun 2022 09:47:14.588 * Full resync requested by replica 192.168.109.133:6379
56591:M 10 Jun 2022 09:47:14.588 * Starting BGSAVE for SYNC with target: disk
56591:M 10 Jun 2022 09:47:14.588 * Background saving started by pid 56860
56860:C 10 Jun 2022 09:47:14.589 * DB saved on disk
56860:C 10 Jun 2022 09:47:14.589 * RDB: 0 MB of memory used by copy-on-write
56591:M 10 Jun 2022 09:47:14.601 * Background saving terminated with success
56591:M 10 Jun 2022 09:47:14.602 * Synchronization with replica 192.168.109.133:6379 succeeded
[root@localhost log]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.109.132,port=6379,state=online,offset=1134,lag=1
slave1:ip=192.168.109.133,port=6379,state=online,offset=1134,lag=1
master_replid:aeaccb960b6f240d243b13bf642716d2680416a6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1134
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1134
127.0.0.1:6379> set name stevelu
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"stevelu"



从节点

[root@localhost utils]# redis-cli
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"stevelu"


相关实践学习
基于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
目录
相关文章
|
17天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
27 5
|
3月前
|
缓存 NoSQL Linux
redis的原理(三)
redis的原理(三)
redis的原理(三)
|
2月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
44 2
|
2月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
71 1
|
2月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
371 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
3月前
|
存储 缓存 NoSQL
redis的原理(四)
redis的原理(四)
|
3月前
|
存储 缓存 NoSQL
redis的原理(二)
redis的原理(二)
|
3月前
|
缓存 NoSQL 安全
Redis的原理(一)
Redis的原理(一)
|
2月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
192 0
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6
下一篇
DataWorks