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