Redis哨兵集群工作原理及架构部署(八)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis哨兵集群工作原理及架构部署文章目录Redis哨兵集群工作原理及架构部署1.redis哨兵模式原理2.搭建redis哨兵集群2.1.环境准备2.2.在所有机器上部署redis2.3.三台redis部署完成2.4.配置redis主从2.5.部署哨兵进程sentinel2.6.启动哨兵观察配置文件的变化2.7.模拟主库故障验证应用是否可用2.8.主库挂掉其他节点配置文件的变化

1.redis哨兵模式原理

redis主从复制的不足: 当主库宕机后,slave无法自己变成主库,进行数据的写入,每次都需要人为配置将从库变为主库才能进行数据写入,当主库修复后还需要人为配置导入从库主机在配置主从复制

redis哨兵模式的优势: redis哨兵建立在主从之上,有一个监控功能,监控主库是否异常,当主库异常之后会自动将某一个slave变为主库,省掉了人为配置


redis哨兵模式原理: 哨兵模式建立在主从复制基础之上,会在每一个redis节点上打开一个sentinel监控,每个sentinel进程都有自己的端口号和IP,所有sentinel共享集群信息,集群中所有的sentinel都是可以通信的,当主库宕机后,主库上的sentinel就会向集群中的其他节点的sentinel发送信息说主库宕机了,需要在从库上选举master,这时每个节点上的sentinel会比较自己redis配置的ID号,比如slave1的ID号大,slave1就会选举为master作为主库,当故障的主库重新加入集群后,主库上的sentinel会向其他节点的sentinel询问谁是主库,这时slave1上的sentinel就会告诉主库上的sentinel说slave1是主库,重新加入集群的主库就会找slave1同步数据,如果重新加入的主库想再次成为主库,只需要执行提权命令就可以重新成为主库。

主从复制的时候程序配置redis地址的时候都是写死主库的地址,每次主库宕机都需要手动修改应用

有了哨兵模式后,在程序代码中配置不是redis地址,而是配置的所有哨兵的地址,形成一个地址池,即使集群中一个哨兵坏掉了,还有其他两个哨兵,每次需要找redis写入数据时,程序首先会找哨兵进程,哨兵之间信息共享,会立马告诉程序谁是主库,这时程序拿到哨兵告诉它的redis主库地址,就会去找主库存数据,因此即使主库坏了,也不需要修改程序代码

哨兵的配置文件在启动哨兵服务后,尽量不要去修改,因为哨兵会自动增加配置

哨兵集群个数建议是奇数,比如3/5/7

配置了哨兵后,当主库挂掉,哨兵选举了新库,会自动把配置文件修改为最新主库的地址

哨兵的选举规则: 首选判断slave-priority权重优先级,谁的高谁当选为master主库,如果都一致,那么久比较各个节点的id,谁的大谁当选

哨兵模式架构和主从复制架构对比

2.搭建redis哨兵集群

2.1.环境准备image.png

配置哨兵集群步骤:

1.在所有节点搭建redis

2.配置主从复制,一主两从

3.在所有节点配置sentinel,启动sentinel后,配置文件会自动增加

2.2.在所有机器上部署redis

192.168.81.210配置

1.创建redis部署路径
[root@redis-1 ~]# mkdir -p /data/redis_cluster/redis_6379/{conf,pid,logs,data}
2.下载redis    
[root@redis-1 ~]# mkdir /data/soft
[root@redis-1 ~]# cd /data/soft
[root@redis-1 /data/soft]# wget https://repo.huaweicloud.com/redis/redis-3.2.9.tar.gz
3.便于安装redis
[root@redis-1 /data/soft]# tar xf redis-3.2.9.tar.gz -C /data/redis_cluster/
[root@redis-1 /data/soft]# cd /data/redis_cluster/
[root@redis-1 /data/redis_cluster]# ln -s redis-3.2.9/ redis
[root@redis-1 /data/redis_cluster]# cd redis/src
[root@redis-1 /data/redis_cluster/redis]# make && make install
4.准备配置文件
[root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf 
daemonize yes
bind 192.168.81.210 127.0.0.1
port 6379
pidfile /data/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /data/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis_6379.rdb
dir /data/redis_cluster/redis_6379/data/
save 900 1
save 300 100
save 60 10000
5.启动redis
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf 

192.168.81.220配置

由于redis-1已经部署好了一套redis,我们可以直接复制过来使用

1.使用rsync将redis-1的redis目录拷贝过来你
[root@redis-1 ~]# rsync -avz /data root@192.168.81.220:/
2.查看拷贝过来的目录文件
[root@redis-2 ~]# ls  /data/redis_cluster/
redis  redis-3.2.9  redis_6379
[root@redis-2 ~]# ls  /data/redis_cluster/redis_6379/
conf  data  logs  pid
3.编译安装redis,使系统能使用redis命令
直接执行make install即可,因为编译步骤在redis-1已经做了
[root@redis-2 ~]# cd /data/redis_cluster/redis-3.2.9/
[root@redis-2 /data/redis_cluster/redis-3.2.9]# make install
4.修改redis配置文件
[root@redis-2 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf 
bind 192.168.81.220 127.0.0.1
5.启动redis
[root@redis-2 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf

192.168.81.230配置

由于redis-1已经部署好了一套redis,我们可以直接复制过来使用

1.使用rsync将redis-1的redis目录拷贝过来你
[root@redis-1 ~]# rsync -avz /data root@192.168.81.230:/
2.查看拷贝过来的目录文件
[root@redis-3 ~]# ls  /data/redis_cluster/
redis  redis-3.2.9  redis_6379
[root@redis-3 ~]# ls  /data/redis_cluster/redis_6379/
conf  data  logs  pid
3.编译安装redis,使系统能使用redis命令
直接执行make install即可,因为编译步骤在redis-1已经做了
[root@redis-3 ~]# cd /data/redis_cluster/redis-3.2.9/
[root@redis-3 /data/redis_cluster/redis-3.2.9]# make install
4.修改redis配置文件
[root@redis-3 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf 
bind 192.168.81.230 127.0.0.1
5.启动redis
[root@redis-3 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf

2.3.三台redis部署完成

[root@redis-1 ~]# ps aux | grep redis
root      21860  0.1  0.5 139020  9740 ?        Ssl  09:36   0:16 redis-server 192.168.81.210:6379
root      25296  0.0  0.0 112724   984 pts/0    S+   13:15   0:00 grep --color=auto redis
[root@redis-1 ~]# ssh 192.168.81.220 "ps aux | grep redis"
root      47658  0.1  0.5 141068 10780 ?        Ssl  1月28   1:24 redis-server 192.168.81.220:6379
root      63254  0.0  0.0 113176  1588 ?        Ss   13:15   0:00 bash -c ps aux | grep redis
root      63271  0.0  0.0 112724   968 ?        S    13:15   0:00 grep redis
[root@redis-1 ~]# ssh 192.168.81.230 "ps aux | grep redis"
root      56584  0.1  0.7 136972  7548 ?        Ssl  13:13   0:00 redis-server 192.168.81.230:6379
root      56644  0.0  0.1 113176  1588 ?        Ss   13:15   0:00 bash -c ps aux | grep redis
root      56661  0.0  0.0 112724   968 ?        S    13:15   0:00 grep redis

2.4.配置redis主从

要在两台slave上同步主库配置

1.配置主从复制
[root@redis-2 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 192.168.81.210 6379
OK  
[root@redis-3 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 192.168.81.220 6379
OK
2.主库新建一个key
127.0.0.1:6379> set name jiangxl
OK
3.从库查看是否复制
[root@redis-2 ~]# redis-cli 
127.0.0.1:6379> get name
"jiangxl"
[root@redis-3 ~]# redis-cli 
127.0.0.1:6379> get name
"jiangxl"

2.5.部署哨兵进程sentinel

配置文件解释

sentinel monitor mymaster 192.168.81.210 6379 2     //设置主节点信息,mymaster是主节点别名,就是随便起一个名字,然后填写主节点的ip地址,2表示当主节点挂掉后,有2个sentinel同意后才会选举新的master,一组哨兵集群,要把名称都写成一样的
sentinel down-after-milliseconds mymaster 3000      //主库宕机多少秒,从库在进行切换,因为有时因为网络波动,如果只要主库一宕机就切换主从,那么redis可能一直处于正在切换状态
sentinel parallel-syncs mymaster 1          //允许几个节点同时向主库同步数据
sentinel failover-timeout mymaster 18000      //故障转移超时时间,当从库同步主库的rdb文件,多长时间没有同步完就认为超时

三台redis服务器都要按如下配置,已经将配置文件中的bind写成了系统变量,在配合cat写入到文件,因此直接执行如下命令即可

1.创建哨兵服务配置路径
mkdir -p /data/redis_cluster/redis_26379/{conf,data,pid,logs} 
2.写入哨兵配置文件
cat > /data/redis_cluster/redis_26379/conf/redis_26379.conf <<EOF
bind $(ifconfig | awk 'NR==2{print $2}')
port 26379
daemonize yes
logfile /data/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379/data
sentinel monitor mymaster 192.168.81.210 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
EOF

配置完记得查看下配置文件bind一列是否是各自主机的ip地址

2.6.启动哨兵观察配置文件的变化

三台机器都这么操作启动哨兵

redis-sentinel /data/redis_cluster/redis_26379/conf/redis_26379.conf

观察哨兵启动前后配置文件的变化

启动前

启动后

每台哨兵主机都自动增加了一个myid的配置,这个就是当主库挂掉后,哨兵选举的依据,判断谁的myid大谁就当选为主库

每台哨兵主机还自动增加了sentinel known-sentinel这个配置,这个配置每个哨兵会记录集群中其他节点的id号,这样就能够实现信息共享,即使应用在询问哨兵进程谁是主库,这时由于每个哨兵进程都有其他节点的信息,因此就能里面告诉应用谁是主库

2.7.模拟主库故障验证应用是否可用

配置完哨兵后,每个节点上都有集群的信息共享,当主库挂掉后,哨兵进程确认主库下线了,哨兵根据各自的id大小选举新的主库,接替主库的工作,保证应用程序不受影响,当主库修复好后,在通过提权的方式先同步目前主库的数据,在让自身成为主库

1.关闭主库的redis服务,reids正常关闭,sentinel直接kill
[root@redis-1 ~]# redis-cli shutdown
[root@redis-1 ~]# pkill redis
4.查看配置文件看看谁的myid大
redis-2的myid比较大
[root@redis-1 ~]# grep 'known-sentinel' /data/redis_cluster/redis_26379/conf/redis_26379.conf 
sentinel known-sentinel mymaster 192.168.81.220 26379 df44bb3e9fdf8c635628b1ae724b2db7d3ef144c
sentinel known-sentinel mymaster 192.168.81.230 26379 de282d14bb0a79df90603eb92243cd1f362dd46d
2.测试redis-2是否可用写入数据
可以写入数据,redis-2被选为主库
[root@redis-1 ~]# redis-cli -h 192.168.81.220 set gzzy_test guzhangzhuanyi
OK
[root@redis-1 ~]#  redis-cli -h 192.168.81.220 config get slaveof
1) "slaveof"
2) ""
4.测试redis-3是否可用写入数据
写入数据失败,并且同步的是redis-2的数据,因此redis-2为主库
[root@redis-1 ~]# redis-cli -h 192.168.81.230 set kkkk111 vvv
(error) READONLY You can't write against a read only slave.
[root@redis-1 ~]# redis-cli -h 192.168.81.230 config get slaveof
1) "slaveof"
2) "192.168.81.220 6379"

主库挂掉后,其他两个节点选举出master后,配置文件也会填写为新master的地址

2.8.主库挂掉其他节点配置文件的变化

相关实践学习
基于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
目录
相关文章
|
3天前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
7天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
10天前
|
人工智能 云计算 网络架构
阿里云引领智算集群网络架构的新一轮变革
11月8日~10日在江苏张家港召开的CCF ChinaNet(即中国网络大会)上,众多院士、教授和业界技术领袖齐聚一堂,畅谈网络未来的发展方向,聚焦智算集群网络的创新变革。
阿里云引领智算集群网络架构的新一轮变革
|
11天前
|
负载均衡 Dubbo 算法
集群容错架构设计
集群容错架构设计
22 1
集群容错架构设计
|
9天前
|
人工智能 运维 网络架构
阿里云引领智算集群网络架构的新一轮变革
11月8日至10日,CCF ChinaNet(中国网络大会)在江苏张家港召开,众多院士、教授和技术领袖共聚一堂,探讨网络未来发展方向。阿里云研发副总裁蔡德忠发表主题演讲,展望智算技术发展趋势,提出智算网络架构变革的新思路,发布高通量以太网协议和ENode+超节点系统规划,引起广泛关注。阿里云HPN7.0引领智算以太网生态蓬勃发展,成为业界标杆。未来,X10规模的智算集群将面临新的挑战,Ethernet将成为主流方案,推动Scale up与Scale out的融合架构,提升整体系统性能。
|
7天前
|
存储 缓存 NoSQL
【赵渝强老师】Memcached集群的架构
Memcached 是一个高性能的分布式内存对象缓存系统,通过在内存中维护一个巨大的 Hash 表来存储各种格式的数据,如图像、视频、文件及数据库检索结果等。它主要用于减轻数据库压力,提高网站系统的性能。Memcached 不支持数据持久化,因此仅作为缓存技术使用。其数据分布式存储由客户端应用程序实现,而非服务端。
【赵渝强老师】Memcached集群的架构
|
17天前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
78 4
|
17天前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
146 3
|
29天前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解
|
7天前
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。