首頁  >  文章  >  資料庫  >  Redis緩衝區溢位怎麼解決

Redis緩衝區溢位怎麼解決

王林
王林轉載
2023-06-03 20:13:411081瀏覽

    緩衝區(buffer),是記憶體空間的一部份。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的數據,這部分預留的空間就叫做緩衝區。

    一、Redis緩衝區溢位影響

    在Redis中,主要有三個場景用到了緩衝區的概念。

    在客戶端和伺服器端之間進行通訊時,用來暫存客戶端發送的命令數據,或者是伺服器端返回給客戶端的數據結果在主從節點間進行數據同步時,Redis使用緩衝區來暫存主節點接收的寫入命令和資料在Redis進行AOF持久化的時候Redis為了避免頻繁寫磁碟同樣用到了緩衝區的概念

    緩衝區概念最初是作業系統為了緩和CPU 與I/O 裝置速度不符的矛盾,提高CPU 和I/O 裝置的並行性而引入的。

    對於高速設備與低速設備的不匹配,勢必會讓高速設備花時間等待低速設備。有了緩衝區的概念就可以很好的解決這個問題。緩衝區也是生產者消費者模式的重要展現。

    Redis緩衝區溢位怎麼解決

    1、緩衝區溢位導致網路連線關閉

    如果qubf-free 耗盡,就會造成客戶端輸入緩衝區溢出,Redis 的處理方法就是把客戶端連線關閉,導致的結果就是業務程序無法進行資料存取。

    2、緩衝區溢位導致命令資料遺失或崩潰

    通常情況下,會有很多的客戶端連接,當客戶端連接佔用的記憶體總量,超過了Redis 的maxmemory配置時,就會觸發Redis 進行資料淘汰,影響業務程式的存取效能。

    甚至多個客戶端會導致 Redis 記憶體佔用過大,也會導致記憶體溢位問題,進而造成 Redis 崩潰。

    二、客戶端緩衝區

    客戶端緩衝區又有兩個,輸入緩衝區和輸出緩衝區,都是為了解決客戶端和伺服器端的請求發送和處理速度不匹配所設定的。

    Redis緩衝區溢位怎麼解決

    輸入緩衝區暫存的是客戶端發送的命令,其常見的溢出原因有兩個:

    寫入了BigKey,如一次性寫入了百萬級別的哈希或集合數據,超過了緩衝區的大小服務端處理請求的速度過慢導致阻塞,無法及時處理請求,使得客戶端發送的請求在緩衝區內越積越多。

    輸出緩衝區暫存的是 Redis 主執行緒要傳回給客戶端的資料。

    這個數據,既有簡單且大小固定的OK 響應(例如,執行SET 命令)或報錯信息,也有大小不固定的、包含具體數據的執行結果(例如,執行HGET 命令)

    輸出緩衝區常見的溢出原因有三種:

    傳回BigKey的大量結果執行了某些不合理的命令緩衝區大小設定不合理

    從輸入和輸出緩衝區域常見造成溢出的原因來看,BigKey是最可能導致溢出的原因,因此我們應該盡量避免使用BigKey。

    對於輸入緩衝區,因為沒有辦法改變其大小(預設每個客戶端1G),我們只能透過控制指令的發送和處理速度入手,盡量避免阻塞。

    對於輸出緩衝區則要避免一些傳回大量結果的指令的使用如KEYS,MONITOR等,同時可以透過調整輸出緩衝區的大小來避免溢位。

    三、複製緩衝區

    複製緩衝區是用於Redis主從節點之間複製時使用的。由於主從節點間的資料複製包括全量複製和增量複製兩種。因此複製緩衝區也分為複製緩衝區和複製積壓緩衝區兩種。

    1、複製緩衝區

    在全量複製過程中,主節點在傳送 RDB 檔案的同時,主節點會繼續接收客戶端發送的寫入命令請求。這些寫入命令會先被保存在複製緩衝區中,當 RDB 檔案傳輸完成後,才會傳送給從節點並執行。為了確保主從節點之間的資料同步,每個從節點在主節點上都有維護一個複製緩衝區。

    Redis緩衝區溢位怎麼解決

    對於複製緩衝區,如果主庫傳輸RDB 檔案以及從庫載入RDB 檔案耗時長,同時主庫接收的寫入命令操作較多,就會導致複製緩衝區被寫滿而溢出。

    想要避免複製緩衝區溢出,一方面我們可以控制主節點保存的資料量大小,這樣可以讓RDB檔案的傳輸以及從庫加載時間變快,以避免複製緩衝區累積過多命令。

    也可以根據主節點的資料量大小、主節點的寫入負載壓力和主節點本身的記憶體大小來更合理的設定複製緩衝區的大小來避免溢出,此外,由於主節點會為每一個從節點設定一個複製緩衝區,如果叢集中的從節點數非常多的話,主節點的記憶體開銷就會非常大,因此我們應該盡量避免一個主節點有過多的從節點。

    2、複製積壓緩衝區

    在增量複製過程中,當主節點與從節點進行常規同步時,寫入指令會被暫存在複製緩衝區中。如果從節點和主節點間發生了網路斷連,等從節點再次連接後,可以從複製積壓緩衝區中同步尚未複製的命令操作。

    Redis緩衝區溢位怎麼解決

    要注意的是複製積壓緩衝區是一個大小有限的環形緩衝區。

    當主節點把複製積壓緩衝區寫滿後,就會覆寫緩衝區中的舊指令資料。此時會造成主從節點的資料不一致。

    針對這個問題,一般的因應的方法是調大複製積壓緩衝區的大小,這個大小的計算方式一般可以使用

    缓冲区大小=(主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小)* 2

    如果如果並發請求量非常大,調整緩衝區大小的方式還不能解決,那麼可以考慮使用切片集群的方式解決

    四、AOF緩衝區

    AOF緩衝區是Redis在AOF持久化的所設定的緩衝區, AOF緩衝區也有兩種AOF緩衝區和AOF重寫緩衝區。

    1、AOF緩衝區

    我們都知道,即​​使是固態硬碟,它的讀寫速度也是與記憶體的讀寫速度相差很多的。 AOF緩衝區就主要是Redis用來解決主行程執行指令速度與磁碟寫入速度不同步所設定的,透過AOF緩衝區可以有效地避免頻繁地對硬碟進行讀寫,進而提升效能。在進行AOF持久化時,Redis會先將指令寫入AOF緩衝區,接著再依照回寫策略將其寫入硬碟AOF檔。

    Redis緩衝區溢位怎麼解決

    AOF緩衝區的溢位可能與磁碟寫入速度有關係,也可能與AOF回寫策略有關係,當大量指令積壓在AOF緩衝區,超過其設定閾值之後,就會導致緩衝區溢出,想要避免這個問題,我們可以透過調整回寫策略,或是調整AOF緩衝區大小的方式來解決。

    2、AOF重寫緩衝區

    AOF重寫緩衝區是Redis在子進程進行AOF重寫的時候,父進程接受了新的命令,此時會把指令寫入AOF重寫緩衝區,等到子程序重寫完成後,把AOF重寫緩衝區指令追加到新的AOF檔。

    Redis緩衝區溢位怎麼解決

     AOF重寫緩衝區的溢位與AOF重寫期間主程序所處理的指令數有關係,當AOF重寫期間Redis主程序處理了大量的指令,這些指令都會寫入AOF重寫緩衝區,當超過設定閾值之後,就會導致溢位。

    避免AOF重寫緩衝區的溢出我們也可以透過調整AOF重寫緩衝區的大小來解決。

    以上是Redis緩衝區溢位怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除