在高可用這條路上你知道Redis有多努力嗎

2021-10-17 12:55:01 字數 2685 閱讀 3461

自我介紹

我, redis ,記憶體資料庫,有著比 memcached 更強大的功能。現在已經是這個領域的頭把金交椅。

這裡所說的常規資料庫是指基於硬碟讀寫的資料庫,比如 oracle , mysql , mongodb 等。基於硬碟讀寫的資料庫可以有效的保證資料的高可用性。這裡的高可用性指的是作業系統或者資料庫崩潰之後,不會造成資料丟失,這也是對資料庫的最基本要求。

基於硬碟讀寫的資料庫雖然可以保證資料的高可用性,但是讀寫速度比較慢,這也是磁碟 i/o的天然屬性。雖然切換固態硬碟之後,效能會有顯著提公升,但是經濟成本也會隨之公升高,而且固態硬碟使用壽命偏低。為了解決這個問題, redis 做出了改變。 redis 是基於記憶體進行讀寫的資料庫,把資料全部儲存在記憶體中,這樣就可以大幅提高資料的讀寫速度。

說到記憶體資料庫,不得不提 memcached , memcached 比 redis 出現的更早,也是基於記憶體進行資料儲存。在十幾年前,大家通用的快取方案就是 memcached 。 memcached 支援 key-value形式的資料儲存,但是只支援 string 型別的資料結構,不支援更複雜的資料結構,也不支援集群。

作業系統或者 memcached 重啟後資料就會丟失。這也是基於記憶體進行資料儲存的最大缺點。

redis 繼承了 memcached 所有的優點,並改進了很多缺點。比如 redis 也是基於記憶體進行資料操作,並且支援更多的資料型別,比如 list , set 等。最最主要的,也是這篇文章的重點, redis 支援資料高可用,也就是說 redis 或者作業系統重啟之後,資料不會丟失。

redis 在高可用這條路上所付出的努力,就像乙個不斷努力進取的勵志青年。

眾所周知,放在記憶體中的資料是不穩定的。為了解決因為系統或者 redis 重啟造成的資料丟失問題。 redis 提供了兩種資料持久化方案。

快照備份把 redis 資料庫中的資料,定時備份到磁碟中。當資料庫重啟的時候,可以通過定時備份到磁碟檔案中的快照檔案進行資料恢復。這樣 redis 既保證了資料的讀寫速度,又保證了資料的高可用。

aof 同步寫快照備份有個缺點,就是會丟失一部分資料。比如在新的快照檔案生成之前,系統發生了問題,那麼最近一次快照之後的資料將丟失。 redis 為了解決這個問題,提出了 aof 解決方案。所謂的 aof 就是將每次寫入資料的命令都以追加的方式記錄到檔案中。這樣在系統出問題的時候,只要將這個檔案中的命令全部重放一下就ok了。這樣就可以做到不丟數了。

但是如果資料寫入操作太多的話,會造成 aof 檔案過大,為了解決這個問題 redis 提供了 aof 自動壓縮功能,以及去重功能,這樣可以達到對檔案體積大小進行優化的目的。

上面的兩種持久化方案,對於單節點 redis 來說,基本已經夠用了。但是我們的系統總是越做越大,要求越來越多。有的時候單節點 redis 往往撐不住系統的訪問量。這種情況下 redis 提供了主從模式。

所謂的主從模式就是乙個主節點,負責讀和寫,乙個從節點,負責將主節點的資料同步到從節點,這樣主從節點資訊就是一致的。

注意:從節點不支援寫操作,但是可以支援讀操作。當其中任意乙個點掛掉之後,資料不會損失。而且可以將讀的壓力分散到多個節點,支援更大的訪問量。

對於主從模式,這裡有個最大的痛點。當主節點掛掉後,從節點是不會自動公升級為主節點的。也就是負責往 redis 寫入的程式會報錯,但是讀操作不會有問題。這一點不太符合高可用的要求。為了解決發生故障,主節點自動切換的問題, redis 又給大家提供了哨兵模式。

所謂的哨兵模式就是,提供三個哨兵節點(同樣是 redis 例項,只不過不儲存資料),來監控主從模式下的所有 redis 節點(真正儲存資料的節點)。客戶端程式通過哨兵節點獲取主節點資訊。當主節點掛掉後,哨兵節點會自動將其中乙個從節點公升級為主節點,提供給客戶端程式執行寫入操作。當發生故障的主節點恢復後,會自動變為新的主節點的從節點。

大家可能發現了,無論是主從複製模式,還是哨兵模式都沒有解決分布式寫的問題,也就是說到目前為止,所有的方案都只能往乙個節點寫資料,資料儲存能力受單節點限制。哨兵模式僅僅解決了主從複製模式下,發生故障後不能自動切換的問題。

為了解決分布式寫的問題, redis 提供了集群功能。

redis 集群可以實現分布式寫。集群中的節點分為主節點和從節點。主節點負責資料的讀寫以及集群資訊的維護,從節點負責同步主節點的資訊。

redis 集群利用資料分片的概念,將要操作的 key 進行雜湊計算,根據得到的結果決定這個 key 應該儲存到那個主節點。這樣就可以利用多個主節點進行分布式寫操作。進行讀操作的時候也會先計算 key 的雜湊值,然後找到對應的主節點。

很遺憾的是,集群模式也不是百分百完美,比如 key 的批量操作會受限制,只有當操作的 key都位於乙個槽位時才能進行操作。 還有 keys 操作,只能在任一節點發生,不能 跨 節點。 其實這些所有缺點,都是因為分布式寫造成的,因為你把資料分別存到了不同的 redis 節點。

redis 由單節點的持久化,到主從複製模式,再到哨兵模式,再到最後的集群模式。一路打怪公升級,不斷的完善自己。

在高可用這條路上你知道Redis有多努力嗎

自我介紹 我,redis 記憶體資料庫,有著比 memcached 更強大的功能。現在已經是這個領域的頭把金交椅。這裡所說的常規資料庫是指基於硬碟讀寫的資料庫,比如 oracle mysql mongodb 等。基於硬碟讀寫的資料庫可以有效的保證資料的高可用性。這裡的高可用性指的是作業系統或者資料庫...

在高可用這條路上你知道Redis有多努力嗎

自我介紹 我,redis 記憶體資料庫,有著比 memcached 更強大的功能。現在已經是這個領域的頭把金交椅。這裡所說的常規資料庫是指基於硬碟讀寫的資料庫,比如 oracle mysql mongodb 等。基於硬碟讀寫的資料庫可以有效的保證資料的高可用性。這裡的高可用性指的是作業系統或者資料庫...

程式設計師在寫作這條路上到底能走多遠?

楊過這輩子什麼時候最痛苦?被郭襄她姐砍掉了乙隻胳膊的時候,那時他身中情花之毒,活不了多久了,他最愛的姑姑又不辭而別 在這個時候,他想到的就是乙個人偷偷地離開,做好了告別這個世界的準備。再沒有比這個更痛苦的了。每到這個痛苦的時候,我就會不由自主地想起村上春樹在 且聽風吟 中寫到的那段話 對我來說,寫文...