缓存中间件Redis之集群模式部署

举报
tea_year 发表于 2025/11/29 21:36:32 2025/11/29
【摘要】 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。2、哨兵的作用这里的哨兵有两个作用通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其...

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

1.png

哨兵的作用

这里的哨兵有两个作用

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

3、环境规划

配置3个哨兵和1主2从的Redis服务器来演示这个过程。

服务类型

是否是主服务器

IP地址

端口

Redis01

10.1.1.23

6379

Redis02

10.1.1.24

6379

Redis03

10.1.1.25

6379

Sentinal

-

10.1.1.23

26379

Sentinal

-

10.1.1.24

26379

Sentinal

-

10.1.1.25

26379

2.png

特别注意:使用Redis哨兵模式,最少需要3个节点(一主多从结构),其数量尽量保证是奇数个。

4、环境准备

第一步:基于redis02克隆redis03

第二步:更改主机名称、IP地址、/etc/hosts。

建议为了方便,删除redis01中的密码,然后删除redis02和redis03中的masterauth。然后关闭redis服务,启动!

# vim /usr/local/redis/conf/redis.conf

第三步:确定redis主从架构是否正常,然后把所有机器的bind绑定都设置为0.0.0.0

确认主从架构是否正常
127.0.0.1:6379> info replication
修改配置文件
# vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0

第四步:关闭保护模式

修改配置文件
# vim /usr/local/redis/conf/redis.conf
protected-mode no

重启

# pkill redis
# cd /usr/local/redis
# bin/redis-server conf/redis.conf

5、哨兵配置

第一步:把所有机器的redis-5.0.5/sentinel.conf拷贝到redis的配置文件目录

# cp /root/redis-5.0.5/sentinel.conf /usr/local/redis/conf/

第二步:在从服务器redis02redis03配置主服务器信息

# cd /usr/local/redis/conf
# vim sentinel.conf 
修改84行,将原来的127.0.0.1改为主服务器的IP地址
sentinel monitor mynaster 主服务器地址 6379 2

第三步:所有机器启动哨兵

# cd /usr/local/redis/
前端启动
# bin/redis-sentinel conf/sentinel.conf 

第四步:手动关闭master,观察redis02和redis03

# pkill redis

等选举出新的主服务器后,进行验证

127.0.0.1:6379> info replication

问题

大家可能会好奇,如果master 重连之后,会不会抢回属于他的位置,答案是否定的。

redis01恢复后如何配置

# cd /usr/local/redis/
# vim conf/redis.conf
replicaof 现在的主服务器IP 6379

启动redis
# bin/redis.server conf/redis.conf


# vim conf/sentinel.conf
sentinel monitor mynaster 现在的主服务器地址 6379 2

启动sentinel
# bin/redis-sentinel conf/sentinel.conf 

redis01等待一段时间后,在新的主机上查看集群状态

 127.0.0.1:6379> info replication


Redis集群

1、Redis哨兵与Redis集群区别

Redis哨兵:从架构上来说,其Redis还只是一个单节点的,其哨兵只不过是提供了对单点的高可用架构设计。

Redis集群:把多台Redis服务器连接在一起,共同向外提供Redis服务,所以其不仅能实现高可用的架构设计,而且还可以实现流量分发的效果。

2、redis集群架构设计

方案一:实际运维工作中,大概需要3台机器,每台机器2个节点。但是详细规划主从关系尽量不要把一组主从放在同一台服务器中。

Redis01 Redis02 Redis03
1主 1从

2主 2从

3从 3主


方案二:在一台 Linux 服务器上搭建有6个节点的 Redis集群。


3、redis集群实现

第一步:环境规划(3主3从)

编号

主机名称

IP地址

角色

1

redis01

10.1.1.23

redis7001

2

redis01

10.1.1.23

redis7002

3

redis02

10.1.1.24

redis7003

4

redis02

10.1.1.24

redis7004

5

redis03

10.1.1.25

redis7005

6

redis03

10.1.1.25

redis7006

设置之前,将redis01、redis02、redis03上的redis全部停掉,且删除所有配置文件

# pkill redis
删除配置文件
# rm -rf /usr/local/redis/conf/*

第二步:在/usr/local/redis/conf目录中创建redis7001.conf..redis7006.conf

Redis01 => redis7001.conf/redis7002.conf
Redis02 => redis7003.conf/redis7004.conf
Redis03 => redis7005.conf/redis7006.conf

配置内容如下:

port 7001 #端口
cluster-enabled yes #启用集群模式
cluster-config-file nodes_7001.conf
cluster-node-timeout 5000 #超时时间
appendonly yes
daemonize yes #后台运行
protected-mode no #非保护模式
pidfile /var/run/redis_7001.pid

注意:配置文件要修改的配置有:port、cluster-config-file、pidfile

第三步:配置完成后,启动redis的6个节点

# cd /usr/local/redis

redis01
# bin/redis-server conf/redis7001.conf
# bin/redis-server conf/redis7002.conf

redis02
# bin/redis-server conf/redis7003.conf
# bin/redis-server conf/redis7004.conf

redis03
# bin/redis-server conf/redis7005.conf
# bin/redis-server conf/redis7006.conf

验证是否启动成功
# ps -ef|grep redis
或者
# bin/redis-cli -p 7005

第四步:集群启动

Redis01 Redis02 Redis03
1主(7001) 1从(7003)

2主(7004) 2从(7005)

3从(7002) 3主(7006)

1、关闭所有redis
# pkill redis

2、删除redis中的数据文件
# cd /usr/local/redis
# rm -rf dump.rdb appendonly.aof

3、节点启动
redis01
# bin/redis-server conf/redis7001.conf
# bin/redis-server conf/redis7002.conf

redis02
# bin/redis-server conf/redis7003.conf
# bin/redis-server conf/redis7004.conf

redis03
# bin/redis-server conf/redis7005.conf
# bin/redis-server conf/redis7006.conf

4、集群中随便找一个redis服务器进行集群启动
create后面跟6个ip,前三个是主服务器,后三个是从服务器。主和从必须一一对应,主一必须对主一
# bin/redis-cli --cluster create Redis01IP:7001 Redis02IP:7004 Redis03IP:7006 Redis02IP:7003 Redis03IP:7005 Redis01IP:7002  --cluster-replicas 1

出现下面界面后输入yes

3.png

4、测试集群

# ./redis-cli -c -h 主节点IP地址 -p 7001
选项说明:
-c代表已集群的方式进行连接

查看集群信息
127.0.0.1:7001> cluster info
127.0.0.1:7001> cluster nodes

5、关闭集群

在一个redis服务器上操作即可:

# bin/redis-cli -c -h 10.1.1.23 -p 7001 shutdown
# bin/redis-cli -c -h 10.1.1.23 -p 7002 shutdown
# bin/redis-cli -c -h 10.1.1.24 -p 7003 shutdown
# bin/redis-cli -c -h 10.1.1.24 -p 7004 shutdown
# bin/redis-cli -c -h 10.1.1.25 -p 7005 shutdown
# bin/redis-cli -c -h 10.1.1.25 -p 7006 shutdown

6、集群重启

重启步骤非常简单,只需要把每台服务器的各个节点依次启动即可。

redis01
# bin/redis-server conf/redis7001.conf
# bin/redis-server conf/redis7002.conf

redis02
# bin/redis-server conf/redis7003.conf
# bin/redis-server conf/redis7004.conf

redis03
# bin/redis-server conf/redis7005.conf
# bin/redis-server conf/redis7006.conf


7、集群的工作原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任
意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做 哈希槽(hash slot)的方式来分配的。redis cluster 默认分配了 16384个slot,当我们set一个key 时,会用 CRC16 算法来取模得到所属的 slot ,然后将这个key 分到哈希槽区间的节点上,具体算法就是: CRC16(key)% 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7080端口的节点。

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。需要注意的是:必须要 3个或以上 的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

3主 3从=正常

1主 3从=1<(1+3)/2=2=集群失效

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。