Redis高可用方案:sentinel(哨兵模式)和集群

本文介绍了Redis的高可用方案,包括哨兵模式和集群搭建。哨兵模式中,通过哨兵节点监控、故障发现、领导者选举实现主从切换。在集群配置中,详细阐述了节点分配、数据分配以及主从模式,强调了集群至少需要奇数个节点以保证服务连续性。最后,提供了集群搭建的步骤,涉及多个实例的配置与连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着其他Sentinel也陆续发现故障,这个时候其中一个Sentinel就会发起投票。一定数量的哨兵(在配置文件中指定)确认Master被标记为主观下线,此时将Master标记为客观下线。

3.sentinel的leader选举:

要想完成故障切换(将故障master剔除,并将一个slave提升为master)就必须先选举一个leader。最先发现故障的sentinel向其他哨兵发起请求成为leader,其他哨兵在没有同意别的哨兵的leader请求时,就会把票投给该sentinel。当半数以上的sentinel投票通过后就认定该sentinel为leader。接下来的故障切换有该leader完成。

4.master选举:

leader选好后将故障master剔除,从slave中挑选一个成为master。遵照的原则如下:

  • slave的优先级

  • slave从master那同步的数据量,那个slave多就优先。

5.新Master再通过发布订阅模式通知所有sentinel更新监控主机信息。

6.故障的主服务器修复后将成为从服务器继续工作。

故障发生

1afa274aebf7c71a5e65b8d9ba32db99.png

故障切换

7fd8b9af214995a69a948d7a4f78fb2c.png

Master重新上线后

e9938a278df717ff23a47600b1e62e5f.png

哨兵模式配置

本实验在一台机器上完成,创建不同端口的redis实例。

7b3da22a3abd1373cf04d4775ff1470f.png

1.创建redis实例

[root@redis ~]# nohup redis-server --port 6380 >> /data/redis/log/6380.log 2>&1 &

[root@redis ~]# nohup redis-server --port 6381 >> /data/redis/log/6381.log 2>&1 &

[root@redis ~]# nohup redis-server --port 6382 >> /data/redis/log/6382.log 2>&1 &

[root@redis ~]# ps -ef |grep redis

root      16421  16314  0 03:01 pts/1    00:00:00 redis-server *:6380

root      16427  16314  0 03:01 pts/1    00:00:00 redis-server *:6381

root      16431  16314  0 03:01 pts/1    00:00:00 redis-server *:6382

root      16436  16314  0 03:01 pts/1    00:00:00 grep --color=auto redis

2.连接数据库并设置主从复制

[root@redis ~]# redis-cli -p 6380

127.0.0.1:6380>

[root@redis ~]# redis-cli -p 6381

127.0.0.1:6381> SLAVEOF 127.0.0.1 6380    #将6380设置为master

OK

[root@redis ~]# redis-cli -p 6382

127.0.0.1:6382> SLAVEOF 127.0.0.1 6380

OK

3.搭建哨兵模式集群

创建sentinel配置文件

[root@redis conf]# cat sentinel1.conf

port 26300                              #指定sentinel进程端口号

sentinel monitor redis1 127.0.0.1 6380 2  #Sentinel monitor    

[root@redis conf]# cat sentinel2.conf

port 26301

sentinel monitor redis1 127.0.0.1 6380 2

  • name :redis主服务名称,可以自行命名,但是在一个sentinel网络中,一个redis主服务只能有一个名称;

  • ip和port :redis主服务的IP地址和端口号.

  • quorum :表示要将这个主服务器判断为失效并下线至少需要2个sentinel同意

  • protected-mode :关闭保护模式(默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和sentinel的protected-mode修改为no,若只修改redis node,从远程连接sentinel后,依然是无法正常使用的,且sentinel的配置文件中没有protected-mode配置项,需要手工添加。依据redis文档的说明,若protected-mode设置为no后,需要增加密码证或是IP限制等保护机制,否则是极度危险的。)

启动sentinel

[root@redis ~]# nohup redis-sentinel /data/redis/conf/sentinel1.conf >> /data/redis/log/sentinel1.log 2>&1 &

[1] 16522

[root@redis ~]# nohup redis-sentinel /data/redis/conf/sentinel2.conf >> /data/redis/log/sentinel2.log 2>&1 &

[2] 16526

[root@redis ~]# ps -ef |grep sentinel

root      16522  16440  0 03:55 pts/2    00:00:00 redis-sentinel *:26300 [sentinel]

root      16526  16440  0 03:55 pts/2    00:00:00 redis-sentinel *:26301 [sentinel]

4.测试。模拟主节点故障,查看故障后主从环境改变

关闭主节点

[root@redis ~]#  ps -ef |grep redis-server

root      16604  16440  0 04:12 pts/2    00:00:02 redis-server *:6381

root      16608  16440  0 04:12 pts/2    00:00:03 redis-server *:6382

root      16702  16314  0 04:46 pts/1    00:00:00 redis-server *:6380

[root@redis ~]# kill 16702

此时查看6381和6382的日志文件,在6382的日志文件中发现了如下内容,说明此时已经将6381切换为主节点。

6550c13e51c6fdfb137f7b8520c86dc9.png

再次启动6380时,6380成为slave,6381时master

ae3ac8b8f2de85d6945989d00aaa79a0.png

最后查看一下sentinel配置文件:

cat /data/redis/conf/sentinel2.conf

port 26301

sentinel myid 74cdfbb5ae55a77ad4d05d5d9d50fd64725e192a

# Generated by CONFIG REWRITE

dir “/root”

protected-mode no

sentinel deny-scripts-reconfig yes

sentinel monitor redis1 127.0.0.1 6381 1     #主节点

sentinel config-epoch redis1 1

sentinel leader-epoch redis1 1

sentinel known-replica redis1 127.0.0.1 6382    #从节点

sentinel known-replica redis1 127.0.0.1 6380

sentinel known-sentinel redis1 127.0.0.1 26300 9539652da78b0385479a827e753deceaef864989

sentinel current-epoch 1

二. redis高可用方案–集群

使用哨兵模式,解决了主节点故障自动切换的问题,但是却不可以动态扩充redis。所以在redis3.0之后提出了集群模式。

redis集群设计:

redis集群采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

436a5a09eb5193ef92846be9bfb41cf3.png

特点:

  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

  • 节点的失效是通过集群中超过半数的节点检测失效时才生效。

  • 集群是一个整体,客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

  • Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

redis集群节点分配和数据分配

节点分配:

Redis集群预分好16384个桶,采用哈希槽 (hash slot)的方式来平均分配16384个slot 。以三个节点为例,

  • 节点1:0-5460;

  • 节点2:5461-10922;

  • 节点3:10923-16383.

若存入一个值,按照哈希槽算法得到6587,那么就会将数据存入节点2。取数据时也是从节点2上取。

当新增一个节点时:

采用从各个节点的前面各拿取一部分槽到新节点上,如添加节点4,哈希槽就为,0-1364,5461-6826,10923-12287。

redis集群的主从模式

为了保证数据高可用,集群应建立在主从基础之上。一个主节点对应一个从节点。主节点提供数据存取,从节点提供数据读取,当主节点故障后,就会有这个从节点选取一个来充当主节点,从而保证集群正常运行。

但是在一个集群中,一对主从节点同时故障,那么集群将失去服务能力。

redis集群搭建:

redis集群中至少应该有奇数个节点,所以至少有三个节点,每个节点至少有一个备份节点,所以本次实验使用6个节点(主节点、备份节点由redis-cluster集群确定)。

实验在两台机器进行,每台机器启动三个基于不同端口redis实例,6个实例两两对应主从。

9c0bee4c08eef7e605d39351996ffdc1.png 57c7b83cf0570c7e014816f47057adbe.png

1.创建一个目录redis_cluster,用来存放每个实例所用的配置文件.

[root@redis redis]# mkdir redis_cluster

[root@redis redis]# mkdir -p redis_cluster/7001

[root@redis redis]# cp -r conf/redis.conf redis_cluster/

2.修改配置文件,将修改好的文件复制5份分别放置不同redis配置目录下。

修改配置文件

vim 7001/redis.conf修改一下几项

bind 192.168.126.162  (本机IP)

port 7001                                    #redis端口

daemonize yes                               #redis在后台启动

logfile “/data/redis/log/logs”

pidfile /var/run/redis_7001.pid

cluster-enabled yes                    #开启集群功能

cluster-config-file nodes-7001.conf    #集群配置文件

cluster-node-timeout 5000          #姐点之间通讯时间

appendonly yes                      #开启AOF持久化方式

创建目录7002 到7006,其中7004到7005创建在192.168.126.161上。再把配置文件复制到700*目录下,修改配置文件中端口号和ip。

[root@redis redis_cluster]# cp -rp 7001 7002

[root@redis redis_cluster]# cp -rp 7001 7003

[root@redis redis_cluster]# vim 7002/redis.conf          #修改端口为7002

[root@redis redis_cluster]# vim 7003/redis.conf

将配置文件目录拷贝到192.168.126.161上

[root@redis redis_cluster]# scp -rp 7001 192.168.126.161:/usr/local/redis/redis_cluster/

修改配置文件(端口号和ip)

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

im 7002/redis.conf          #修改端口为7002

[root@redis redis_cluster]# vim 7003/redis.conf

将配置文件目录拷贝到192.168.126.161上

[root@redis redis_cluster]# scp -rp 7001 192.168.126.161:/usr/local/redis/redis_cluster/

修改配置文件(端口号和ip)

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-K0ADzcIr-1714442174655)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值