好飯不怕晚,扒一下Redis配置文件的底Ku
忙碌是一種幸福,讓我們沒時間體會痛苦;奔波是一種快樂,讓我們真實地感受生活;疲憊是一種享受,讓我們無暇空虛。這幾句話就能簡單概括我最近的工作和生活。
好多小伙伴都來私信“催更”,今天它來了!為了表達阿Q的歉意,特贈送「億級流量Java高并發(fā)與網(wǎng)絡編程實戰(zhàn)」一本,規(guī)則見文末。
在往期的文章中我們已經(jīng)對Redis的概念和基本命令進行了講解,今天我們來看下它的配置文件,Redis的配置文件在我們的開發(fā)和實際應用中起著非常重要的作用。
我們可以在安裝目錄下找到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 bytes
單位不區(qū)分大小寫,只支持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將偵聽服務器上所有可用網(wǎng)絡接口的連接。
可以使用“bind”配置指令,后跟一個或多個IP地址,只偵聽一個或多個選定接口?!咐纾骸筨ind 192.168.1.100 10.0.0.1
當設置多個bind地址后,Redis內(nèi)部會維護多個Socket,每個Socket用于一個network interface。
「protected-mode yes」:此選項默認開啟。
當Redis服務端未使用bind選項顯式指定要監(jiān)聽的network interface,并且未設置密碼,Redis服務端只會接受來自127.0.0.1和::1的客戶端以及Unix域的Socket進行連接。
- 「port 6379」:用于設置Redis監(jiān)聽的TCP端口,默認為6379,設置為0表示不監(jiān)聽TCP端口
- 「timeout 0」:空閑多少秒之后關(guān)閉連接,“0”表示不關(guān)閉
- 「tcp-keepalive 300」:單位為秒,如果為0,則不會進行keepalive檢測,建議設置成60
- 「tcp-backlog 511」:設置tcp的backlog,backlog其實是一個連接隊列。
backlog隊列總和 = 未完成三次握手隊列 + 已經(jīng)完成三次握手隊列
在高并發(fā)環(huán)境下需要一個高backlog值來避免慢客戶端連接問題。
「注意」:Linux內(nèi)核會將這個值減小到/proc/sys/net/core/somaxconn的值,所以需要確認增大somaxconn和tcp_max_syn_backlog兩個值來達到想要的效果。
GENERAL
daemonize
Redis采用的是單進程多線程的模式,daemonize是用來指定redis是否要用守護線程的方式啟動。默認情況下,Redis不作為守護進程運行。如果需要,請使用“是”。
- #daemonize no
- //當前界面將進入redis的命令行界面,
- exit強制退出或者關(guān)閉連接工具(putty,
- xshell等)都會導致redis進程退出。
- daemonize yes
- //代表開啟守護進程模式。在該模式下,
- redis 會在后臺運行,并將進程 pid 號寫入
- 至 redis.conf 選項 pidfile 設置的文件中,
- 此時 redis 將一直運行,除非手動kill該進程。
supervised no
當你通過upstart或者systemd運行Redis時,Redis可以和你的supervision tree進行交互,可選的選項為:
- no 無交互(默認)
- upstart 通過向Redis發(fā)送SIGSTOP信號來通知upstart
- systemd 通過向$NOTIFY_SOCKET寫入READY=1來通知systemd
- auto 通過是否設置了UPSTART_JOB或者NOTIFY_SOCKET環(huán)境變量來決定選項為 upstart或者systemd
pidfile
- pidfile /var/run/redis_6379.pid //進程pid文件
loglevel notice
指定服務器日志級別:從上到下依次減少
- debug:大量信息,對開發(fā)/測試有用
- verbose:許多很少有用的信息,但不像調(diào)試級別那樣混亂
- notice:適度冗長,可能是生產(chǎn)中需要的內(nèi)容
- warning:只記錄非常重要/關(guān)鍵的消息
logfile
- logfile ""
日志的名字,如果為空,redis給控制臺標準輸出,如果配置為守護進程方式運行,且設置了logfile為stdout,則日志將會發(fā)送給/dev/null
database
- databases 16
系統(tǒng)默認的庫16個,默認使用0庫
syslog
syslog-enabled no:是否把日志輸出到syslog中,系統(tǒng)日志默認是關(guān)著
syslog-ident redis:指定syslog里的日志標志設備以redis開頭
syslog-facility local0:指定syslog設備,值可以是USER或LOCAL0-LOCAL7,默認使用local0
Security (安全)
- requirepass 12345!@#
設置redis連接密碼,如果配置了連接密碼,客戶端在連接redis時需要通過Auth
如果設置完密碼,ping就失敗了,提示“NoAuth Authentication required”,加上auth + 密碼就通了。
「要求必須auth + password 在任何命令之前」
Redis一般做的是緩存,不是安全,而且系統(tǒng)會認為Linux是在安全的環(huán)境下。
CLIENTS
maxclients 10000:最大連接數(shù)
設置redis同時可以與多少個客戶端進行連接。默認情況下為10000個客戶端。
當你無法設置進程文件句柄限制時,redis會設置為當前的文件句柄限制值減去32,因為redis會為自身內(nèi)部處理邏輯留一些句柄出來。
如果達到了此限制,redis則會拒絕新的連接請求,并且向這些連接請求方發(fā)出「max number of clients reached」以作回應。
MEMORY MANAGEMENT
設置redis可以使用的內(nèi)存量。一旦到達內(nèi)存使用上限,redis將會試圖移除內(nèi)部數(shù)據(jù),移除規(guī)則可以通過maxmemory-policy來指定。
如果redis無法根據(jù)移除規(guī)則來移除內(nèi)存中的數(shù)據(jù),或者設置了「不允許移除」,那么redis則會針對那些需要申請內(nèi)存的指令返回錯誤信息,比如SET、LPUSH等。但是對于無內(nèi)存申請的指令,仍然會正常響應,比如GET等。
如果你的redis是主redis(說明你的redis有從redis),那么在設置內(nèi)存使用上限時,需要在系統(tǒng)中留出一些內(nèi)存空間給同步隊列緩存,只有在你設置的是“不移除”的情況下,才不用考慮這個因素。
最大緩存
- #maxmemory <bytes>
- maxmemory 128MB
設置maxmemory和相對應的回收策略算法,設置最好為物理內(nèi)存的「3/4」,或者比例更小,因為redis復制數(shù)據(jù)等其他服務時,也是需要緩存的。以防緩存數(shù)據(jù)過大致使redis崩潰,造成系統(tǒng)出錯不可用。
犧牲一部分緩存數(shù)據(jù),保存整體系統(tǒng)可用性。redis新的內(nèi)存機制,會把key放在內(nèi)存,value存放在swap區(qū)。
此配置需要和「maxmemory-policy」配合使用,當redis中內(nèi)存數(shù)據(jù)達到maxmemory時,觸發(fā)「清除策略」。在「內(nèi)存不足」時,任何write操作(比如set,lpush等)都會觸發(fā)「清除策略」的執(zhí)行。
實際環(huán)境
建議redis的所有物理機器的硬件配置保持一致(內(nèi)存一致),同時確保master/replica中「maxmemory policy」配置一致。
內(nèi)存滿時
如果還接收到set命令,redis將先嘗試剔除設置過expire信息的key,而不管該key的過期時間有沒有到達。
在刪除時,將按照過期時間進行刪除,最早將要被過期的key將最先被刪除。如果帶有expire信息的key都刪光了,內(nèi)存還不夠用,那么將返回錯誤。這樣,redis將不再接收寫請求,只接收get請求。
maxmemory的設置比較適合于把redis當作于類似memcached的緩存來使用。
最大緩存策略
「maxmemory-policy」:
- volatile-lru:使用LRU(最近最少使用)算法移除key,只對設置了過期時間的鍵
- allkeys-lru:使用LRU算法移除key(所有key)
- volatile-lfu:對過期鍵使用 LFU(最不經(jīng)常使用)近似算法
- allkeys-lfu:對所有鍵使用 LFU 近似算法
- volatile-random:在過期集合中移除隨機的key,只對設置了過期時間的鍵
- allkeys-random:移除隨機的key
- volatile-ttl:移除那些TTL值最小的key,即那些最近要過期的key
- noeviction:不進行移除。針對寫操作,只是返回錯誤信息(默認)(去公司觀察維度,不應該選擇這個)
LRU算法、LFU算法或者TTL算法都是不是很精確算法,而是個近似算法。
「使用策略規(guī)則:」
- 如果數(shù)據(jù)呈現(xiàn)冪律分布,也就是一部分數(shù)據(jù)訪問頻率高,一部分數(shù)據(jù)訪問頻率低,則使用allkeys-lru。
- 如果數(shù)據(jù)呈現(xiàn)平等分布,也就是所有的數(shù)據(jù)訪問頻率都相同,則使用allkeys-random。
樣本數(shù)量
設置樣本數(shù)量,上邊提到的算法都并非是精確的算法,而是估算值,所以你可以設置樣本的大小。
- maxmemory-samples 5
默認值是 5,也就是說Redis隨機挑出5個鍵,然后選出一個最符合條件的。對LRU來說5是比較合適的。10已經(jīng)很接近于真正的LRU,但會消耗更多的CPU。3會更快但沒有那么精確。
副本忽略最大內(nèi)存
- replica-ignore-maxmemory yes
從Redis 5開始,默認情況下,replica節(jié)點會忽略maxmemory設置(除非在發(fā)生failover后,此節(jié)點被提升為master節(jié)點)。
這意味著只有master才會執(zhí)行過期刪除策略,并且master在刪除鍵之后會對replica發(fā)送DEL命令。
這個行為保證了master和replicas的一致性,并且這通常也是你需要的,但是若你的replica節(jié)點是可寫的,或者你希望replica節(jié)點有不同的內(nèi)存配置,并且你確保所有到replica寫操作都冪等的,那么你可以修改這個默認的行為 (請確保你明白你在做什么)。
「注意」默認情況下replica節(jié)點不會執(zhí)行過期策略,它有可能使用了超過maxmemory設定的值的內(nèi)存。因此你需要監(jiān)控replicas節(jié)點所在的機器并且確保在master節(jié)點到達配置的maxmemory大小時,replicas節(jié)點不會超過物理內(nèi)存的大小。
今天我們就先說到這了,至于配置文件中關(guān)于主從復制和持久化部分我們將在后續(xù)的內(nèi)容進行講解。
本文轉(zhuǎn)載自微信公眾號「阿Q說代碼」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系阿Q說代碼公眾號。