1. 程式人生 > >Redis單節點部署

Redis單節點部署

keepal sna data 兩種 進程id effect err clust cli

安裝Redis

由於REDIS使用單線程處理請求,CPU的快慢最對REDIS的性能有較大影響,官方建議INTEL的CPU,其效率能比AMD高一倍左右。

下載Redis:wget http://download.redis.io/releases/redis-3.2.6.tar.gz

在安裝Redis之前,需要安裝Redis的依賴程序tcl,如果不安裝tcl在Redis執行make test的時候就會報錯的哦。

1 $ yum install -y tcl tcl-devel

yum install gcc-c++ (安裝c++編譯環境)

1 2 3 4 5 6 7 8 9 $ tar xvf 3.2.6.tar.gz -C /usr/local $ cd /usr/local/ $ mv redis-3.2.6 redis $ cd redis $ make 此處也可以編譯到指定位置:make install PREFIX=/app/redis $ make test $ make install $ mkdir /etc/redis $ cp redis/redis.conf /etc/

標準配置

1 2 $ mkdir /data/redis/{logs,conf,pid,data}
$ cp /usr/local/redis/redis.conf /data/redis/conf/redis-6379.conf

以redis用戶啟動redis

1 2 $ useradd -s /bin/false -M redis $ sudo -u redis `which redis-server` /data/redis/conf/redis-6379.conf

啟動後,可以去看日誌文件,可能會看到如下警告:

# WARNING: The TCP backlog setting of 65535 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

因為內核參數/proc/sys/net/core/somaxconn默認值是128,而tcp-backlog設置過大(tcp隊列,設置為511就不會有問題了),所以出現警告。對於負載很大的服務程序來說大大的不夠,一般會將它修改為2048或者更大。可以在/etc/sysctl.conf中添加如下net.core.somaxconn = 2048,然後在終端中執行sysctl -p即可。

# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1′ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1′ for this to take effect.

報警說內核參數/proc/sys/vm/overcommit_memory設置為0了,需要設置為1;overcommit_memory它是內存分配策略,可選值:0、1、2(默認)。

0:表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。

1:表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。

2:表示內核允許分配超過所有物理內存和交換空間總和的內存。

什麽是Overcommit和OOM?

Linux對大部分申請內存的請求都回復”yes”,以便能跑更多更大的程序。因為申請內存後,並不會馬上使用內存。這種技術叫做Overcommit。當Linux發現內存不足時,會發生OOM killer(OOM=out-of-memory)。它會選擇殺死一些進程(用戶態進程,不是內核線程),以便釋放內存。

當oom-killer發生時,Linux會選擇殺死哪些進程?選擇進程的函數是oom_badness函數(在mm/oom_kill.c中),該函數會計算每個進程的點數(0~1000)。點數越高,這個進程越有可能被殺死。每個進程的點數跟oom_score_adj有關,而且oom_score_adj可以被設置(-1000最低,1000最高)。

# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

Redis警告信息就是要求關閉hugepage(怎麽關閉上面已經說了),Oracle也要求關閉,HDFS會因為這個性能嚴重受影響。就是允許hugepage可以動態分配,而不是系統啟動時預先分配,看上去對內存消耗很大的服務都不喜歡它。對於hugepage可以看這篇文章“hugepage詳解”

Redis生產可用配置文件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 ###基本參數### daemonize yes pidfile /data/redis/pid/redis-6379.pid port 6379 tcp-backlog 65535 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice logfile /data/redis/logs/redis-6379.log databases 16 lua-time-limit 5000 maxclients 10000 protected-mode yes dir /data/redis/data/ ###慢日誌參數### slowlog-log-slower-than 10000 slowlog-max-len 128 ###內存參數### maxmemory 8G maxmemory-policy volatile-lru ###RDB持久化參數### save 3600 1 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump-6379.rdb" ###AOF持久化參數### no-appendfsync-on-rewrite yes appendonly yes appendfilename "appendonly-6379.aof" appendfsync no auto-aof-rewrite-min-size 512mb auto-aof-rewrite-percentage 100 aof-load-truncated yes aof-rewrite-incremental-fsync yes ###客戶端Buffer參數### client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 ###其他參數### hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes latency-monitor-threshold 0 hz 10 ###安全參數### requirepass 123456789 masterauth 123456789 rename-command KEYS REDIS_KEYS rename-command FLUSHDB REDIS_FLUSHDB rename-command FLUSHALL REDIS_FLUSHALL ###復制參數(從庫)### ###集群參數###

上面提供了一個單實例Redis的配置,具體的參數含義下面都有介紹,對於復制相關參數只有在從庫才有用,而集群參數只有開啟集群模式的時候才有用。這一點要註意。

基本參數

daemonize yes

將redis是否以後臺進程的方式運行,默認為”no”。如果”daemonize yes”,那麽將會把進程id信息寫入文件中,請註意:啟動redis進程的用戶需要具有寫入此目錄的權限。

pidfile /data/redis/pid/redis-6379.pid

當redis以後臺進程啟動時,給定一個pid文件。

port 6379

指定server需要偵聽的客戶端連接端口,client與server在此端口進行TCP通信。

bind 0.0.0.0

指定redis監聽在那個IP上面,如果你的物理服務器有多個網絡接口,請你為將server socket綁定在指定IP上。

timeout 0

指定socket連接空閑時間(秒),如果connection空閑超時,將會關閉連接(TCP socket選項)如果為0,表示永不超時。

tcp-keepalive 0

指定TCP連接是否為長連接,”偵探”信號由server端維護,長連接將會額外的增加server端的開支(TCP socket選項)。默認為0,表示禁用,非0值表示開啟”長連接”;”偵探”信號的發送間隔將有linux系統決定。在多次”偵探”後,如果對等端(客戶端socket)仍不回復,將會關閉連接,否則連接將會被保持開啟。client端socket也可以通過配置keepalive選項,開啟”長連接”。(單位:秒)

loglevel notice

server日誌級別,合法值:debug,verbose,notice,warning默認為notice。

debug – 適合開發環境,客戶端操作信息都會輸出日誌;

verbose – 輸出一些相對有用的信息,目前效果不明;

notice適 – 合生產環境;

warning – 異常信息;

logfile /data/redis/logs/redis-6379.log

指定redis日誌文件目錄,默認為stdout。

databases 16

設定redis所允許的最大”db簇”的個數,默認為16個簇。客戶端可以通過”select”指令指定需要使用的”db簇”索引號,默認為0。redis的頂層數據結構中,所有K-V都潛在的包括了”db簇”索引號,任何一個key都將隸屬於一個”db”。任何對數據的檢索,只會覆蓋指定的”db”;例如數據被插入到”db 10″中,那麽在”db 1″中去get,將會返回null。對數據歸類到不同的db簇中,可以幫助我們實現一些特定的需求,比如根據不同客戶端連接,來指定不同的db索引號。

maxclients 10000

所允許的客戶端連接數,默認為10000。此值不可能被設置成過大,因為每個socket連接都會以”文件描述符”的方式被系統打開,它受到系統”文件打開個數”的限制。如果超過此值,server將會拒絕連接。

lua-time-limit 5000

lua腳本運行的最大時間。

dir /data/redis/data

用來定義持久化文件的存儲目錄,包括AOF和RDB。

慢日誌參數

slowlog-log-slower-than 10000

“慢操作日誌”記錄,單位:微秒(百萬分之一秒,1000 * 1000),如果操作時間超過此值,將會把command信息”記錄”起來(內存,非文件)。其中”操作時間”不包括網絡IO開支,只包括請求達到server後進行”內存實施”的時間.”0″表示記錄全部操作。

slowlog-max-len 128

“慢操作日誌”保留的最大條數,”記錄”將會被隊列化,如果超過了此長度,舊記錄將會被移除。可以通過”SLOWLOG <subcommand> args”查看慢記錄的信息(SLOWLOG get 10,SLOWLOG reset)。通過”SLOWLOG get num”指令可以查看最近num條慢速記錄,其中包括”記錄”操作的時間/指令/K-V等信息。

內存參數

maxmemory <bytes>

redis-cache所能使用的最大內存(bytes),默認為0,表示”無限制”,最終由OS物理內存大小決定(如果物理內存不足,有可能會使用swap)。如果此值設置過小(比如32字節),將直接導致server無法使用。此值盡量不要超過機器的物理內存大小,從性能和實施的角度考慮,可以為物理內存3/4。此配置需要和”maxmemory-policy”配合使用,當redis中內存數據達到maxmemory時,觸發”清除策略”。如果使用”清除策略”後,仍無法得到足夠的內存來存儲新的數據,那麽write操作的客戶端將會收到”error OOM..”信息,此時server只讀。

在”內存不足”時,任何write操作(比如set,lpush等)都會觸發”清除策略”的執行。在實際環境中,建議redis的所有物理機器的硬件配置保持一致(內存一致),同時確保master/slave中”maxmemory””policy”配置一致

maxmemory-policy volatile-lru

“內存不足”時,數據清除策略,默認為”volatile-lru”。

volatile-lru ->對”過期集合”中的數據采取LRU(近期最少使用)算法,如果對key使用”expire”指令指定了過期時間,那麽此key將會被添加到”過期集合”中。每個Redis對象,都保留一個“最後訪問時間”的屬性,可以用來判斷此對象空閑的時間,那麽LRU算法就可以根據此屬性來進行判斷。將已經過期/LRU的數據優先移除,如果”過期集合”中全部移除仍不能滿足內存需求,將OOM。

allkeys-lru -> 對所有的數據,采用LRU算法。

volatile-random -> 對”過期集合”中的數據采取”隨即選取”算法,並移除選中的K-V,直到”內存足夠”為止。如果如果”過期集合”中全部移除全部移除仍不能滿足,將OOM。

allkeys-random -> 對所有的數據,采取”隨即選取”算法,並移除選中的K-V,直到”內存足夠”為止。

volatile-ttl -> 對”過期集合”中的數據采取TTL算法(最小存活時間),移除即將過期的數據。

noeviction -> 不做任何幹擾操作,直接返回OOM異常。

如果數據的過期不會對”應用系統”帶來異常,且系統中write操作比較密集,建議采取”allkeys-lru“。如果數據對應用系統比較重要,可以直接使用noeviction算法。

安全參數

requirepass <foobared>

當前server的授權密碼,任何客戶端或者slave與此server交互前,需要提交密碼,其他server的masterauth配置和此參數值保持一致。密碼應該足夠復雜(64字節)。

RDB持久化參數

save 3600 1

snapshot配置,save <seconds> <changes>,用來描述”在多少秒期間至少多少個變更操作”觸發snapshot。snapshot最終將生成新的dump.rdb文件,save “”用來禁用snapshot功能。如上表示1小時內至少一個key變更,觸發snapshot。

stop-writes-on-bgsave-error yes

如果snapshot過程中出現錯誤,即數據持久化失敗,是否終止所有的客戶端write請求。這個選項很讓人為難,”yes”表示終止,一旦snapshot故障,那麽此server為只讀服務。如果為”no”,那麽此次snapshot將失敗,但下一次snapshot不會受到影響,不過如果出現故障,數據只能恢復到”最近一個成功點”。

rdbcompression yes

是否啟用rdb文件壓縮手段,默認為yes。壓縮可能需要額外的cpu開支,不過這能夠有效的減小rdb文件的大小,有利於存儲/備份/傳輸/數據恢復。

rdbchecksum yes

是否對rdb文件使用CRC64校驗和,默認為”yes”,那麽每個rdb文件內容的末尾都會追加CRC校驗和。對於其他第三方校驗工具,可以很方便的檢測文件的完整性。

dbfilename dump-6379.rdb

指定rdb文件的名稱。

dir ./

指定rdb/AOF文件的目錄位置,使用CONFIG GET dir命令可以查看默認位置。

AOF持久化參數

appendonly no

是否開啟aof功能,”yes”表示開啟,在開啟情況下,aof文件同步功能才生效,默認為”no”。對master機器,建議使用AOF,對於slave,建議關閉(采用snapshot)。

appendfilename “appendonly-6379.aof”

指定AOF存儲的文件。

appendfsync everysec

aof中文件同步機制。

always -> 任何一個aof記錄都立即進行文件同步(磁盤寫入),安全性最高;如果write請求比較密集,將會造成較高的磁盤IO開支和響應延遲。

everysec -> 每秒同步一次,性能和安全性都較高的策略,也是默認值。

no -> 不直接同步,讓文件同步交給OS控制,OS將會根據文件流通道中buffer情況/空閑情況進行擇機寫入磁盤,安全性和效率與OS設定有關。

no-appendfsync-on-rewrite no

在aof rewrite期間,是否對aof新記錄的append暫緩使用文件同步策略,主要考慮磁盤IO開支和請求阻塞時間。默認為no,表示”不暫緩”,新的aof記錄仍然會被立即同步。如設置為no,那麽在AOFREWRITE時REDIS的處理能力可能下降(如有大量set操作),甚至卡死的發生。如設置為yes,那麽就存在丟數據的風險,例如AOF需要幾分鐘,且處理時REDIS掛掉,那麽AOF在buffer的數據丟失,這幾分鐘的數據無法持久化。

auto-aof-rewrite-min-size 64mb

aof rewrite觸發時機,最小文件大小。

auto-aof-rewrite-percentage 100

aof每次rewrite之後,都會記住當前aof文件的大小,當文件增長到一定比例後,繼續進行aof rewrite。

aof-rewrite-incremental-fsync yes

aof rewrite過程中,是否采取增量”文件同步”策略,默認為”yes”,而且必須為yes。rewrite過程中,每32M數據進行一次文件同步,這樣可以減少”aof大文件”寫入對磁盤的操作次數。

客戶端Buffer參數

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

在客戶端與server進行的交互中,每個連接都會與一個buffer關聯,此buffer用來隊列化亟待被client接受的響應信息。如果client不能及時的消費響應信息,那麽buffer將會被不斷積壓而給server帶來內存壓力。如果buffer中積壓的數據達到閥值,將會導致連接被關閉,buffer被移除。buffer控制類型包括:

normal -> 普通連接。

slave -> 與slave之間的連接。

pubsub -> pub/sub類型連接,此類型的連接,往往會產生此種問題;因為pub端會密集的發布消息,但是sub端可能消費不足。

指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>”,其中hard表示buffer最大值,一旦達到閥值將立即關閉連接;soft表示”容忍值”,它和seconds配合,如果buffer值超過soft且持續時間達到了seconds,也將立即關閉連接,如果超過了soft但是在seconds之後buffer數據小於了soft,連接將會被保留。其中hard和soft都設置為0,則表示禁用buffer控制,通常hard值大於soft。

其他參數

hash-max-ziplist-entries 512

通過”TYPE key”指令查看key的數據類型。通過”OBJECT encoding key”查看key的編碼類型。hash類型的數據結構在編碼上可以使用ziplist和hashtable。ziplist的特點就是文件存儲(以及內存存儲)所需的空間較小,在內容較小時,性能和hashtable幾乎一樣。因此redis對hash類型默認采取ziplist。如果hash中條目的條目個數或者value長度達到閥值,將會被重構為hashtable。ziplist中允許存儲的最大條目個數,建議為128。

hash-max-ziplist-value 64

ziplist中允許條目value值最大字節數,建議為1024。

list-max-ziplist-entries 512

list-max-ziplist-value 64

對於list類型,將會采取ziplist,linkedlist兩種編碼類型,同hash。

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

zset為有序集合,有2中編碼類型:ziplist,skiplist。因為”排序”將會消耗額外的性能,當zset中數據較多時,將會被重構為skiplist。同hash。

set-max-intset-entries 512

intset中允許保存的最大條目個數,如果達到閥值,intset將會被重構為hashtable。

hll-sparse-max-bytes 3000

value大小小於等於hll-sparse-max-bytes使用稀疏數據結構(sparse),大於hll-sparse-max-bytes使用稠密的數據結構(dense)。一個比16000大的value是幾乎沒用的,建議的value大概為3000。如果對CPU要求不高,對空間要求較高的,建議設置到10000左右。

activerehashing yes

Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低內存的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這麽嚴格的實時性要求,可以設置為yes,以便能夠盡可能快的釋放內存。

hz 10

Redis server執行後臺任務的頻率,默認為10,此值越大表示redis對”間歇性task”的執行次數越頻繁(次數/秒)。”間歇性task”包括”過期集合”檢測、關閉”空閑超時”的連接等,此值必須大於0且小於500。(參見redis.h源碼)。此值過小就意味著更多的cpu周期消耗,後臺task被輪詢的次數更頻繁。此值過大意味著”內存敏感”性較差。建議保持默認值。

latency-monitor-threshold 0

延遲監控功能是用來監控redis中執行比較緩慢的一些操作,用LATENCY打印redis實例在跑命令時的耗時圖表。只記錄大於等於下邊設置的值的操作。0的話,就是關閉監視。默認延遲監控功能是關閉的,如果你需要打開,也可以通過CONFIG SET命令動態設置。

include /path/to/local.conf

include指令用來載入額外的配置文件模板,也可以在redis server啟動時,手動指定需要include的配置文件。

復制參數(從庫)

slaveof <masterip> <masterport>

將當前server做為slave,並為其指定master信息。

masterauth <master-password>

以認證的方式連接到master,如果master中使用了”密碼保護”,slave必須交付正確的授權密碼,才能連接成功。”requirepas”配置項指定了當前server的密碼。此配置項中<master-password>值需要和master機器的”requirepas”保持一致。此參數配置在slave端。

slave-serve-stale-data yes

如果當前server是slave,那麽當slave與master失去通訊時,是否繼續為客戶端提供服務,”yes”表示繼續,”no”表示終止。在”yes”情況下,slave繼續向客戶端提供只讀服務,有可能此時的數據已經過期。在”no”情況下,任何向此server發送的數據請求服務(包括客戶端和此server的slave)都將被告知”error”。

slave-read-only yes

slave是否為”只讀”,強烈建議為”yes”。

repl-ping-slave-period 10

slave向指定的master發送ping消息的時間間隔(秒),默認為10。

repl-timeout 60

slave與master通訊中,最大空閑時間,默認60秒,超時將導致連接關閉。

repl-diskless-sync no

repl-diskless-sync-delay 5

當啟用無硬盤備份,服務器等待一段時間後才會通過套接字向從站傳送RDB文件,這個等待時間是可配置的。 這一點很重要,因為一旦傳送開始,就不可能再為一個新到達的從站服務。從站則要排隊等待下一次RDB傳送。因此服務器等待一段時間以期更多的從站到達。 延遲時間以秒為單位,默認為5秒。要關掉這一功能,只需將它設置為0秒,傳送會立即啟動。

repl-disable-tcp-nodelay no

slave與master的連接,是否禁用TCP nodelay選項。”yes”表示禁用,那麽socket通訊中數據將會以packet方式發送(packet大小受到socket buffer限制),可以提高socket通訊的效率(tcp交互次數),但是小數據將會被buffer,不會被立即發送,對於接受者可能存在延遲。”no”表示開啟tcp nodelay選項,任何數據都會被立即發送,及時性較好,但是效率較低。建議為”no”。

slave-priority 100

適用Sentinel模塊(unstable,M-S集群管理和監控),需要額外的配置文件支持。slave的權重值,默認100。當master失效後,Sentinel將會從slave列表中找到權重值最低(>0)的slave,並提升為master。如果權重值為0,表示此slave為”觀察者”,不參與master選舉。

集群參數

cluster-enabled yes

開啟Redis 3.0集群功能。

cluster-config-file /data/redis-6558/nodes.conf

設定了保存節點配置文件的路徑,默認值為nodes.conf。節點配置文件無須人為修改,它由Redis集群在啟動時創建,並在有需要時自動進行更新。

cluster-node-timeout 5000

節點互連超時的閥值,集群節點超時毫秒數。

Redis單節點部署