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

哨兵的作用
这里的哨兵有两个作用
- 通过发送命令,让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 |

特别注意:使用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/
第二步:在从服务器redis02、redis03配置主服务器信息
# 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

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=集群失效
- 点赞
- 收藏
- 关注作者
评论(0)