发布订阅
-
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
-
Redis 客户端可以订阅任意数量的频道。
-
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:(图片来自官网)
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
-
测试:
-
client端订阅一个频道
-
发送端发送信息,查看接收端是否收到:
- 相关命令:
序号 | 命令 | 描述 |
---|---|---|
1 | PSUBSCRIBE pattern [pattern …] | 订阅一个或多个符合给定模式的频道。 |
2 | PUBSUB subcommand [argument [argument …]] | 查看订阅与发布系统状态。 |
3 | PUBLISH channel message | 将信息发送到指定的频道。 |
4 | PUNSUBSCRIBE [pattern [pattern …]] | 退订所有给定模式的频道。 |
5 | SUBSCRIBE channel [channel …] | 订阅给定的一个或多个频道的信息。 |
6 | UNSUBSCRIBE [channel [channel …]] | 指退订给定的频道。 |
主从复制
- 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。
- 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。主从复制的作用主要包括︰
- 数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复∶当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡∶在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载﹔尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
- 高可用基石∶除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
- 一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下︰
- 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
- 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。
- 项目一般都是多读少写,采用下图结构,基础一主二从。
- 配置主从库:
1)查看主从信息命令:info replication
2)copy多个配置文件
3)修改每个配置文件信息:避免重名
- 第一个redis-01.conf:
修改生成日志文件的名字
修改生成rdb文件的名字
- 第二个redis-02.conf:
第一个使用的是默认的端口号6379,第二必须修改:6380
pid修改为对应的端口:
日志文件命名:
重命名rdb文件
- 第三个redis-03.conf和第二个相同,设置为6381端口
-
开启三个服务
查看进程数:
-
三个终端连接各自端口的redis客服端:默认情况下都是主机。
-
怎样配置一主二从?令6379端口为主机,另外两个端口为从机,一般只需要配置从机:只需要输入命令:
SLAVEOF 127.0.0.1 6379
1)设置80、81为从机,主机79
2)在主机79上查看主从信息:
- 注意:上面我们是通过命令配置的主从机,也就是关闭服务,在开启服务时就不存在这种关系,想要永久配置需要写在配置文件中:
- 主机可以写,从机不能写,只能读。
从机写报错:
- 主机断开连接,从机依然连着主机,可以读,但是不能写。
- 复制原理:
1)Slave启动成功连接到master后会发送一个sync同步命令
2)Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
- 上面主从配置为下图结构:
- 尝试下图配置:
我只需要修改6381的主节点为6380即可:
然后查看6380主从信息:依旧是从机,也就是说不能写。
- 两种模式的区别:
第一种,主机6379断开连接后,两个从机依旧连接着主机6379,任为从机,不能写。
第二种,主机6379断开连接后,我们的6380端口执行SLAVEOF no one
,6380就会变成主机,6381任为6380的从机,6380可写。
哨兵模式
- 哨兵模式就是自主选举主机:
-
主从切换技术的方法是︰当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
-
Redis从2.8开始正式提供了Sentinel (哨兵)架构来解决这个问题。
-
谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
-
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
哨兵: -
通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
-
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
- 一个哨兵可能出现问题,可以配置多哨兵模式:
- 假设主服务器断开连接了,哨兵1先检测到这个结果,系统并不会马上进行从机切换成主机过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。
- 当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行从机切换操作。
- 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。
- 具体配置哨兵:
1)配置下图主从复制结构:
2)在配置文件目录下创建一个sentinel.conf哨兵的配置文件
3)启动哨兵配置
4)尝试断开6379主机,查看哨兵模式选举:
断开连接:
哨兵日志:
查看6481主从信息:
- 之前6379Redis断开连接后,如果重启服务后还想自己当主机,其他两个当从机是需要重新配置的,但是运用哨兵模式后,6379断开后,随机选取一个从机当主机,当6379重新启动时,6379又会变成之前选举出来的主机的从机。
- 多个哨兵的配置文件:
最主要的是不同的端口号,日志文件名不重复
配置文件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