這篇文章帶大家配合圖文的聊聊redis 三種模式(主從複製,哨兵,集群)理論,希望對大家有幫助!
#1. 主從同步的用處
透過持久化功能,redis 保證了即使在伺服器重啟的情況下也不會丟失數據,因為持久化會把內存中的數據保存到硬碟上,重啟會從硬碟上加載數據,但是由於數據存儲在一台伺服器上的,如果這台伺服器出現硬碟故障等問題,也會導致資料遺失。為了避免單點故障,通常的做法是將資料庫複製多個副本以部署在不同的伺服器上,這樣即使有一台伺服器發生故障,其他伺服器仍然可以繼續提供服務。為此,redis 提供了複製 replication
功能,可以實現當一台資料庫中的資料更新後,自動將更新的資料同步到其他資料庫上。 【相關推薦:Redis影片教學】
在複製的概念中,資料庫分為兩類,一類是主資料庫master
,另一類是從資料庫slave
。主資料庫可以進行讀寫操作,當寫操做導致資料變化時自動將資料同步給從資料庫,而從資料庫一般是唯讀的,並接收主資料庫同步過來的資料。一個主資料庫可以擁有多個從資料庫,而一個從資料庫只能擁有一個主資料庫。
2. 主從同步原則
#2.1 原理詳解
若啟動一個Slave 機器進程,則它會向Master 機器發送一個sync_command
指令,請求同步連線。
無論是第一次連接還是重新連接,Master 機器都會啟動一個後台進程,將資料快照(RDB)保存到資料檔案中(.rdb檔案),同時Master 還會記錄修改資料的所有命令並快取在資料檔案中。
後台進程完成快取操作之後,Master 機器就會向Slave 機器發送資料文件,Slave 端機器將資料檔案儲存到硬碟上,然後將其載入到記憶體中,接著Master 機器就會將修改資料的所有操作一併傳送給Slave 端機器。若 Slave 故障導致宕機,恢復正常後會自動重新連線。
Master 機器收到Slave 端機器的連接後,將其完整的資料檔案傳送給Slave 端機器,如果Master 同時收到多個Slave發送的同步請求則Master會在背景啟動一個進程以保存資料文件,然後將其傳送給所有的Slave 端機器,確保所有的Slave 端機器都正常。
RDB 做全量同步,AOF 做增量同步
2.2 理論精簡
#slave -> master 发送 sync command 申请同步 master 主进程 -> 调用 fork() 函数 派生 RDB 子进程进行持久化 -> 生成 RDB 文件 将 RDB 文件推送给 slaves(完成全量同步) #增量同步:使用到了 AOF 持久化(机制:将缓存数据保存到缓冲中),所以主从节点均需要开启 AOF 增量同步是通过 AOF 功能将缓存中的数据 append(追加)到缓冲中来进行 master 缓冲 -> slave 缓冲的同步 在持续性的运行过程中,也是增量持续同步的过程
2.3 最終精簡版
slave -> master 发送 sync master 使用 RDB 生成 .rdb 文件(全量同步)发送给 slaves master 使用 AOF 将缓冲区数据同步给 slaves 缓冲区数据(增量)
1. 哨兵的作用
哨兵的出現主要是解決了主從複製出現故障時需要人為幹預的問題
哨兵模式主要功能:
集群监控:负责监控 redismaster 和 slave 进程是否正常工作 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址
使用一個或多個哨兵sentinel
實例組成的系統,對redis 節點進行監控,在主節點故障的情況下,能將從節點中的一個升級為主節點,進行故障轉移,保證系統的可用性。
2. 哨兵原則
#2.1 原理詳解
sentinel 的設定檔中。
PS:redis 發布訂閱(pub/sub)是一種訊息通訊模式:發送者(pub)發送訊息,訂閱者(sub)接收訊息。
run id(redis 服务器 id) role(职能) 从服务器的复制偏移量 offset 其他
sentinel:hello 頻道發送訊息,內容包括自己的IP、連接埠、run id、設定(後續投票的時候會用到)等。
通过订阅连接对服务器的 sentinel:hello
频道做了监听,所有向该频道发送的哨兵的消息都能被接受到。
解析监听到的消息,进行分析提取,就可以知道还有那些别的哨兵服务节点也在监听这些主从节点了,更新结构体将这些哨兵节点记录下来。
向观察到的其他的哨兵节点建立命令连接(此时没有订阅连接)。
2.2 原理精简
3 个哨兵 3 个 redis
redis-cli info replication master
节点的信息 + 从节点位置2.3 思路
3. 哨兵模式下的故障迁移
① 主观下线
哨兵节点会每秒一次的频率向建立了命令连接的实例发送 PING 命令,如果在 down-after-milliseconds
毫秒内没有做出有效响应包括 PONG/LOADING/MASTERDOWN
以外的响应,哨兵就会将该实例在本结构体中的状态标记为 SRI_S_DOWN
主观下线。
② 客观下线
当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数 quorum
个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为 SRIO DOWN
客观下线询问命令 SENTINEL is-master-down-by-addr
。
③ master 选举
在认为主节点客观下线的情况下,哨兵节点节点间会发起一次选举,命令为 SENTINEL is-master-down-by-addr
,只是 runid 这次会将自己的 runid 带进去,希望接受者将自己设置为主节点。如果超过半数以上的节点返回将该节点标记为 leader 的情况下,会有该 leader 对故障进行迁移。
④ 故障转移
####在从节点中挑选出新的主节点 通讯正常 优先级排序 优先级相同时选择 offset 最大的 ###将该节点设置成新的主节点SLAVEOF no one,并确保在后续的INGO命令时 该节点返回状态为master ###将其他的从节点设置成从新的主节点复制,SLAVEOF命令 ###将旧的主节点变成新的主节点的从节点 PS:优缺点 #优点: 高可用,哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式都具有有;主从可以自动切换,系统更健壮,可用性更高 #缺点: redis 比较难支持在线扩容,在群集容量达到上限时在线扩容会变得很复杂
1. redis 集群的含义
主节点负责读写请求和集群信息的维护,从节点只进行主节点数据和状态信息的复制
redis 的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台 redis 服务器都存储相同的数据,很浪费内存资源,所以在 redis3.0 上加入了 Cluster 群集模式,实现了 redis 的分布式存储,也就是说每台 redis 节点存储着不同的内容。根据官方推荐,集群部署至少要 3 台以上的 master 节点,最好使用 3 主 3 从六个节点的模式。
Cluster 群集由多个 redis 服务器组成的分布式网络服务群集,群集之中有多个 master 主节点,每一个主节点都可读可写,节点之间会相互通信,两两相连,redis 群集无中心节点。
2. redis 集群的特点
redis sentinel
的节点故障检测和自动故障转移功能,当群集中的某个主节点下线时,群集中的其他在线主节点会注意到这一点,并且对已经下线的主节点进行故障转移redis sentinel
进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以群集不必另外使用 redis sentinel
https://www.zhihu.com/question/300767410/answer/1749442787
如果在一个分布式系统中,我们从数据库中读取一个数据,然后修改保存,这种情况很容易遇到并发问题。因为读取和更新保存不是一个原子操作,在并发时就会导致数据的不正确。这种场景其实并不少见,比如电商秒杀活动,库存数量的更新就会遇到。如果是单机应用,直接使用本地锁就可以避免。如果是分布式应用,本地锁派不上用场,这时就需要引入分布式锁来解决。由此可见分布式锁的目的其实很简单,就是为了保证多台服务器在执行某一段代码时保证只有一台服务器执行。
简单来说:
现在的业务应用通常都是微服务架构,这也意味着一个应用会部署多个进程,那么多个进程如果需要修改数据库中的同一行记录时,为了避免操作乱序导致数据错误,此时就需要引入分布式锁解决问题。
为了保证分布式锁的可用性,至少要确保锁的实现要同时满足以下几点:
一般来说,实现分布式锁的方式有以下几种:
对 redis 来说注意三点,对 key 的加锁,如果请求未完成对快要过期的 key 的续期,请求完成后 key 的解锁。防止并发环境下被读取的一个 key 可能被多个请求修改,造成无效操作,资源浪费的情况。
redis 可以做为 mysql 的前置缓存数据库,redis 与 mysql 对接的方式需要配置线程池,需要定义后端 mysql 的位置( IP + port +sock 文件的位置)
redis 基础功能:用于内存/缓存的快速存储(读取)
实现的方式:
默认将数据存储在内存/缓存中 具有丰富的数据类型:string list hash set && order set 等 重要数据持久化的功能,持久化的方式:AOF RDB
单线程模式 -> 速度快的原因之一:Epoll + I/O 复用(cluster 中的 slots 哈希槽可以充当数据读、取的索引)
LRU:淘汰策略 1) 缓存中的数据进行随机淘汰 2) 缓存中被设置了过期时间的数据进行随机淘汰 3) 缓存中被设置了过期时间的数据,进行惰性删除(仅当访问到的数据过期了,才会删除) 4) 当数据持续存储过程中内存将满,会在设置了过期时间的数据中进行近期淘汰 令牌桶 + 漏桶算法:限流 Raft:选举机制,用于选举新的主节点
高热数据:命中次数高的数据 指定提高缓存内数据的命中数,最直接的可以刷脚本,访问这些数据
1. 单例服务器,服务器本身优化
硬件资源选择(系统五大资源)
以上需要计算费用成本,还需要考虑到该服务器上的服务在运行时消耗的性能比例(需要预留给系统一部分资源)
服务本身环境的选择
操作系统选择 Linux 发行版:centos ubuntu redhat server debian alphon mac SUSE
(PS:虚拟化 KVM XEN FUFE)
基于操作系统,依赖环境。选择最小化安装还是指定操作系统版本的安装 + 指定内核版本。软件是否有依赖(例如:tomcat 需要 JDK,编译需要 gcc gcc-c++ pcre …)
Software resource optimizationFive major loads + kernel optimization
(TCP protocol related, queue related, routing forwarding, redirection, port, number of open files, system software and hardware restrictions, etc.)
2. Optimization of the singleton server application service itself
Take redis as an example
First of all, from the perspective of the recovery file that is started to be read, the AOF function needs to be enabled based on AOF (RDB default)
everysecond
During use, What needs to be taken into consideration is the memory usage (OOM)
Persistence direction
While ensuring data integrity, the persistence function will still continuously produce storage pressure on the disk (the pressure comes from the data generated by AOF and RDB files, AOF and RDB log files).
NFS GFS fastDFS
redis main process
3. Cluster optimization
4. Architecture optimization
5. Optimize according to the data flow direction
For more programming-related knowledge, please visit: Introduction to Programming! !
以上是聊聊redis中主從複製、哨兵、集群的理論【圖文詳解】的詳細內容。更多資訊請關注PHP中文網其他相關文章!