YouTube買粉丝、facebook刷点赞、tiktok买粉丝点赞–instagram买粉丝
YouTube買粉丝、facebook刷点赞、tiktok买粉丝点赞–instagram买粉丝

03 redis訂閱發布缺點(redis主從和哨兵)

来源: 发表时间:2024-05-19 07:12:54

件也是Redis主從同步內部實現中的一環。RDB有他的不足,就是一旦數據庫出現問題,那么我們的RDB文件中保存的數據并不是全新的,從上次RDB文件生成到Redis停機這段時間的數據全部丟掉了。在某些業務下,這是可以忍受的。

2)AOF日志

AOF日志的全稱是append only file,它是一個追加寫入的日志文件。與一般數據庫的binlog不同的是,AOF文件是可識別的純文本,它的內容就是一個個的Redis標準命令。只有那些會導致數據發生修改的命令才會追加到AOF文件。每一條修改數據的命令都生成一條日志,AOF文件會越來越大,所以Redis又提供了一個功能,叫做AOF rewrite。其功能就是重新生成一份AOF文件,新的AOF文件中一條記錄的操作只會有一次,而不像一份老文件那樣,可能記錄了對同一個值的多次操作。其生成過程和RDB類似,也是fork一個進程,直接遍歷數據,寫入新的AOF臨時文件。在寫入新文件的過程中,所有的寫操作日志還是會寫到原來老的AOF文件中,同時還會記錄在內存緩沖區中。當重完操作完成后,會將所有緩沖區中的日志一次性寫入到臨時文件中。然后調用原子性的rename命令用新的AOF文件取代老的AOF文件。

AOF是一個寫文件操作,其目的是將操作日志寫到磁盤上,所以它也同樣會遇到我們上面說的寫操作的流程。在Redis中對AOF調用write寫入后,通過appendfsync選項來控制調用fsync將其寫到磁盤上的時間,下面appendfsync的三個設置項,安全強度逐漸變強。

appendfsync no 當設置appendfsync為no的時候,Redis不會主動調用fsync去將AOF日志內容同步到磁盤,所以這一切就完全依賴于操作系統的調試了。對大多數Linux操作系統,是每30秒進行一次fsync,將緩沖區中的數據寫到磁盤上。

appendfsync everysec 當設置appendfsync為everysec的時候,Redis會默認每隔一秒進行一次fsync調用,將緩沖區中的數據寫到磁盤。但是當這一次的fsync調用時長超過1秒時。Redis會采取延遲fsync的策略,再等一秒鐘。也就是在兩秒后再進行fsync,這一次的fsync就不管會執行多長時間都會進行。這時候由于在fsync時文件描述符會被阻塞,所以當前的寫操作就會阻塞。所以結論就是,在絕大多數情況下,Redis會每隔一秒進行一次fsync。在最壞的情況下,兩秒鐘會進行一次fsync操作。這一操作在大多數數據庫系統中被稱為group 買粉絲mit,就是組合多次寫操作的數據,一次性將日志寫到磁盤。

appednfsync always 當設置appendfsync為always時,每一次寫操作都會調用一次fsync,這時數據是最安全的,當然,由于每次都會執行fsync,所以其性能也會受到影響。

對于一般性的業務需求,建議使用RDB的方式進行持久化,原因是RDB的開銷并相比AOF日志要低很多,對于那些無法忍數據丟失的應用,建議使用AOF日志。

4、集群管理的不同

Memcached是全內存的數據緩沖系統,Redis雖然支持數據的持久化,但是全內存畢竟才是其高性能的本質。作為基于內存的存儲系統來說,機器物理內存的大小就是系統能夠容納的最大數據量。如果需要處理的數據量超過了單臺機器的物理內存大小,就需要構建分布式集群來擴展存儲能力。

Memcached本身并不支持分布式,因此只能在客戶端通過像一致性哈希這樣的分布式算法來實現Memcached的分布式存儲。下圖給出了Memcached的分布式存儲實現架構。當客戶端向Memcached集群發送數據之前,首先會通過內置的分布式算法計算出該條數據的目標節點,然后數據會直接發送到該節點上存儲。但客戶端查詢數據時,同樣要計算出查詢數據所在的節點,然后直接向該節點發送查詢請求以獲取數據。

相較于Memcached只能采用客戶端實現分布式存儲,Redis更偏向于在服務器端構建分布式存儲。最新版本的Redis已經支持了分布式存儲功能。Redis Cluster是一個實現了分布式且允許單點故障的Redis高級版本,它沒有中心節點,具有線性可伸縮的功能。下圖給出Redis Cluster的分布式存儲架構,其中節點與節點之間通過二進制協議進行通信,節點與客戶端之間通過ascii協議進行通信。在數據的放置策略上,Redis Cluster將整個key的數值域分成4096個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是4096。Redis Cluster使用的分布式算法也很簡單:crc16( key ) % HASH_SLOTS_NUMBER。

為了保證單點故障下的數據可用性,Redis Cluster引入了Master節點和Slave節點。在Redis Cluster中,每個Master節點都會有對應的兩個用于冗余的Slave節點。這樣在整個集群中,任意兩個節點的宕機都不會導致數據的不可用。當Master節點退出后,集群會自動選擇一個Slave節點成為新的Master節點。

redis主從和哨兵

主從復制:主節點負責寫數據,從節點負責讀數據,主節點定期把數據同步到從節點保證數據的一致性

a,配置主從復制方式一、新增redis6380.買粉絲nf, 加入 slaveof 192.168.152.128 6379, 在6379啟動完后再啟6380,完成配置;

b,配置主從復制方式二、redis-server --slaveof 192.168.152.128 6379 臨時生效

c,查看狀態:info replication

d,斷開主從復制:在slave節點,執行6380:>slaveof no one

e,斷開后再變成主從復制:6380:> slaveof 192.168.152.128 6379

f,數據較重要的節點,主從復制時使用密碼驗證: requirepass

e, 從節點建議用只讀模式slave-read-only=yes, 若從節點修改數據,主從數據不一致

h,傳輸延遲:主從一般部署在不同機器上,復制時存在網絡延時問題,redis提供repl-disable-tcp-nodelay參數決定是否關閉TCP_NODELAY,默認為關閉

參數關閉時:無論大小都會及時發布到從節點,占帶寬,適用于主從網絡好的場景,

參數啟用時:主節點合并所有數據成TCP包節省帶寬,默認為40毫秒發一次,取決于內核,主從的同步延遲40毫秒,適用于網絡環境復雜或帶寬緊張,如跨機房

a)一主一從:用于主節點故障轉移從節點,當主節點的“寫”命令并發高且需要持久化,可以只在從節點開啟AOF(主節點不需要),這樣即保證了數據的安全性,也避免持久化對主節點的影響

b)一主多從:針對“讀”較多的場景,“讀”由多個從節點來分擔,但節點越多,主節點同步到多節點的次數也越多,影響帶寬,也加重主節點的穩定

c)樹狀主從:一主多從的缺點(主節點推送次數多壓力大)可用些方案解決,主節點只推送一次數據到從節點B,再由從節點B推送到C,減輕主節點推送的壓力。

redis 2.8版本以上使用psync命令完成同步,過程分“全量”與“部分”復制

全量復制:一般用于初次復制場景(第一次建立SLAVE后全量)

部分復制:網絡出現問題,從節點再次連接主節點時,主節點補發缺少的數據,每次數據增量同步

心跳:主從有長連接心跳,主節點默認每10S向從節點發ping命令,repl-ping-slave-period控制發送頻率

a)主從復制,若主節點出現問題,則不能提供服務,需要人工修改配置將從變主

b)主從復制主節點的寫能力單機,能力有限

c)單機節點的存儲能力也有限

a)主節點(master)故障,從節點slave-1端執行 slaveof no one后變成新主節點;

b)其它的節點成為新主節點的從節點,并從新節點復制數據;

c)需要人工干預,無法實現高可用。

1. 為什么要有哨兵機制?

原理:當主節點出現故障時,由Redis Sentinel自動完成故障發現和轉移,并通知應用方,實現高可用性。

其實整個過程只需要一個哨兵節點來完成,首先使用Raft算法(選舉算法)實現選舉機制,選出一個哨兵節點來完成轉移和通知

任務1:每個哨兵節點每10秒會向主節點和從節點發送info命令獲取最拓撲結構圖,哨兵配置時只要配置對主節點的監控即可,通過向主節點發送info,獲取從節點的信息,并當有新的從節點加入時可以馬上感知到

任務2:每個哨兵節點每隔2秒會向redis數據節點的指定頻道上發送該哨兵節點對于主節點的判斷以及當前哨兵節點的信息,同時每個哨兵節點也會訂閱該頻道,來了解其它哨兵節點的信息及對主節點的判斷,其實就是通過消息publish和subscribe來完成的

任務3:每隔1秒每個哨兵會向主節點、從節點及其余哨兵節點發送一次ping命令做一次心跳檢測,這個也是哨兵用來判斷節點是否正常的重要依據

客觀下線:當主觀下線的節點是主節點時,此時該哨兵3節點會通過指令sentinel is-masterdown-by-addr尋求其它哨兵節點對主節點的判斷,當超過quorum(選舉)個數,此時哨兵節點則認為該主節點確實有問題,這樣就客觀下線了,大部分哨兵節點都同意下線操作,也就說是客觀下線

a)每個在線的哨兵節點都可以成為領導者,當它確認(比如哨兵3)主節點下線時,會向其它哨兵發is-master-down-by-addr命令,征求判斷并要求將自己設置為領導者,由領導者處理故障轉移;

b)當其它哨兵收到此命令時,可以同意或者拒絕它成為領導者;

redis sentinel的機制與用法一: 買粉絲s://seg

相关栏目: