Redis是1個利用非常廣泛的高性能Key-Value型數據庫,與memcached類似,但功能更加強大!
本文將依照不同功能模塊的方式,順次對各個功能模塊的配置參數進行詳細介紹。
./redis-server /path/to/redis.conf 依照指定的配置文件啟動
include /path/to/other.conf 包括其它的redis配置文件
daemonize yes 啟用后臺守護進程運行模式
pidfile /var/run/redis.pid redis啟動后的進程ID保存文件
port 6379 指定使用的端口號
bind IP 監聽指定的網絡接口
unixsocket /tmp/redis.sock 指定監聽的socket,適用于unix環境
timeout N 客戶端空閑N秒后斷開連接,參數0表示不啟用
loglevel notice 指定服務器信息顯示的等級,4個參數分別為debug\verbose\notice\warning
logfile “” 指定日志文件,默許是使用系統的標準輸出
syslog-enabled no 是不是啟用將記錄記載到系統日志功能,默許為不啟用
syslog-ident redis 若啟用日志記錄,則需要設置日志記錄的身份
syslog-facility local0 若啟用日志記錄,則需要設置日志facility,可取值范圍為local0~local7,表示不同的日志級別
databases 16 設置數據庫的數量,默許啟動時使用DB0,使用“select <dbid>
”可以更換數據庫
tcp-backlog 511 此參數肯定TCP連接中已完成隊列(3次握手以后)的長度,應小于Linux系統的/proc/sys/net/core/somaxconn的值,此選項默許值為511,而Linux的somaxconn默許值為128,當并發量比較大且客戶端反應緩慢的時候,可以同時提高這兩個參數。
tcp-keepalive 0 指定ACKs的時間周期,單位為秒,值非0的情況表示將周期性的檢測客戶端是不是可用,默許值為60秒。
數據保存頻率:
save 900 1 900秒后保存,最少有1個key被更改時才會觸發
save 300 10 300秒后保存,最少有10個key被更改時才會觸發
save 60 10000 60秒后保存,最少有10000個key被更改時才會觸發
stop-writes-on-bgsave-error yes 最近1次save操作失敗則停止寫操作
rdbcompression yes 啟用緊縮
rdbchecksum yes 啟用CRC64校驗碼,固然這個會影響1部分性能
dbfilename dump.rdb 指定存儲數據的文件名
dir ./ 指定工作目錄,rdb文件和aof文件都會寄存在這個目錄中,默許為當前目錄
requirepass foobared 有slave端連接時是不是需要密碼驗證
maxclients 10000 同1時間內最大clients連接的數量,超過數量的連接會返回1個毛病信息
maxmemory <bytes>
設置最大內存
如果內存使用量到達了最大內存設置,有6種處理方法:
volatile-lru -> remove the key with an expire set using an LRU algorithm
allkeys-lru -> remove any key according to the LRU algorithm
volatile-random -> remove a random key with an expire set
allkeys-random -> remove a random key, any key
volatile-ttl -> remove the key with the nearest expire time (minor TTL)
noeviction -> don't expire at all, just return an error on write operations
默許的設置是 maxmemory-policy noeviction
maxmemory-samples 5 LRU算法檢查的keys個數
appendonly yes 啟用AOF模式
appendfilename “appendonly.aof” 設置AOF記錄的文件名
向磁盤進行數據刷寫的頻率,有3個選項:
always 有新數據則馬上刷寫,速度慢但可靠性高
everysec 每秒鐘刷寫1次,折衷方法,所謂的redis可以只丟失1秒鐘的數據就是源于此處
no 依照OS本身的刷寫策略來進行,速度最快
使用選項來進行設置 appendfsync everysec
no-appendfsync-on-rewrite no 當主進程在進行向磁盤的寫操作時,將會禁止其它的fsync調用
auto-aof-rewrite-percentage 100 aof文件觸發自動rewrite的百分比,值為0則表示禁用自動rewrite
auto-aof-rewrite-min-size 64mb aof文件觸發自動rewrite的最小文件size
aof-load-truncated yes 是不是加載不完全的aof文件來進行啟動
lua-time-limit 5000 設置lua腳本的最大運行時間,單位為毫秒
notify-keyspace-events “” 事件通知,默許不啟用,具體參數查看配置文件
Redis的主從復制采取異步的方式進行。
如果同步連接時slave端短暫的與master端斷開了連接,那連接恢復后允許slave端與master端進行1次局部的再同步。
主從復制是自動進行的,其實不需要用戶的參與,slave端會自動嘗試重連master并進行數據同步。
slaveof <master ip> <master port>
設置master真個IP與端口信息
masterauth <master-password>
如果master端啟用了密碼保護(requirepass),那slave端就需要配置此選項
slave-serve-stale-data yes 當slave端在主從復制的進程中與master端斷開了連接,此時有2種處理方法:1種是繼續提供服務即便數據可能不是最新的,另外一種是對要求返回1個毛病信息,默許配置是繼續提供服務
slave-read-only yes 自redis 2.6版本開始,slave端默許為readonly
主從同步支持兩種策略,即disk和socket方式(socket方式尚不完善,還處于實驗階段)。
新的slave端和重連的salve端不允許去繼續同步進程,這被稱之為“完全同步”。
1個RDB文件從master端傳到slave端,分為兩種情況:
1、支持disk:master端將RDB file寫到disk,稍后再傳送到slave端;
2、無磁盤diskless:master端直接將RDB file傳到slave socket,不需要與disk進行交互。
無磁盤diskless方式合適磁盤讀寫速度慢但網絡帶寬非常高的環境。
repl-diskless-sync no 默許不使用diskless同步方式
repl-diskless-sync-delay 5 無磁盤diskless方式在進行數據傳遞之前會有1個時間的延遲,以便slave端能夠進行到待傳送的目標隊列中,這個時間默許是5秒
repl-ping-slave-period 10 slave端向server端發送pings的時間區間設置,默許為10秒
repl-timeout 60 設置超時時間
repl-disable-tcp-nodelay no 是不是啟用TCP_NODELAY,如果啟用則會使用少許的TCP包和帶寬去進行數據傳輸到slave端,固然速度會比較慢;如果不啟用則傳輸速度比較快,但是會占用比較多的帶寬。
repl-backlog-size 1mb 設置backlog的大小,backlog是1個緩沖區,在slave端失連時寄存要同步到slave的數據,因此當1個slave要重連時,常常是不需要完全同步的,履行局部同步就足夠了。backlog設置的越大,slave可以失連的時間就越長。
repl-backlog-ttl 3600 如果1段時間后沒有slave連接到master,則backlog size的內存將會被釋放。如果值為0則表示永久不釋放這部分內存。
slave-priority 100 slave真個優先級設置,值是1個整數,數字越小表示優先級越高。當master故障時將會依照優先級來選擇slave端進行恢復,如果值設置為0,則表示該slave永久不會被選擇。
min-slaves-to-write 3
min-slaves-max-lag 10 設置當1個master真個可用slave少于N個,延遲時間大于M秒時,不接收寫操作。
1個正常的redis實例是不能做為1個redis集群的節點的,除非它是以1個集群節點的方式進行啟動。
cluster-enabled yes 配置redis做為1個集群節點來啟動
cluster-config-file node⑹379.conf 每一個集群節點都有1個集群配置文件,這個文件不需要編輯,它由redis節點來創建和更新。每一個redis節點的集群配置文件不可以相同。
cluster-node-timeout 15000 設置集群節點超時時間,如果超過了指定的超時時間后仍不可達,則節點被認為是失敗狀態,單位為毫秒。
1個屬于失效的master真個slave,如果它的數據較舊,將不會啟動failover。
現在來說并沒有1個簡單的方法去解決如何判定1個slave真個數據的時效性問題,所以可以履行以下兩個選擇:
1、如果有多個slave可用于failover,它們會交換信息以便選出1個最優的進行主從復制的offset,slave端會嘗試根據offset去獲得每一個slave的rank,這樣在啟動failover時對每一個slave的利用就與slave真個rank成正比。
2、每一個slave端和它的master端進行最后交互的時間,這多是最近的ping或指令接收時間,或自與master端失連的過時時間。如果最近的交互時間太久,slave就不會嘗試去進行failover。
第2點可以由用戶來進行調劑,明確1個slave不會進行failover。自最近1次與master端進行交互,過時時間有1個計算公式:
(node-timeout * slave-validity-factor)+repl-ping-slave-period
1個比較大的slave-validity-factor參數能夠允許slave端使用比較舊的數據去failover它的master端,而1個比較小的值可能會禁止集群去選擇slave端。
為取得最大的可用性,可以設置slave-validity-factor的值為0,這表示slave端將會1直去嘗試failover它的master端而不管它與master真個最后交互時間。
cluster-slave-validity-factor 10 默許值為10
集群中的slave可以遷移到那些沒有可用slave的master端,這提升了集群處理故障的能力。畢竟1個沒有slave的master端如果產生了故障是沒有辦法去進行failover的。
要將1個slave遷移到別的master,必須這個slave的原master端有最少給定數目的可用slave才可以進行遷移,這個給定的數目由migration barrier參數來進行設置,默許值為1,表示這個要進行遷移的slave的原master端應當最少還有1個可用的slave才允許其進行遷移,要禁用這個功能只需要將此參數設置為1個非常大的值。
cluster-migration-barrier 1
默許情況下當redis集群節點發現有最少1個hashslot未被covered時將會停止接收查詢。
這類情況下如果有1部分的集群down掉了,那全部集群將變得不可用。
集群將會在所有的slot重新covered以后自動恢復可用。
若想要設置集群在部分key space沒有cover完成時繼續去接收查詢,就將參數設置為no。
cluster-require-full-coverage yes
redis的slow log是1個系統OS進行的記錄查詢,它是超過了指定的履行時間的。履行時間不包括類似與client進行交互或發送回復等I/O操作,它只是實際履行指令的時間。
有2個參數可以配置,1個用來告知redis履行時間,這個時間是微秒級的(1秒=1000000微秒),這是為了不遺漏命令。另外一個參數是設置slowlog的長度,當1個新的命令被記錄時,最舊的命令將會從命令記錄隊列中移除。
slowlog-log-slower-than 10000
slowlog-max-len 128
可使用“slowlog reset”命令來釋放slowlog占用的內存。
latency-monitor-threshold 0 延遲監控,用于記錄等于或超過了指定時間的操作,默許是關閉狀態,即值為0。
當條目數量較少且最大不會超過給定閥值時,哈希編碼將使用1個很高效的內存數據結構,閥值由以下參數來進行配置。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
與哈希類似,少許的lists也會通過1個指定的方式去編碼從而節省更多的空間,它的閥值通過以下參數來進行配置。
list-max-ziplist-entries 512
list-max-ziplist-value 64
集合sets在1種特殊的情況時有指定的編碼方式,這類情況是集合由1組10進制的64位有符號整數范圍內的數字組成的情況。以下選項可以設置集合使用這類特殊編碼方式的size限制。
set-max-intset-entries 512
與哈希和列表類似,有序集合也會使用1種特殊的編碼方式來節省空間,這類特殊的編碼方式只用于這個有序集合的長度和元素均低于以下參數設置的值時。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000 設置HyeperLogLog的字節數限制,這個值通常在0~15000之間,默許為3000,基本不超過16000
activerehashing yes redis將會在每秒中抽出10毫秒來對主字典進行重新散列化處理,這有助于盡量的釋放內存
由于某些緣由,client不能足夠快的從server讀取數據,那client的輸出緩存限制可能會使client失連,這個限制可用于3種不同的client種類,分別是:normal、slave和pubsub。
進行設置的格式以下:
client-output-buffer-limit <class><hard limit><soft limit><soft seconds>
如果到達hard limit那client將會立即失連。
如果到達soft limit那client將會在soft seconds秒以后失連。
參數soft limit < hard limit。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
redis使用1個內部程序來處理后臺任務,例如關閉超時的client連接,清除過期的key等等。它其實不會同時處理所有的任務,redis通過指定的hz參數去檢查和履行任務。
hz默許設為10,提高它的值將會占用更多的cpu,固然相應的redis將會更快的處理同時到期的許多key,和更精確的去處理超時。
hz的取值范圍是1~500,通常不建議超過100,只有在要求延時非常低的情況下可以將值提升到100。
hz 10
當1個子進程要改寫AOF文件,如果以下選項啟用,那文件將會在每產生32MB數據時進行同步,這樣提交增量文件到磁盤時可以免出現比較大的延遲。
aof-rewrite-incremental-fsync yes