当前位置:网站首页>Redis高可用——主从复制、哨兵模式、集群
Redis高可用——主从复制、哨兵模式、集群
2022-07-05 23:23:00 【橘子超好吃】
一、Redis高可用
1、什么是高可用
在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。
2、Redis的高可用技术
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和cluster集群,下面分别说明它们的作用,以及解决了什么样的问题。
持久化: 持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份(和同步),以及对于读操作的负载均衡和简单的故障恢复。
- 缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
哨兵: 在主从复制的基础上,哨兵实现了自动化的故障恢复。(主挂了,找一个从成为新的主,哨兵节点进行监控)
- 缺陷:写操作无法负载均衡;存储能力受到单机的限制。
Cluster集群: 通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。(6台起步,成双成对,3主3从)
持久化技术已在前一篇文章中进行介绍( Redis 高可用之持久化 - 掘金 (juejin.cn) ),本文将具体主从复制、哨兵、Cluster集群三种高可用技术。
二、Redis主从复制
- 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
- 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
1、Redis主从复制的作用
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
- 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
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端机器都正常。
三、主从复制的搭建
实验准备
master:20.0.0.12
slave1:20.0.0.6
slave2:20.0.0.5
1、所有主机安装Redis
参考上一篇博客 Redis安装部署
2、修改master节点的配置文件(20.0.0.12)
vim /etc/redis/6379.conf
bind 0.0.0.0
appendonly yes
/etc/init.d/redis_6379 restart
![](https://img-blog.csdnimg.cn/2afe3a1ad5dc44ec858f3dcae6025529.png)
3、修改两个slave节点Redis配置文件
vim /etc/redis/6379.conf
bind 0.0.0.0
replicaof 20.0.0.12 6379
appendonly yes
/etc/init.d/redis_6379 restart
4、验证主从效果
##在master节点上看日志
tail -f /var/log/redis_6379.log
##在master创建数据
redis-cli
set name run
get name
##在从节点上查看
redis-cli
get name
四、Redis哨兵模式
哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移。
1、哨兵模式的原理
是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master,并将所有slave连接到新的master。所以整个运行哨兵的集群的数量不得少于3个节点。
2、哨兵模式的作用
- 监控: 哨兵会不断地检查主节点和从节点是否运作正常。
- 自动故障转移: 当主节点不能正常工作时,哨兵会开始自动故障转移操,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。
- 通知(提醒): 哨兵可以将故障转移的结果发送给客户端。
3、哨兵模式的结构
哨兵节点: 哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
数据节点: 主节点和从节点都是数据节点。
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式。所有节点上都需要部署哨兵模式,哨兵模式会监控所有的 Redis 工作节点是否正常,当 Master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个 Master 的确出现问题,然后会通知哨兵间,然后从 Slaves 中选取一个作为新的 Master。
需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。
五、搭建Redis哨兵模式
接着上面的主从复制的实验做
1、修改三个哨兵节点的配置文件
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no
port 26379
daemonize yes logfile "/var/log/sentinel.log"
dir "/var/lib/redis/6379"
sentinel monitor mymaster 20.0.0.12 6379 2
2、启动哨兵模式
##启动三台哨兵
##先启master,再启slave
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
3、故障模拟
##查看redis-server进程号
ps -ef | grep redis
##杀死master节点上redis-server的进程号
kill -9 进程号
redis-cli -p 26379 info Sentinel
六、Redis群集模式
集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。
集群由多个节点(Node)组成,Redis的数据分布在这些节点中。
集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
1、集群的作用
(1)数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
(2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务
通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
2、Redis集群的数据分片
Redis集群引入了哈希槽的概念。
Redis集群有16384个哈希槽(编号0-16383)。
集群的每个节点负责一部分哈希槽。
每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
以3个节点组成的集群为例:
节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽
3、集群模式的主从复制模型
- 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
- 为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为主节点继续服务。当B和B1都失败后,集群将不可用。
七、搭建Redis群集模式
实验准备
master1:20.0.0.12
slave1:20.0.0.5
master2:20.0.0.7
slave2:20.0.0.6
master3:20.0.0.10
slave3:20.0.0.11
6台全部安装redis
1、开启集群功能
cd /opt/redis-5.0.7/
vim redis.conf
......
bind 20.0.0.12 #69行,修改为监听自己的物理网卡IP
protected-mode no #88行,修改为no,关闭保护模式
port 6379 #92行,redis默认监听端口
daemonize yes #136行,开启守护进程,以独立进程启动
appendonly yes #699行,修改为yes,开启AOF持久化
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6379.conf #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000 #846行,取消注释,群集超时时间设置
##将文件传给另外5个节点,之后每个节点要修改监听地址为自己的IP
scp redis.conf 20.0.0.5:`pwd`
scp redis.conf 20.0.0.6:`pwd`
scp redis.conf 20.0.0.7:`pwd`
scp redis.conf 20.0.0.10:`pwd`
scp redis.conf 20.0.0.11:`pwd`
依此类推,总共传给5台服务器;
之后每个节点要修改监听地址为自己的IP地址
cd /opt/redis-5.0.7/
vim redis.conf
2、所有节点启动redis服务
redis-server redis.conf
3、启动集群
##在任意一个节点启动集群即可
redis-cli --cluster create 20.0.0.12:6379 20.0.0.7:6379 20.0.0.10:6379 20.0.0.5:6379 20.0.0.6:6379 20.0.0.11:6379 --cluster-replicas 1
##前三台为master,后三台为slave
4、测试集群
#加-c参数,节点之间就可以互相跳转
redis-cli -h 20.0.0.12 -p 6379 -c
#查看节点的哈希槽编号范围
cluster slots
#赋值
set name run
#查看键的哈希槽编号
cluster keyslot 键名
redis-cli -h 20.0.0.12 -p 6379 -c
20.0.0.12:6379> cluster slots #查看节点的哈希槽编号范围
1) 1) (integer) 10923 #第一对主从的哈希槽编号范围
2) (integer) 16383
3) 1) "20.0.0.10" #主节点
2) (integer) 6379
3) "5f128a6e204d1d6f6dc924ad8b39034a8e9f3261"
4) 1) "20.0.0.11" #从节点
2) (integer) 6379
3) "4a05a086eec06fa4da58b15512d1c81184bc5ee5"
2) 1) (integer) 5461 #第二对主从的哈希槽编号范围
2) (integer) 10922
3) 1) "20.0.0.7" #主节点
2) (integer) 6379
3) "3008bba29dfbf342bc448ba3062b0a331c8d009e"
4) 1) "20.0.0.6" #从节点
2) (integer) 6379
3) "ee61a4709d6420bb540b2c28218fdd2dfe358b7a"
3) 1) (integer) 0 #第三对主从的哈希槽编号范围
2) (integer) 5460
3) 1) "20.0.0.12" #主节点
2) (integer) 6379
3) "d1ddb554b3edaebefa6672b2f1f8171393e1f7f3"
4) 1) "20.0.0.5" #从节点
2) (integer) 6379
3) "71e1f705ce01ca31ab16fa3cf07d7e6cbfab5978"
20.0.0.12:6379>
#在12节点新建name键,会自动跳转到7节点进行存放
20.0.0.12:6379> set name run
-> Redirected to slot [5798] located at 20.0.0.7:6379
OK
20.0.0.7:6379> cluster keyslot name #查看name键的哈希槽编号
(integer) 5798
20.0.0.7:6379> quit #退出数据库
[[email protected] ~]# redis-cli -h 20.0.0.12 -p 6379 -c #重新登录10节点
20.0.0.12:6379> keys * #12节点中没有name键
(empty list or set)
20.0.0.12:6379> get name #查看name键的值,会根据键的哈希槽编号自动跳转到7节点进行获取
-> Redirected to slot [5798] located at 20.0.0.7:6379
"run"
20.0.0.7:6379> #已跳转到7节点
边栏推荐
- TVS管 与 稳压二极管参数对比
- 判斷二叉樹是否為完全二叉樹
- White hat talks about web security after reading 2
- Detailed explanation of pointer and array written test of C language
- poj 2762 Going from u to v or from v to u? (infer whether it is a weak link diagram)
- There are 14 God note taking methods. Just choose one move to improve your learning and work efficiency by 100 times!
- 98. Verify the binary search tree ●●
- LeetCode——Add Binary
- VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
- UVA – 11637 garbage remembering exam (combination + possibility)
猜你喜欢
Object detection based on impulse neural network
21.PWM应用编程
Non rigid / flexible point cloud ICP registration
2:第一章:认识JVM规范1:JVM简介;
[classical control theory] summary of automatic control experiment
98. 验证二叉搜索树 ●●
There are 14 God note taking methods. Just choose one move to improve your learning and work efficiency by 100 times!
Spire.PDF for NET 8.7.2
Go语言实现原理——Map实现原理
The PNG image is normal when LabVIEW is opened, and the full black image is obtained when Photoshop is opened
随机推荐
TVS管和ESD管的技術指標和選型指南-嘉立創推薦
Opencvsharp (C openCV) shape detection and recognition (with source code)
From the perspective of quantitative genetics, why do you get the bride price when you get married
(4)UART應用設計及仿真驗證2 —— TX模塊設計(無狀態機)
Neural structured learning - Part 3: training with synthesized graphs
(4) UART application design and simulation verification 2 - RX module design (stateless machine)
MySQL delete uniqueness constraint unique
带外和带内的区别
Neural structured learning 4 antagonistic learning for image classification
98. 验证二叉搜索树 ●●
Go language implementation principle -- map implementation principle
Qcombox (rewrite) + qcompleter (auto completion, auto loading the drop-down options of qcombox, setting the background color)
Creative mode 1 - single case mode
20.移植Freetype字体库
保研笔记一 软件工程与计算卷二(1-7章)
秒杀系统的设计与实现思路
There are 14 God note taking methods. Just choose one move to improve your learning and work efficiency by 100 times!
yate. conf
February 13, 2022-4-symmetric binary tree
[Yu Yue education] NC machining technology reference materials of Shaanxi University of science and technology