最近對redis使用較為頻繁,各項配置已經不太熟練,結合各位大佬分享的配置,整理一篇筆記,方便查詢。
1.基礎參數配置
# 是否在后臺執行,yes:后臺運行;no:不是后臺運行(老版本默認) daemonize yes # 是否開啟保護模式(默認開啟) # 要是配置里沒有指定bind和密碼。開啟該參數后,redis只會本地進行訪問,拒絕外部訪問。要是開啟了密碼 和bind,可以開啟。否 則最好關閉,設置為no。 protected-mode yes # redis的進程文件 pidfile /var/run/redis/redis-server.pid # redis監聽的端口號 port 6379 # 此參數確定了TCP連接中已完成隊列的長度(默認511) tcp-backlog 511 # 指定redis只接收指定IP地址的請求 # 如需處理所有請求(遠程訪問) bind 0.0.0.0 bind 127.0.0.1 # 配置unix socket來讓redis支持監聽本地連接。 unixsocket /var/run/redis/redis.sock # 配置unix socket使用文件的權限 unixsocketperm 700 # 此參數為設置客戶端空閑超過timeout,服務端會斷開連接,為0則服務端不會主動斷開連接,不能小于0。 timeout 0 # tcp keepalive參數。如果設置不為0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有兩個好處:檢測掛掉的對端。降低中間設備出問題而導致網絡看似連接卻已經與對端端口的問題。在linux內核中,設置了keepalive,redis會定時給對端發送ack。檢測到對端關閉需要兩倍的設置值。 tcp-keepalive 0 # 指定了服務端日志的級別 # debug(適合開發、測試環境) # verbose(較少于debug級別 適合開發、測試環境) # notice(適合生產環境) # warn(只有非常重要的信息) loglevel notice # 指定了記錄日志的文件。空字符串的話,日志會打印到標準輸出設備。后臺運行的redis標準輸出是/dev/null。 logfile /var/log/redis/redis-server.log # 是否打開記錄syslog功能 # syslog-enabled no # syslog的標識符 # syslog-ident redis # 日志的來源、設備 # syslog-facility local0 # 數據庫的數量(默認16) databases 16
2.持久化配置
# 注釋掉"save"這一行配置項就可以讓保存數據庫功能失效 # 設置redis進行數據庫鏡像的頻率。 # 900秒(15分鐘)內至少1個key值改變(則進行數據庫保存--持久化) # 300秒(5分鐘)內至少10個key值改變(則進行數據庫保存--持久化) # 60秒(1分鐘)內至少10000個key值改變(則進行數據庫保存--持久化) save 900 1 save 300 10 save 60 10000 # 當rdb持久化出現錯誤后,是否依然進行繼續進行工作, # yes:不能進行工作, # no:可以繼續進行工作, # 可以通過info中的rdb_last_bgsave_status了解RDB持久化是否有錯誤 stop-writes-on-bgsave-error yes # 使用壓縮rdb文件 # yes:壓縮,但是需要一些cpu的消耗 # no:不壓縮,需要更多的磁盤空間 rdbcompression yes # 是否校驗rdb文件 rdbchecksum yes # rdb文件的名稱 dbfilename dump.rdb # 數據目錄,數據庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄 dir /var/lib/redis # 默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。但是redis如果中途宕機,會導致可能有幾分鐘的數據丟失,根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性。Redis會把每次寫入的數據在接收后都寫入 appendonly.aof 文件,每次啟動時Redis都會先把這個文件的數據讀入內存里,先忽略RDB文件。 appendonly no # aof文件名 appendfilename "appendonly.aof" # aof持久化策略的配置 # no表示不執行fsync,由操作系統保證數據同步到磁盤,速度最快。 # always表示每次寫入都執行fsync,以保證數據同步到磁盤。 # everysec表示每秒執行一次fsync,可能會導致丟失這1s數據。 appendfsync everysec # 在aof重寫或者寫入rdb文件的時候,會執行大量IO,此時對于everysec和always的aof模式來說,執行fsync會造成阻塞過長時間,no-appendfsync-on-rewrite字段設置為默認設置為no。如果對延遲要求很高的應用,這個字段可以設置為yes,否則還是設置為no,這樣對持久化特性來說這是更安全的選擇。設置為yes表示rewrite期間對新寫操作不fsync,暫時存在內存中,等rewrite完成后再寫入,默認為no,建議yes。Linux的默認fsync策略是30秒。可能丟失30秒數據。 no-appendfsync-on-rewrite no # aof自動重寫配置。當目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進行重寫,即當aof文件增長到一定大小的時候Redis能夠調用bgrewriteaof對日志文件進行重寫。當前AOF文件大小是上次日志重寫得到AOF文件大小的二倍(設置為100)時,自動啟動新的日志重寫過程。 auto-aof-rewrite-percentage 100 # 設置允許重寫的最小aof文件大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫 auto-aof-rewrite-min-size 64mb # aof文件可能在尾部是不完整的,當redis啟動的時候,aof文件的數據被載入內存。重啟可能發生在redis所在的主機操作系統宕機后,尤其在ext4文件系統沒有加上data=ordered選項(redis宕機或者異常終止不會造成尾部不完整現象。)出現這種現象,可以選擇讓redis退出,或者導入盡可能多的數據。如果選擇的是yes,當截斷的aof文件被導入的時候,會自動發布一個log給客戶端然后load。如果是no,用戶必須手動redis-check-aof修復AOF文件才可以。 aof-load-truncated yes
3.主從配置
# 復制選項,slave復制對應的master slaveof <masterip> <masterport> # 如果master設置了requirepass,那么slave要連上master,需要有master的密碼才行。masterauth就是用來配置master的密碼,這樣可以在連上master后進行認證 masterauth <master-password> # 當slave同master失去連接或者復制正在進行,slave的運行方式 # 1.如果slave-serve-stale-data設置為yes(默認設置),slave會繼續響應客戶端的請求。 # 2.如果slave-serve-stale-data設置為no,除去INFO和SLAVOF命令之外的任何請求都會返回一個錯誤”SYNC with master in progress”。 slave-serve-stale-data yes # slave服務器讀寫配置 # 默認情況下是只讀的(yes) # 修改成no,可讀可寫(不建議) slave-read-only yes # 是否使用socket方式復制數據。目前redis復制提供兩種方式,disk和socket。如果新的slave連上來或者重連的slave無法部分同步,就會執行全量同步,master會生成rdb文件。有2種方式:disk方式是master創建一個新的進程把rdb文件保存到磁盤,再把磁盤上的rdb文件傳遞給slave。socket是master創建一個新的進程,直接把rdb文件以socket的方式發給slave。disk方式的時候,當一個rdb保存的過程中,多個slave都能共享這個rdb文件。socket的方式就的一個個slave順序復制。在磁盤速度緩慢,網速快的情況下推薦用socket方式。 repl-diskless-sync no # diskless復制的延遲時間,防止設置為0。一旦復制開始,節點不會再接收新slave的復制請求直到下一個rdb傳輸。所以最好等待一段時間,等更多的slave連上來。 repl-diskless-sync-delay 5 # slave根據指定的時間間隔向服務器發送ping請求 # 時間間隔可以通過 repl_ping_slave_period 來設置,默認10秒。 repl-ping-slave-period 10 # 復制連接超時時間。master和slave都有超時時間的設置。master檢測到slave上次發送的時間超過repl-timeout,即認為slave離線,清除該slave信息。slave檢測到上次和master交互的時間超過repl-timeout,則認為master離線。需要注意的是repl-timeout需要設置一個比repl-ping-slave-period更大的值,不然會經常檢測到超時。 repl-timeout 60 # 是否禁止復制tcp鏈接的tcp nodelay參數,可傳遞yes或者no。默認是no,即使用tcp nodelay。如果master設置了yes來禁止tcp nodelay設置,在把數據復制給slave的時候,會減少包的數量和更小的網絡帶寬。但是這也可能帶來數據的延遲。默認我們推薦更小的延遲,但是在數據量傳輸很大的場景下,建議選擇yes。 repl-disable-tcp-nodelay no # 復制緩沖區大小,這是一個環形復制緩沖區,用來保存最新復制的命令。這樣在slave離線的時候,不需要完全復制master的數據,如果可以執行部分同步,只需要把緩沖區的部分數據復制給slave,就能恢復正常復制狀態。緩沖區的大小越大,slave離線的時間可以更長,復制緩沖區只有在有slave連接的時候才分配內存。沒有slave的一段時間,內存會被釋放出來,默認1m。 repl-backlog-size 5mb # master沒有slave一段時間會釋放復制緩沖區的內存,repl-backlog-ttl用來設置該時間長度。單位為秒。 repl-backlog-ttl 3600 # 當master不可用,Sentinel會根據slave的優先級選舉一個master。最低的優先級的slave,當選master。而配置成0,永遠不會被選舉。 slave-priority 100 # redis提供了可以讓master停止寫入的方式,如果配置了min-slaves-to-write,健康的slave的個數小于N,mater就禁止寫入。master最少得有多少個健康的slave存活才能執行寫命令。這個配置雖然不能保證N個slave都一定能接收到master的寫操作,但是能避免沒有足夠健康的slave的時候,master不能寫入來避免數據丟失。設置為0是關閉該功能。 # min-slaves-to-write 3 # 延遲小于min-slaves-max-lag秒的slave才認為是健康的slave。 min-slaves-max-lag 10 # 設置1或另一個設置為0禁用這個特性。 min-slaves-max-lag is set to 10.
4.安全配置
# 配置redis連接密碼(默認未啟用,建議啟用) requirepass foobared # 把危險的命令給修改成其他名稱。比如CONFIG命令可以重命名為一個很難被猜到的命令,這樣外部連接不能使用,而服務器內部連接工具還能繼續使用。 rename-command CONFIG cmd # 設置成一個空的值,可以禁止一個命令 rename-command CONFIG ""
5.連接配置
# 設置能連上redis的最大客戶端連接數量。默認是10000個客戶端連接。由于redis不區分連接是客戶端連接還是內部打開文件或者和slave連接等,所以maxclients最小建議設置到32。如果超過了maxclients,redis會給新的連接發送’max number of clients reached’,并關閉連接。 maxclients 10000 # redis配置的最大內存容量。當內存滿了,需要配合maxmemory-policy策略進行處理。注意slave的輸出緩沖區是不計算在maxmemory內的。所以為了防止主機內存使用完,建議設置的maxmemory需要更小一些。 maxmemory <bytes> # 內存容量超過maxmemory后的處理策略。 # volatile-lru:利用LRU算法移除設置過過期時間的key。 # volatile-random:隨機移除設置過過期時間的key。 # volatile-ttl:移除即將過期的key,根據最近過期時間來刪除(輔以TTL) # allkeys-lru:利用LRU算法移除任何key。 # allkeys-random:隨機移除任何key。 # noeviction:不移除任何key,只是返回一個寫錯誤。 # 上面的這些驅逐策略,如果redis沒有合適的key驅逐,對于寫命令,還是會返回錯誤。redis將不再接收寫請求,只接收get請求。 maxmemory-policy noeviction # lru檢測的樣本數。使用lru或者ttl淘汰算法,從需要淘汰的列表中隨機選擇sample個key,選出閑置時間最長的key移除。 maxmemory-samples 5 # 如果達到最大時間限制(毫秒),redis會記個log,然后返回error。當一個腳本超過了最大時限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個可以殺沒有調write命令的東西。要是已經調用了write,只能用第二個命令殺。 lua-time-limit 5000
6.集群配置
# 集群開關,默認是不開啟集群模式。 cluster-enabled yes # 集群配置文件的名稱,每個節點都有一個集群相關的配置文件,持久化保存集群的信息。這個文件并不需要手動配置,這個配置文件有Redis生成并更新,每個Redis集群節點需要一個單獨的配置文件,請確保與實例運行的系統中配置文件名稱不沖突 # cluster-config-file nodes-a.conf # 節點互連超時的閥值。集群節點超時毫秒數 # cluster-node-timeout 15000 # 在進行故障轉移的時候,全部slave都會請求申請為master,但是有些slave可能與master斷開連接一段時間了,導致數據過于陳舊,這樣的slave不應該被提升為master。該參數就是用來判斷slave節點與master斷線的時間是否過長。判斷方法是: # 比較slave斷開連接的時間和(node-timeout * slave-validity-factor) +repl-ping-slave-period # 如果節點超時時間為三十秒, 并且slave-validity-factor為10,假設默認的repl-ping-slave-period是10秒,即如果超過310秒slave將不會嘗試進行故障轉移 cluster-slave-validity-factor 10 # master的slave數量大于該值,slave才能遷移到其他孤立master上,如這個參數若被設為2,那么只有當一個主節點擁有2 個可工作的從節點時,它的一個從節點會嘗試遷移。 cluster-migration-barrier 1 # 默認情況下,集群全部的slot有節點負責,集群狀態才為ok,才能提供服務。設置為no,可以在slot沒有全部分配的時候提供服務。不建議打開該配置,這樣會造成分區的時候,小分區的master一直在接受寫請求,而造成很長時間數據不一致。 cluster-require-full-coverage yes
7.慢查詢日志
# slog log是用來記錄redis運行中執行比較慢的命令耗時。當命令的執行超過了指定時間,就記錄在slow log中,slog log保存在內存中,所以沒有IO操作。 # 執行時間比slowlog-log-slower-than大的請求記錄到slowlog里面,單位是微秒,所以1000000就是1秒。注意,負數時間會禁用慢查詢日志,而0則會強制記錄所有命令。 slowlog-log-slower-than 10000 # 慢查詢日志長度。當一個新的命令被寫進日志的時候,最老的那個記錄會被刪掉。這個長度沒有限制。只要有足夠的內存就行。你可以通過 SLOWLOG RESET 來釋放內存。 slowlog-max-len 128 # 延遲監控功能是用來監控redis中執行比較緩慢的一些操作,用LATENCY打印redis實例在跑命令時的耗時圖表。只記錄大于等于下邊設置的值的操作。0的話,就是關閉監視。默認延遲監控功能是關閉的,如果你需要打開,也可以通過CONFIG SET命令動態設置 latency-monitor-threshold 0
8.事件通知配置
# 鍵空間通知使得客戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 數據集的事件。因為開啟鍵空間通知功能需要消耗一些 CPU ,所以在默認配置下,該功能處于關閉狀態。 # notify-keyspace-events的參數可以是以下字符的任意組合,它指定了服務器該發送哪些類型的通知: ##K 鍵空間通知,所有通知以 __keyspace@__ 為前綴 ##E 鍵事件通知,所有通知以 __keyevent@__ 為前綴 ##g DEL 、 EXPIRE 、 RENAME 等類型無關的通用命令的通知 ##$ 字符串命令的通知 ##l 列表命令的通知 ##s 集合命令的通知 ##h 哈希命令的通知 ##z 有序集合命令的通知 ##x 過期事件:每當有過期鍵被刪除時發送 ##e 驅逐(evict)事件:每當有鍵因為 maxmemory 政策而被刪除時發送 ##A 參數 g$lshzxe 的別名 # 輸入的參數中至少要有一個 K 或者 E,否則的話,不管其余的參數是什么,都不會有任何 通知被分發。 notify-keyspace-events ""
9.高級配置
# 數據量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hash hash-max-ziplist-entries 512 # value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash hash-max-ziplist-value 64 # -5:最大大小:64 KB<--不建議用于正常工作負載 # -4:最大大小:32 KB<--不推薦 # -3:最大大小:16 KB<--可能不推薦 # -2:最大大小:8kb<--良好 # -1:最大大小:4kb<--良好 list-max-ziplist-size -2 # 0:禁用所有列表壓縮 # 1:深度1表示“在列表中的1個節點之后才開始壓縮, # 從頭部或尾部 # 所以:【head】->node->node->…->node->【tail】 # [頭部],[尾部]將始終未壓縮;內部節點將壓縮。 # 2:[頭部]->[下一步]->節點->節點->…->節點->[上一步]->[尾部] # 2這里的意思是:不要壓縮頭部或頭部->下一個或尾部->上一個或尾部, # 但是壓縮它們之間的所有節點。 # 3:[頭部]->[下一步]->[下一步]->節點->節點->…->節點->[上一步]->[上一步]->[尾部] list-compress-depth 0 # 數據量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set set-max-intset-entries 512 # 數據量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset zset-max-ziplist-entries 128 # value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset zset-max-ziplist-value 64 # value大小小于等于hll-sparse-max-bytes使用稀疏數據結構(sparse),大于hll-sparse-max-bytes使用稠密的數據結構(dense)。一個比16000大的value是幾乎沒用的,建議的value大概為3000。如果對CPU要求不高,對空間要求較高的,建議設置到10000左右 hll-sparse-max-bytes 3000 # 宏觀節點的最大流/項目的大小。在流數據結構是一個基數 # 樹節點編碼在這項大的多。利用這個配置它是如何可能#大節點配置是單字節和 # 最大項目數,這可能包含了在切換到新節點的時候 # appending新的流條目。如果任何以下設置來設置 # ignored極限是零,例如,操作系統,它有可能只是一集通過設置限制最大#紀錄到最大字節0和最大輸入到所需的值 stream-node-max-bytes 4096 stream-node-max-entries 100 # Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低內存的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這么嚴格的實時性要求,可以設置為yes,以便能夠盡可能快的釋放內存 activerehashing yes # 對客戶端輸出緩沖進行限制可以強迫那些不從服務器讀取數據的客戶端斷開連接,用來強制關閉傳輸緩慢的客戶端。 # 對于normal client,第一個0表示取消hardlimit,第二個0和第三個0表示取消soft limit,normal client默認取消限制,因為如果沒有尋問,他們是不會接收數據 client-output-buffer-limit normal 0 0 0 # 對于slave client和MONITERclient,如果client-output-buffer一旦超過256mb,又或者超過64mb持續60秒,那么服務器就會立即斷開客戶端連接 client-output-buffer-limit replica 256mb 64mb 60 # 對于pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續60秒,那么服務器就會立即斷開客戶端連接 client-output-buffer-limit pubsub 32mb 8mb 60 # 這是客戶端查詢的緩存極限值大小 client-query-buffer-limit 1gb # 在redis協議中,批量請求,即表示單個字符串,通常限制為512MB。但是您可以更改此限制。 # proto-max-bulk-len 512mb # redis執行任務的頻率為1s除以hz hz 10 # 當啟用動態赫茲時,實際配置的赫茲將用作作為基線,但實際配置的赫茲值的倍數 # 在連接更多客戶端后根據需要使用。這樣一個閑置的實例將占用很少的CPU時間,而繁忙的實例將反應更靈敏 dynamic-hz yes # 在aof重寫的時候,如果打開了aof-rewrite-incremental-fsync開關,系統會每32MB執行一次fsync。這對于把文件寫入磁盤是有幫助的,可以避免過大的延遲峰值 aof-rewrite-incremental-fsync yes # 在rdb保存的時候,如果打開了rdb-save-incremental-fsync開關,系統會每32MB執行一次fsync。這對于把文件寫入磁盤是有幫助的,可以避免過大的延遲峰值 rdb-save-incremental-fsync yes
10.碎片整理
# 已啟用活動碎片整理 # activedefrag yes # 啟動活動碎片整理的最小碎片浪費量 # active-defrag-ignore-bytes 100mb # 啟動活動碎片整理的最小碎片百分比 # active-defrag-threshold-lower 10 # 我們使用最大努力的最大碎片百分比 # active-defrag-threshold-upper 100 # 以CPU百分比表示的碎片整理的最小工作量 # active-defrag-cycle-min 5 # 在CPU的百分比最大的努力和碎片整理 # active-defrag-cycle-max 75 # 將從中處理的set/hash/zset/list字段的最大數目 # 主詞典掃描 # active-defrag-max-scan-fields 1000