扒一下Redis的配置檔案

Luson發表於2021-09-29

已經對Redis的概念和基本命令進行了講解,今天看下它的配置檔案,Redis的配置檔案在我們的開發和實際應用中起著非常重要的作用

我們可以在安裝目錄下找到redis.conf配置檔案,通過vim命令進行檢視,為了防止配置檔案進行更改,大家在使用前一定要備份一下!

本文Redis的版本為5.0.7

UNITS

1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 1024*1024 bytes
1g => 1000000000 bytes
1gb => 1024*1024*1024 byte

單位不區分大小寫,只支援bytes

INCLUDES

structs2配置檔案類似,可以通過includes包含。redis.conf可以作為總閘,包含其他。

include /path/to/local.conf
include /path/to/other.conf

MODULES

loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so

Redis可以通過loadmodule選項在啟動時載入模組,若服務端無法載入模組,服務端會停止。可以通過多個loadmodule選項載入多個模組。

NETWORK

  • bind 127.0.0.1:預設情況下,如果未指定“bind”配置指令,Redis將偵聽伺服器上所有可用網路介面的連線。

可以使用“bind”配置指令,後跟一個或多個IP地址,只偵聽一個或多個選定介面。 例如: bind 192.168.1.100 10.0.0.1

當設定多個bind地址後,Redis內部會維護多個Socket,每個Socket用於一個network interface

  • protected-mode yes:此選項預設開啟。

Redis服務端未使用bind選項顯式指定要監聽的network interface,並且未設定密碼,Redis服務端只會接受來自127.0.0.1::1的客戶端以及Unix域的Socket進行連線。

  • port 6379:用於設定Redis監聽的TCP埠,預設為6379,設定為0表示不監聽TCP
  • timeout 0:空閒多少秒之後關閉連線,“0”表示不關閉
  • tcp-keepalive 300:單位為秒,如果為0,則不會進行keepalive檢測,建議設定成60
  • tcp-backlog 511:設定tcpbacklogbacklog其實是一個連線佇列。

backlog佇列總和 = 未完成三次握手佇列 + 已經完成三次握手佇列

在高併發環境下需要一個高backlog值來避免慢客戶端連線問題。

注意Linux核心會將這個值減小到/proc/sys/net/core/somaxconn的值,所以需要確認增大somaxconntcp_max_syn_backlog兩個值來達到想要的效果

GENERAL

daemonize

Redis採用的是單程式多執行緒的模式,daemonize是用來指定redis是否要用守護執行緒的方式啟動。預設情況下,Redis不作為守護程式執行。如果需要,請使用“是”。

#daemonize no 
//當前介面將進入redis的命令列介面,
exit強制退出或者關閉連線工具(putty,
xshell等)都會導致redis程式退出。

daemonize yes     
//代表開啟守護程式模式。在該模式下,
redis 會在後臺執行,並將程式 pid 號寫入
至 redis.conf 選項 pidfile 設定的檔案中,
此時 redis 將一直執行,除非手動kill該程式。

supervised no

當你通過upstart或者systemd執行Redis時,Redis可以和你的supervision tree進行互動,可選的選項為:

  • no 無互動(預設)
  • upstart 通過向Redis傳送SIGSTOP訊號來通知upstart
  • systemd 通過向$NOTIFY_SOCKET寫入READY=1來通知systemd
  • auto 通過是否設定了UPSTART_JOB或者NOTIFY_SOCKET環境變數來決定選項為 upstart或者systemd

pidfile

pidfile /var/run/redis_6379.pid //程式pid檔案

loglevel notice

指定伺服器日誌級別:從上到下依次減少

  • debug:大量資訊,對開發/測試有用
  • verbose:許多很少有用的資訊,但不像除錯級別那樣混亂
  • notice:適度冗長,可能是生產中需要的內容
  • warning:只記錄非常重要/關鍵的訊息

logfile

logfile ""

日誌的名字,如果為空,redis給控制檯標準輸出,如果配置為守護程式方式執行,且設定了logfilestdout,則日誌將會傳送給/dev/null

database

databases 16

系統預設的庫16個,預設使用0庫

syslog

  • syslog-enabled no:是否把日誌輸出到syslog中,系統日誌預設是關著
  • syslog-ident redis:指定syslog裡的日誌標誌裝置以redis開頭
  • syslog-facility local0:指定syslog裝置,值可以是USERLOCAL0-LOCAL7,預設使用local0

Security (安全)

requirepass 12345!@#

設定redis連線密碼,如果配置了連線密碼,客戶端在連線redis時需要通過Auth <password> 命令提供密碼,預設關閉。

如果設定完密碼,ping就失敗了,提示“NoAuth Authentication required”,加上auth + 密碼就通了。

要求必須auth + password 在任何命令之前

Redis一般做的是快取,不是安全,而且系統會認為Linux是在安全的環境下。

CLIENTS

maxclients 10000:最大連線數

設定redis同時可以與多少個客戶端進行連線。預設情況下為10000個客戶端。

當你無法設定程式檔案控制程式碼限制時,redis會設定為當前的檔案控制程式碼限制值減去32,因為redis會為自身內部處理邏輯留一些控制程式碼出來。

如果達到了此限制,redis則會拒絕新的連線請求,並且向這些連線請求方發出max number of clients reached以作回應。

MEMORY MANAGEMENT

設定redis可以使用的記憶體量。一旦到達記憶體使用上限,redis將會試圖移除內部資料,移除規則可以通過maxmemory-policy來指定。

如果redis無法根據移除規則來移除記憶體中的資料,或者設定了不允許移除,那麼redis則會針對那些需要申請記憶體的指令返回錯誤資訊,比如SETLPUSH等。但是對於無記憶體申請的指令,仍然會正常響應,比如GET等。

如果你的redis是主redis(說明你的redis有從redis),那麼在設定記憶體使用上限時,需要在系統中留出一些記憶體空間給同步佇列快取,只有在你設定的是“不移除”的情況下,才不用考慮這個因素。

最大快取

#maxmemory <bytes>
maxmemory 128MB

設定maxmemory和相對應的回收策略演算法,設定最好為實體記憶體的3/4,或者比例更小,因為redis複製資料等其他服務時,也是需要快取的。以防快取資料過大致使redis崩潰,造成系統出錯不可用。

犧牲一部分快取資料,儲存整體系統可用性。redis新的記憶體機制,會把key放在記憶體,value存放在swap區。

此配置需要和maxmemory-policy配合使用,當redis中記憶體資料達到maxmemory時,觸發清除策略。在記憶體不足時,任何write操作(比如setlpush等)都會觸發清除策略的執行。

實際環境

建議redis的所有物理機器的硬體配置保持一致(記憶體一致),同時確保master/replicamaxmemory policy配置一致。

記憶體滿時

如果還接收到set命令,redis將先嚐試剔除設定過expire資訊的key,而不管該key的過期時間有沒有到達。

在刪除時,將按照過期時間進行刪除,最早將要被過期的key將最先被刪除。如果帶有expire資訊的key都刪光了,記憶體還不夠用,那麼將返回錯誤。這樣,redis將不再接收寫請求,只接收get請求。

maxmemory的設定比較適合於把redis當作於類似memcached的快取來使用。

MEMORY MANAGEMENT

最大快取策略

maxmemory-policy:

  • volatile-lru:使用LRU(最近最少使用)演算法移除key,只對設定了過期時間的鍵
  • allkeys-lru:使用LRU演算法移除key(所有key
  • volatile-lfu:對過期鍵使用 LFU(最不經常使用)近似演算法
  • allkeys-lfu:對所有鍵使用 LFU 近似演算法
  • volatile-random:在過期集合中移除隨機的key,只對設定了過期時間的鍵
  • allkeys-random:移除隨機的key
  • volatile-ttl:移除那些TTL值最小的key,即那些最近要過期的key
  • noeviction:不進行移除。針對寫操作,只是返回錯誤資訊(預設)(去公司觀察維度,不應該選擇這個)

LRU演算法、LFU演算法或者TTL演算法都是不是很精確演算法,而是個近似演算法。

使用策略規則:

  1. 如果資料呈現冪律分佈,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用allkeys-lru
  2. 如果資料呈現平等分佈,也就是所有的資料訪問頻率都相同,則使用allkeys-random

樣本數量

設定樣本數量,上邊提到的演算法都並非是精確的演算法,而是估算值,所以你可以設定樣本的大小。

maxmemory-samples 5

預設值是 5,也就是說Redis隨機挑出5個鍵,然後選出一個最符合條件的。對LRU來說5是比較合適的。10已經很接近於真正的LRU,但會消耗更多的CPU。3會更快但沒有那麼精確。

副本忽略最大記憶體

replica-ignore-maxmemory yes

Redis 5開始,預設情況下,replica節點會忽略maxmemory設定(除非在發生failover後,此節點被提升為master節點)。

這意味著只有master才會執行過期刪除策略,並且master在刪除鍵之後會對replica傳送DEL命令。

這個行為保證了masterreplicas的一致性,並且這通常也是你需要的,但是若你的replica節點是可寫的,或者你希望replica節點有不同的記憶體配置,並且你確保所有到replica寫操作都冪等的,那麼你可以修改這個預設的行為 (請確保你明白你在做什麼)。

注意 預設情況下replica節點不會執行過期策略,它有可能使用了超過maxmemory設定的值的記憶體。因此你需要監控replicas節點所在的機器並且確保在master節點到達配置的maxmemory大小時,replicas節點不會超過實體記憶體的大小。

後續:主從複製和持久化部分

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章