Redis高可用技术介绍及部署(主从复制、集群、哨兵)

一、Redis高可用技术

在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群

  • 主从复制:是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制
  • 哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷﹔写操作无法负载均衡;存储能力受到单机的限制。
  • 集群﹔通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

二、Redis主从复制

  • 简而言之就是将一台Redis服务器的数据备份到一台或多台Redis服务器,备份的服务器为主服务器,接收备份数据的服务器则为从服务器,备份是单向的,主>>>>从 从—xxx–主
  • 一主可以有多从,但一丛只能有一主
1. 主从复制的作用
  • 高可用架构基础
  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:在主从复制基础上,配置MHA,当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
  • 负载均衡:单纯的主从复制只能提供冗余备份作用,但可以在此基础上配置读写分离,来将读操作和数据修改操作分离到不同服务器,以此实现负载均衡
2. 主从复制流程

Redis主从复制流程跟MySQL的是不一样的

  1. 若启动一个Slave机器进程,则它会向Master机器发送一个“sync command”命令,请求同步连接。

  2. 无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

  3. 后台进程完成缓存操作之后,Maste机器就会向Slave机器发送数据文件,Slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

  4. Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

3. 搭建主从复制
  • 实验服务器为一主两从(最低搭配)都只需安装redis即可
  • 软件包Redis介绍那篇博客,有需要自取

安装Redis(三台相同)步骤略过,在Redis介绍那篇博客里也有

1. 修改Master节点配置文件

修改 70和700行即可 其他可保持默认

vim /etc/redis/6379.conf
bind 0.0.0.0						#70行,修改bind 项,0.0.0.0监听所有网段
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录
appendonly yes						#700行,开启AOF持久化功能

/etc/init.d/redis_6379 restart      #重启

2. 修改Slave节点配置文件(两台相同)
vim /etc/redis/6379.conf
bind 0.0.0.0						#70行,修改bind 项,0.0.0.0监听所有网卡
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录
replicaof 192.168.100.133 6379		#288行,指定要同步的Master节点IP和端口
appendonly yes						#700行,开启AOF持久化功能


/etc/init.d/redis_6379 restart

在这里插入图片描述

3. 验证主从复制
进入redis输入 info replication 查看信息或者直接输入 redis-cli info replication 同样的命令

tail -f /var/log/redis_6379.log   查看master服务器日志

在这里插入图片描述
在这里插入图片描述
至此,Redis主从复制搭建完成,相比于MySQL主从复制,较为简单

三、Redis哨兵

  • 哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。并将故障转移的结果发送给客户端;所以整个运行哨兵的集群的数量不得少于3个节点。
  • 故其作用为在主从复制的基础上,通过监控各个服务器,实现故障转移功能
1.哨兵模式结构

哨兵结构由两部分组成,哨兵节点和数据节点

  • 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
  • 数据节点:主节点和从节点都是数据节点。

切换机制:

  • 哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的 Redis 工作节点是否正常,当 Master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个 Master 的确出现问题,然后会通知哨兵间,然后从 Slaves 中选取一个作为新的 Master。

  • 需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。

主客观下线解释:

主观下线(SDOWN:subjectively down)

  • 即当前sentinel实例认为某个redis服务为”不可用”状态.

客观下线(ODOWN:objectively down)

  • 即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启故障转移机制.
2. 哨兵模式配置

哨兵模式不需要独立软件包,基于Redis主从同步基础上修改配置文件进行配置即可

vim /opt/redis-5.0.7/sentinel.conf

protected-mode no								#17行,取消注释,关闭保护模式
port 26379										#21行,Redis哨兵默认的监听端口
daemonize yes									#26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log"					#36行,指定日志存放路径
dir "/var/lib/redis/6379"						#65行,指定数据库存放路径

sentinel monitor mymaster 192.168.100.133 6379 2	#84行,修改 指定该哨兵节点监控192.168.100.133:6379这个主节点,
#该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000	#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000		#146行,故障节点的最大超时时间为180000(180秒)

在这里插入图片描述

3. 启动哨兵模式

先启动master上的 再启动slaves服务器上的

cd /opt/redis-5.0.7/

redis-sentinel sentinel.conf &  后台启动哨兵

在这里插入图片描述
在这里插入图片描述

4. 模拟故障恢复

在这里插入图片描述

查看哨兵信息 和master日志
redis-cli -p 26379 INFO Sentinel

tail -f /var/log/sentinel.log

在这里插入图片描述

5. 故障转移过程
  • 故障转移是由 sentinel 领导者节点来完成的(只需要一个sentinel节点),关于 sentinel 领导者节点的选取也是每个 sentinel 向其他 sentinel 节点发送我要成为领导者的命令,超过半数sentinel 节点同意,并且也大于quorum ,那么他将成为领导者,如果有多个sentinel都成为了领导者,则会过段时间在进行选举.

  • sentinel 领导者节点选举出来后,会通过如下几步进行故障转移:

一、从 slave 节点中选出一个合适的 节点作为新的master节点.这里的合适包括如下几点:

  • 选择 slave-priority(slave节点优先级)最高的slave节点,如果存在则返回,不存在则继续下一步判断.

  • 选择复制偏移量最大的 slave 节点(复制的最完整),如果存在则返回,不存在则继续.

  • 选择runId最小的slave节点(启动最早的节点)

二、对上面选出来的 slave 节点执行 slaveof no one 命令让其成为新的 master 节点.

三、向剩余的 slave 节点发送命令,让他们成为新master 节点的 slave 节点,复制规则和前面设置的 parallel-syncs 参数有关.

四、更新原来master 节点配置为 slave 节点,并保持对其进行关注,一旦这个节点重新恢复正常后,会命令它去复制新的master节点信息.(注意:原来的master节点恢复后是作为slave的角色)

四、集群模式

  • Redis 3.0开始引入的分布式存储方案
  • 集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
  • Cluster 群集由多个redis服务器组成的分布式网络服务群集,群集中有多个master主节点,每个主节点都可读可写,节点之间会互相通信,两两相连,redis群集无中心节点
  • 群集进行故障转移的方法和 redis sentinel 进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点复制进行的,所以群集不必另外使用 redis sentinel
1. 集群作用
  • 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务
  • 数据分片:集群将数据分散到多个节点(分布式),一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
    Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。

关于数据分片

Redis集群有16384个哈希槽(编号0-16383)

  • 以3个节点组成的集群为例
    节点A包含0到5460号哈希槽
    节点B包含5461到10922号哈希槽
    节点C包含10923到16383号哈希槽

每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

集群的主从复制解读:

  • 例如上述的A节点挂了,那么就会有0-5460哈希槽失效,这时若没有A的从服务器来接管 那么整个集群就会不可用,所以需要给每个主节点最少分配一个从节点,用来被集群推举接替工作
2. 集群模式搭建
  • 因为群集至少三台主服务器。所以最低配置为六台(三主三从)
  • 分别安装Redis即可

嫌麻烦的可以复制这个安装Redis的shell脚本

这个脚本是编译安装,执行前将软件包放到/opt目录下即可

#!/bin/bash
systemctl stop firewalld
setenforce 0
yum install -y gcc gcc-c++ make
yum -y install expect
cd /opt
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install

cd /opt/redis-5.0.7/utils
/usr/bin/expect <<EOF
spawn ./install_server.sh
expect "instance" {send "\r"} 
expect "config" {send "\r"}
expect "log" {send "\r"}
expect "data" {send "\r"}
expect "executable" {send "/usr/local/redis/bin/redis-server\r"}
expect "abort" {send "\r"}
expect eof
EOF

ln -s /usr/local/redis/bin/* /usr/local/bin/
/etc/init.d/redis_6379 restart

sed -i '/bind 127.0.0.1/c bind 0.0.0.0' /etc/redis/6379.conf
sed -i 's/appendonly no/appendonly yes/' /etc/redis/6379.conf

/etc/init.d/redis_6379 restart
/etc/init.d/redis_6379 status
netstat -natp | grep redis

1. 修改节点配置文件
  • 我这里为了实验省事,就用了三台虚拟机,分别配置两张网卡模拟两个服务器
  • 首先进入redis目录 创建集群目录
  • 【若是每台服务器分别只承担一个节点,只创建一个目录即可,并且不用修改端口也可以(默认6379);但是如果像我这种一台服务器上做两个节点或多个的 就需要创建同数量的目录用来提供不同服务,端口和文件名也要有区分,以免冲突】
cd /etc/redis/

mkdir -p redis-cluster/redis6379  创建集群节点目录

cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6379/   拷贝配置文件
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6379/   拷贝命令

这里为第一个服务器上的配置(192.168.100.133 192.168.100.36两个节点)
在这里插入图片描述

cd /etc/redis/redis-cluster/redis6371
vim redis.conf

bind 192.168.100.133					#69行,修改bind项,监听自己的IP
protected-mode no						#88行,修改,关闭保护模式
port 6371								#92行,修改,redis监听端口,
daemonize yes							#136行,以独立进程启动
appendonly yes							#699行,修改,开启AOF持久化
cluster-enabled yes						#832行,取消注释,开启群集功能
cluster-config-file nodes-6379.conf		#840行,取消注释,群集名称文件设置,无需修改
cluster-node-timeout 15000				#846行,取消注释群集超时时间设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其他节点都是几乎相同的配置,只有监听地址和端口不一样(都为自己的节点ip和端口)

为节省时间可以用scp远程复制

scp /etc/redis/redis-cluster/redis6371/redis.conf root@192.168.100.134:/etc/redis/redis-cluster/redis6373

仅供参考 目录名文件名自行修改、复制过去之后  把文件的监听ip和端口修改下即可

在这里插入图片描述

2. 所有节点启动redis
cd /etc/redis/redis-cluster/redis6371/
redis-server redis.conf

cd /etc/redis/redis-cluster/redis6372/
redis-server redis.conf

cd /etc/redis/redis-cluster/redis6373/
redis-server redis.conf
..........
..................
..........................各个节点都重复此操作即可

在这里插入图片描述

3. 启动集群(任何一个节点输入都可以)
redis-cli --cluster create 192.168.100.133:6371 192.168.100.136:6372 192.168.100.134:6373 192.168.100.137:6374 192.168.100.135:6375 192.168.100.138:6376 --cluster-replicas 1

在这里插入图片描述

4. 查看节点哈希槽及测试

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值