【Redis】发布订阅 主从复制 哨兵模式


发布订阅

  1. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

  2. Redis 客户端可以订阅任意数量的频道。

  3. 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:(图片来自官网)
    在这里插入图片描述
    当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
    在这里插入图片描述

  4. 测试:

  5. client端订阅一个频道
    在这里插入图片描述

  6. 发送端发送信息,查看接收端是否收到:

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

  1. 相关命令:
序号命令描述
1PSUBSCRIBE pattern [pattern …]订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument …]]查看订阅与发布系统状态。
3PUBLISH channel message将信息发送到指定的频道。
4PUNSUBSCRIBE [pattern [pattern …]]退订所有给定模式的频道。
5SUBSCRIBE channel [channel …]订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE [channel [channel …]]指退订给定的频道。

主从复制

  1. 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。
  2. 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。主从复制的作用主要包括︰
  • 数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复∶当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  • 负载均衡∶在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载﹔尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 高可用基石∶除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
  1. 一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下︰
  • 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  • 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。
  • 项目一般都是多读少写,采用下图结构,基础一主二从。

在这里插入图片描述

  1. 配置主从库:

1)查看主从信息命令:info replication

2)copy多个配置文件
在这里插入图片描述
3)修改每个配置文件信息:避免重名

  • 第一个redis-01.conf:
    修改生成日志文件的名字
    在这里插入图片描述

修改生成rdb文件的名字

在这里插入图片描述

  • 第二个redis-02.conf:
    第一个使用的是默认的端口号6379,第二必须修改:6380
    在这里插入图片描述
    pid修改为对应的端口:
    在这里插入图片描述
    日志文件命名:
    在这里插入图片描述
    重命名rdb文件
    在这里插入图片描述
  • 第三个redis-03.conf和第二个相同,设置为6381端口
  1. 开启三个服务
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    查看进程数:
    在这里插入图片描述

  2. 三个终端连接各自端口的redis客服端:默认情况下都是主机。

  3. 怎样配置一主二从?令6379端口为主机,另外两个端口为从机,一般只需要配置从机:只需要输入命令:SLAVEOF 127.0.0.1 6379

1)设置80、81为从机,主机79
在这里插入图片描述
在这里插入图片描述
2)在主机79上查看主从信息:
在这里插入图片描述

  1. 注意:上面我们是通过命令配置的主从机,也就是关闭服务,在开启服务时就不存在这种关系,想要永久配置需要写在配置文件中:
    在这里插入图片描述
  2. 主机可以写,从机不能写,只能读。

从机写报错:
在这里插入图片描述

  1. 主机断开连接,从机依然连着主机,可以读,但是不能写。
  2. 复制原理:
    1)Slave启动成功连接到master后会发送一个sync同步命令
    2)Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
  1. 上面主从配置为下图结构:
    在这里插入图片描述
  2. 尝试下图配置:

在这里插入图片描述

我只需要修改6381的主节点为6380即可:
在这里插入图片描述

然后查看6380主从信息:依旧是从机,也就是说不能写。
在这里插入图片描述

  1. 两种模式的区别:

第一种,主机6379断开连接后,两个从机依旧连接着主机6379,任为从机,不能写。
第二种,主机6379断开连接后,我们的6380端口执行SLAVEOF no one,6380就会变成主机,6381任为6380的从机,6380可写。在这里插入图片描述

哨兵模式

  1. 哨兵模式就是自主选举主机:
  • 主从切换技术的方法是︰当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。

  • Redis从2.8开始正式提供了Sentinel (哨兵)架构来解决这个问题。

  • 谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

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

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。

  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

  1. 一个哨兵可能出现问题,可以配置多哨兵模式:
    在这里插入图片描述
  • 假设主服务器断开连接了,哨兵1先检测到这个结果,系统并不会马上进行从机切换成主机过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线
  • 当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行从机切换操作。
  • 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线
  1. 具体配置哨兵:

1)配置下图主从复制结构:

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

2)在配置文件目录下创建一个sentinel.conf哨兵的配置文件
在这里插入图片描述
3)启动哨兵配置
在这里插入图片描述
4)尝试断开6379主机,查看哨兵模式选举:

断开连接:
在这里插入图片描述
哨兵日志:
在这里插入图片描述
查看6481主从信息:
在这里插入图片描述

  1. 之前6379Redis断开连接后,如果重启服务后还想自己当主机,其他两个当从机是需要重新配置的,但是运用哨兵模式后,6379断开后,随机选取一个从机当主机,当6379重新启动时,6379又会变成之前选举出来的主机的从机。
    在这里插入图片描述
  2. 多个哨兵的配置文件:

最主要的是不同的端口号,日志文件名不重复
配置文件1:

bind 172.31.11.235
port 26380
daemonize yes
logfile "/usr/local/redis-4.0.9/sentinel.log.26380"

#master1
# 哨兵监控这个master,在至少1个哨兵实例都认为master down后把master标记为odown
sentinel monitor master1 172.31.11.235 6380 1#多少毫秒后,sentinel 认定redis master 服务器已掉线sentinel down-after-milliseconds master1 5000
# 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败
sentinel failover-timeout master1 10000
#sentinel can-failover master1 yes
sentinel parallel-syncs master1 2
# Generated by CONFIG REWRITE
dir "/usr/local/redis-4.0.9"
sentinel auth-pass master1 xxxxx

配置文件2:

bind 172.31.11.235
port 26381
daemonize yes
logfile "/usr/local/redis-4.0.9/sentinel.log.26381"

#master1
sentinel monitor master1 172.31.11.235 6380 1sentinel down-after-milliseconds master1 5000
# Generated by CONFIG REWRITE
dir "/usr/local/redis-4.0.9"
sentinel failover-timeout master1 10000
sentinel auth-pass master1 xxxxx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值