Redis集群(Redis Cluster)是Redis提供的一種分布式解決方案,它允許Redis數(shù)據(jù)在多個(gè)Redis節(jié)點(diǎn)之間進(jìn)行分片(sharding),從而可以水平擴(kuò)展以支持更大的數(shù)據(jù)量、更高的并發(fā)查詢負(fù)載以及更高的可用性。
一、Redis Cluster特點(diǎn):
1、哈希槽(Hash ):使用16384個(gè)哈希槽存儲數(shù)據(jù);每個(gè)節(jié)點(diǎn)都負(fù)責(zé)一部分哈希槽;當(dāng)客戶需要存儲或檢索數(shù)據(jù)時(shí),使用CRC16算法對鍵進(jìn)行哈希,根據(jù)結(jié)果確定使用哪個(gè)哈希槽。
2、數(shù)據(jù)分片:通過哈希槽分配給集群中的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)只負(fù)責(zé)分配到哈希槽數(shù)據(jù)9、
3、高可用性和故障恢復(fù):Redis集群主節(jié)點(diǎn)均有一個(gè)或多個(gè)備份節(jié)點(diǎn);如主節(jié)點(diǎn)故障,集群自動將節(jié)點(diǎn)提升到主節(jié)點(diǎn),以保證服務(wù)的連續(xù)性;集群會檢測和自動處理故障節(jié)點(diǎn)。
4、客戶端重定向:客戶端訪問不在其當(dāng)前節(jié)點(diǎn)的哈希槽時(shí),該節(jié)點(diǎn)會自動向客戶端發(fā)送重定向命令,告訴客戶端應(yīng)連接哪個(gè)節(jié)點(diǎn);客戶端根據(jù)這個(gè)命令重新連接到正確的節(jié)點(diǎn),并執(zhí)行相應(yīng)的操作。
5、一致保證性:Redis集群在CAP(Consistency, Availability, Partition tolerance)中傾向于AP(可用性和分區(qū)容忍性);某情況下,如網(wǎng)絡(luò)故障或節(jié)點(diǎn)故障,集群會暫時(shí)犧牲一致性。
6、使用場景:處理大量數(shù)據(jù)和高并發(fā)查詢;需要高可用性和故障恢復(fù)能力的場景。
7、配置和部署:需配置多個(gè)Redis節(jié)點(diǎn);可使用reids-cli獲取其他集群管理工具如(Redis Cluster Manager)來創(chuàng)建、配置和管理集群。
8、客戶端支持:大多數(shù)Reids客戶端支持并提供api與集群交互;客戶端通常會自動處理哈希槽的映射、重定向和故障恢復(fù)等底層細(xì)節(jié),使得開發(fā)象使用單個(gè)redis示例一樣使用Reids集群。
9、其他:不支持某些Redis命令(如跨多個(gè)鍵的操作)和配置(如持久化到磁盤的配置)
二、部署:
1、規(guī)模:至少需要3個(gè)主節(jié)點(diǎn)來構(gòu)成,因?yàn)榧菏褂昧送镀比蒎e(cuò)機(jī)制,要求超過半數(shù)節(jié)點(diǎn)認(rèn)為某個(gè)節(jié)點(diǎn)掛了,該節(jié)點(diǎn)才被視為不可用;每個(gè)主節(jié)點(diǎn)都應(yīng)該有一個(gè)或多個(gè)從節(jié)點(diǎn)(即備份節(jié)點(diǎn))。因此,一個(gè)基本的Redis集群至少需要6臺服務(wù)器(3主3從)。
2、安裝redis節(jié)點(diǎn)

redis配置文件詳解
################################### NETWORK ###################################
# 指定 redis 只接收來自于該IP地址的請求,如果不進(jìn)行設(shè)置,那么將處理所有請求
bind 127.0.0.1
#是否開啟保護(hù)模式,默認(rèn)開啟。要是配置里沒有指定bind和密碼。開啟該參數(shù)后,redis只會本地進(jìn)行訪問,
拒絕外部訪問。要是開啟了密碼和bind,可以開啟。否則最好關(guān)閉,設(shè)置為no
protected-mode yes
#redis監(jiān)聽的端口號
port 6379
#此參數(shù)確定了TCP連接中已完成隊(duì)列(完成三次握手之后)的長度, 當(dāng)然此值必須不大于Linux系統(tǒng)定義
的/proc/sys/net/core/somaxconn值,默認(rèn)是511,而Linux的默認(rèn)參數(shù)值是128。當(dāng)系統(tǒng)并發(fā)量大并且客戶端
速度緩慢的時(shí)候,可以將這二個(gè)參數(shù)一起參考設(shè)定。該內(nèi)核參數(shù)默認(rèn)值一般是128,對于負(fù)載很大的服務(wù)程序來說
大大的不夠。一般會將它修改為2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,
然后在終端中執(zhí)行sysctl -p
tcp-backlog 511
#此參數(shù)為設(shè)置客戶端空閑超過timeout,服務(wù)端會斷開連接,為0則服務(wù)端不會主動斷開連接,不能小于0
timeout 0
#tcp keepalive參數(shù)。如果設(shè)置不為0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有兩個(gè)好處:檢測掛
掉的對端。降低中間設(shè)備出問題而導(dǎo)致網(wǎng)絡(luò)看似連接卻已經(jīng)與對端端口的問題。在Linux內(nèi)核中,設(shè)置了
keepalive,redis會定時(shí)給對端發(fā)送ack。檢測到對端關(guān)閉需要兩倍的設(shè)置值
tcp-keepalive 300
#是否在后臺執(zhí)行,yes:后臺運(yùn)行;no:不是后臺運(yùn)行
daemonize yes
#redis的進(jìn)程文件
pidfile /var/run/redis/redis.pid
#指定了服務(wù)端日志的級別。級別包括:debug(很多信息,方便開發(fā)、測試),verbose(許多有用的信息,
但是沒有debug級別信息多),notice(適當(dāng)?shù)娜罩炯墑e,適合生產(chǎn)環(huán)境),warn(只有非常重要的信息)
loglevel notice
#指定了記錄日志的文件。空字符串的話,日志會打印到標(biāo)準(zhǔn)輸出設(shè)備。后臺運(yùn)行的redis標(biāo)準(zhǔn)輸出是/dev/null
logfile /usr/local/redis/var/redis.log
#是否打開記錄syslog功能
# syslog-enabled no
#syslog的標(biāo)識符。
# syslog-ident redis
#日志的來源、設(shè)備
# syslog-facility local0
#數(shù)據(jù)庫的數(shù)量,默認(rèn)使用的數(shù)據(jù)庫是0。可以通過”SELECT 【數(shù)據(jù)庫序號】“命令選擇一個(gè)數(shù)據(jù)庫,序號從0開始
databases 16
################################### SNAPSHOTTING ###################################
#RDB核心規(guī)則配置 save <指定時(shí)間間隔> <執(zhí)行指定次數(shù)更新操作>,滿足條件就將內(nèi)存中的數(shù)據(jù)同步到硬盤
中。官方出廠配置默認(rèn)是 900秒內(nèi)有1個(gè)更改,300秒內(nèi)有10個(gè)更改以及60秒內(nèi)有10000個(gè)更改,則將內(nèi)存中的
數(shù)據(jù)快照寫入磁盤。
若不想用RDB方案,可以把 save "" 的注釋打開,下面三個(gè)注釋
# save ""
save 900 1
save 300 10
save 60 10000
#當(dāng)RDB持久化出現(xiàn)錯(cuò)誤后,是否依然進(jìn)行繼續(xù)進(jìn)行工作,yes:不能進(jìn)行工作,no:可以繼續(xù)進(jìn)行工作,可以通
過info中的rdb_last_bgsave_status了解RDB持久化是否有錯(cuò)誤
stop-writes-on-bgsave-error yes
#配置存儲至本地?cái)?shù)據(jù)庫時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes。Redis采用LZF壓縮方式,但占用了一點(diǎn)CPU的時(shí)間。若關(guān)閉該選項(xiàng),
但會導(dǎo)致數(shù)據(jù)庫文件變的巨大。建議開啟。
rdbcompression yes
#是否校驗(yàn)rdb文件;從rdb格式的第五個(gè)版本開始,在rdb文件的末尾會帶上CRC64的校驗(yàn)和。這跟有利于文件的
容錯(cuò)性,但是在保存rdb文件的時(shí)候,會有大概10%的性能損耗,所以如果你追求高性能,可以關(guān)閉該配置
rdbchecksum yes
#指定本地?cái)?shù)據(jù)庫文件名,一般采用默認(rèn)的 dump.rdb
dbfilename dump.rdb
#數(shù)據(jù)目錄,數(shù)據(jù)庫的寫入會在這個(gè)目錄。rdb、aof文件也會寫在這個(gè)目錄
dir /usr/local/redis/var
################################# REPLICATION #################################
# 復(fù)制選項(xiàng),slave復(fù)制對應(yīng)的master。
# replicaof <masterip> <masterport>
#如果master設(shè)置了requirepass,那么slave要連上master,需要有master的密碼才行。masterauth就是用來
配置master的密碼,這樣可以在連上master后進(jìn)行認(rèn)證。
# masterauth <master-password>
#當(dāng)從庫同主機(jī)失去連接或者復(fù)制正在進(jìn)行,從機(jī)庫有兩種運(yùn)行方式:1) 如果slave-serve-stale-data設(shè)置為
yes(默認(rèn)設(shè)置),從庫會繼續(xù)響應(yīng)客戶端的請求。2) 如果slave-serve-stale-data設(shè)置為no,
INFO,replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,SUBSCRIBE, UNSUBSCRIBE,
PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,COMMAND, POST, HOST: and LATENCY命令之外的任何請求
都會返回一個(gè)錯(cuò)誤”SYNC with master in progress”。
replica-serve-stale-data yes
#作為從服務(wù)器,默認(rèn)情況下是只讀的(yes),可以修改成NO,用于寫(不建議)
#replica-read-only yes
# 是否使用socket方式復(fù)制數(shù)據(jù)。目前redis復(fù)制提供兩種方式,disk和socket。如果新的slave連上來或者
重連的slave無法部分同步,就會執(zhí)行全量同步,master會生成rdb文件。有2種方式:disk方式是master創(chuàng)建
一個(gè)新的進(jìn)程把rdb文件保存到磁盤,再把磁盤上的rdb文件傳遞給slave。socket是master創(chuàng)建一個(gè)新的進(jìn)
程,直接把rdb文件以socket的方式發(fā)給slave。disk方式的時(shí)候,當(dāng)一個(gè)rdb保存的過程中,多個(gè)slave都能
共享這個(gè)rdb文件。socket的方式就的一個(gè)個(gè)slave順序復(fù)制。在磁盤速度緩慢,網(wǎng)速快的情況下推薦用socket方式。
repl-diskless-sync no
#diskless復(fù)制的延遲時(shí)間,防止設(shè)置為0。一旦復(fù)制開始,節(jié)點(diǎn)不會再接收新slave的復(fù)制請求直到下一個(gè)rdb傳輸。
所以最好等待一段時(shí)間,等更多的slave連上來
repl-diskless-sync-delay 5
#slave根據(jù)指定的時(shí)間間隔向服務(wù)器發(fā)送ping請求。時(shí)間間隔可以通過 repl_ping_slave_period 來設(shè)置,默認(rèn)10秒。
# repl-ping-slave-period 10
# 復(fù)制連接超時(shí)時(shí)間。master和slave都有超時(shí)時(shí)間的設(shè)置。master檢測到slave上次發(fā)送的時(shí)間超過repl-timeout,即認(rèn)為slave離線,清除該slave信息。slave檢測到上次和master交互的時(shí)間超過repl-timeout,則認(rèn)為master離線。需要注意的是repl-timeout需要設(shè)置一個(gè)比repl-ping-slave-period更大的值,不然會經(jīng)常檢測到超時(shí)
# repl-timeout 60
#是否禁止復(fù)制tcp鏈接的tcp nodelay參數(shù),可傳遞yes或者no。默認(rèn)是no,即使用tcp nodelay。如果
master設(shè)置了yes來禁止tcp nodelay設(shè)置,在把數(shù)據(jù)復(fù)制給slave的時(shí)候,會減少包的數(shù)量和更小的網(wǎng)絡(luò)帶
寬。但是這也可能帶來數(shù)據(jù)的延遲。默認(rèn)我們推薦更小的延遲,但是在數(shù)據(jù)量傳輸很大的場景下,建議選擇yes
repl-disable-tcp-nodelay no
#復(fù)制緩沖區(qū)大小,這是一個(gè)環(huán)形復(fù)制緩沖區(qū),用來保存最新復(fù)制的命令。這樣在slave離線的時(shí)候,不需要完
全復(fù)制master的數(shù)據(jù),如果可以執(zhí)行部分同步,只需要把緩沖區(qū)的部分?jǐn)?shù)據(jù)復(fù)制給slave,就能恢復(fù)正常復(fù)制狀
態(tài)。緩沖區(qū)的大小越大,slave離線的時(shí)間可以更長,復(fù)制緩沖區(qū)只有在有slave連接的時(shí)候才分配內(nèi)存。沒有
slave的一段時(shí)間,內(nèi)存會被釋放出來,默認(rèn)1m
# repl-backlog-size 1mb
# master沒有slave一段時(shí)間會釋放復(fù)制緩沖區(qū)的內(nèi)存,repl-backlog-ttl用來設(shè)置該時(shí)間長度。單位為秒。
# repl-backlog-ttl 3600
# 當(dāng)master不可用,Sentinel會根據(jù)slave的優(yōu)先級選舉一個(gè)master。最低的優(yōu)先級的slave,當(dāng)選master。
而配置成0,永遠(yuǎn)不會被選舉
replica-priority 100
#redis提供了可以讓master停止寫入的方式,如果配置了min-replicas-to-write,健康的slave的個(gè)數(shù)小于N,mater就禁止寫入。master最少得有多少個(gè)健康的slave存活才能執(zhí)行寫命令。這個(gè)配置雖然不能保證N個(gè)slave都一定能接收到master的寫操作,但是能避免沒有足夠健康的slave的時(shí)候,master不能寫入來避免數(shù)據(jù)丟失。設(shè)置為0是關(guān)閉該功能
# min-replicas-to-write 3
# 延遲小于min-replicas-max-lag秒的slave才認(rèn)為是健康的slave
# min-replicas-max-lag 10
# 設(shè)置1或另一個(gè)設(shè)置為0禁用這個(gè)特性。
# Setting one or the other to 0 disables the feature.
# By default min-replicas-to-write is set to 0 (feature disabled) and
# min-replicas-max-lag is set to 10.
#requirepass配置可以讓用戶使用AUTH命令來認(rèn)證密碼,才能使用其他命令。這讓redis可以使用在不受信任的
網(wǎng)絡(luò)中。為了保持向后的兼容性,可以注釋該命令,因?yàn)榇蟛糠钟脩粢膊恍枰J(rèn)證。使用requirepass的時(shí)候需要
注意,因?yàn)閞edis太快了,每秒可以認(rèn)證15w次密碼,簡單的密碼很容易被攻破,所以最好使用一個(gè)更復(fù)雜的密碼
# requirepass foobared
#把危險(xiǎn)的命令給修改成其他名稱。比如CONFIG命令可以重命名為一個(gè)很難被猜到的命令,這樣用戶不能使用,而
內(nèi)部工具還能接著使用
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#設(shè)置成一個(gè)空的值,可以禁止一個(gè)命令
# rename-command CONFIG ""
# 設(shè)置能連上redis的最大客戶端連接數(shù)量。默認(rèn)是10000個(gè)客戶端連接。由于redis不區(qū)分連接是客戶端連接還
是內(nèi)部打開文件或者和slave連接等,所以maxclients最小建議設(shè)置到32。如果超過了maxclients,redis會給
新的連接發(fā)送’max number of clients reached’,并關(guān)閉連接
# maxclients 10000
redis配置的最大內(nèi)存容量。當(dāng)內(nèi)存滿了,需要配合maxmemory-policy策略進(jìn)行處理。注意slave的輸出緩沖區(qū)
是不計(jì)算在maxmemory內(nèi)的。所以為了防止主機(jī)內(nèi)存使用完,建議設(shè)置的maxmemory需要更小一些
maxmemory 122000000
#內(nèi)存容量超過maxmemory后的處理策略。
#volatile-lru:利用LRU算法移除設(shè)置過過期時(shí)間的key。
#volatile-random:隨機(jī)移除設(shè)置過過期時(shí)間的key。
#volatile-ttl:移除即將過期的key,根據(jù)最近過期時(shí)間來刪除(輔以TTL)
#allkeys-lru:利用LRU算法移除任何key。
#allkeys-random:隨機(jī)移除任何key。
#noeviction:不移除任何key,只是返回一個(gè)寫錯(cuò)誤。
#上面的這些驅(qū)逐策略,如果redis沒有合適的key驅(qū)逐,對于寫命令,還是會返回錯(cuò)誤。redis將不再接收寫請求,只接收get請求。寫命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。
# maxmemory-policy noeviction
# lru檢測的樣本數(shù)。使用lru或者ttl淘汰算法,從需要淘汰的列表中隨機(jī)選擇sample個(gè)key,選出閑置時(shí)間最長的key移除
# maxmemory-samples 5
# 是否開啟salve的最大內(nèi)存
# replica-ignore-maxmemory yes
#以非阻塞方式釋放內(nèi)存
#使用以下配置指令調(diào)用了
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
#Redis 默認(rèn)不開啟。它的出現(xiàn)是為了彌補(bǔ)RDB的不足(數(shù)據(jù)的不一致性),所以它采用日志的形式來記錄每個(gè)寫
操作,并追加到文件中。Redis 重啟的會根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作
默認(rèn)redis使用的是rdb方式持久化,這種方式在許多應(yīng)用中已經(jīng)足夠用了。但是redis如果中途宕機(jī),會導(dǎo)致可
能有幾分鐘的數(shù)據(jù)丟失,根據(jù)save來策略進(jìn)行持久化,Append Only File是另一種持久化方式,可以提供更好的
持久化特性。Redis會把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件,每次啟動時(shí)Redis都會先把這
個(gè)文件的數(shù)據(jù)讀入內(nèi)存里,先忽略RDB文件。若開啟rdb則將no改為yes
appendonly no
指定本地?cái)?shù)據(jù)庫文件名,默認(rèn)值為 appendonly.aof
appendfilename "appendonly.aof"
#aof持久化策略的配置
#no表示不執(zhí)行fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤,速度最快
#always表示每次寫入都執(zhí)行fsync,以保證數(shù)據(jù)同步到磁盤
#everysec表示每秒執(zhí)行一次fsync,可能會導(dǎo)致丟失這1s數(shù)據(jù)
# appendfsync always
appendfsync everysec
# appendfsync no
# 在aof重寫或者寫入rdb文件的時(shí)候,會執(zhí)行大量IO,此時(shí)對于everysec和always的aof模式來說,執(zhí)行
fsync會造成阻塞過長時(shí)間,no-appendfsync-on-rewrite字段設(shè)置為默認(rèn)設(shè)置為no。如果對延遲要求很高的
應(yīng)用,這個(gè)字段可以設(shè)置為yes,否則還是設(shè)置為no,這樣對持久化特性來說這是更安全的選擇。設(shè)置為yes表
示rewrite期間對新寫操作不fsync,暫時(shí)存在內(nèi)存中,等rewrite完成后再寫入,默認(rèn)為no,建議yes。Linux的
默認(rèn)fsync策略是30秒。可能丟失30秒數(shù)據(jù)
no-appendfsync-on-rewrite no
#aof自動重寫配置。當(dāng)目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進(jìn)行重寫,即當(dāng)aof文件
增長到一定大小的時(shí)候Redis能夠調(diào)用bgrewriteaof對日志文件進(jìn)行重寫。當(dāng)前AOF文件大小是上次日志重寫得
到AOF文件大小的二倍(設(shè)置為100)時(shí),自動啟動新的日志重寫過程
auto-aof-rewrite-percentage 100
#設(shè)置允許重寫的最小aof文件大小,避免了達(dá)到約定百分比但尺寸仍然很小的情況還要重寫
auto-aof-rewrite-min-size 64mb
#aof文件可能在尾部是不完整的,當(dāng)redis啟動的時(shí)候,aof文件的數(shù)據(jù)被載入內(nèi)存。重啟可能發(fā)生在redis所
在的主機(jī)操作系統(tǒng)宕機(jī)后,尤其在ext4文件系統(tǒng)沒有加上data=ordered選項(xiàng)(redis宕機(jī)或者異常終止不會造
成尾部不完整現(xiàn)象。)出現(xiàn)這種現(xiàn)象,可以選擇讓redis退出,或者導(dǎo)入盡可能多的數(shù)據(jù)。如果選擇的是yes,
當(dāng)截?cái)嗟腶of文件被導(dǎo)入的時(shí)候,會自動發(fā)布一個(gè)log給客戶端然后load。如果是no,用戶必須手動redis-
check-aof修復(fù)AOF文件才可以
aof-load-truncated yes
#加載redis時(shí),可以識別AOF文件以“redis”開頭。
#字符串并加載帶前綴的RDB文件,然后繼續(xù)加載AOF尾巴
aof-use-rdb-preamble yes
# 如果達(dá)到最大時(shí)間限制(毫秒),redis會記個(gè)log,然后返回error。當(dāng)一個(gè)腳本超過了最大時(shí)限。只有
SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個(gè)可以殺沒有調(diào)write命令的東西。要是已經(jīng)調(diào)用了write,只能
用第二個(gè)命令殺
lua-time-limit 5000
# 集群開關(guān),默認(rèn)是不開啟集群模式
# cluster-enabled yes
#集群配置文件的名稱,每個(gè)節(jié)點(diǎn)都有一個(gè)集群相關(guān)的配置文件,持久化保存集群的信息。這個(gè)文件并不需要手動
配置,這個(gè)配置文件有Redis生成并更新,每個(gè)Redis集群節(jié)點(diǎn)需要一個(gè)單獨(dú)的配置文件,請確保與實(shí)例運(yùn)行的系
統(tǒng)中配置文件名稱不沖突
# cluster-config-file nodes-6379.conf
#節(jié)點(diǎn)互連超時(shí)的閥值。集群節(jié)點(diǎn)超時(shí)毫秒數(shù)
# cluster-node-timeout 15000
#在進(jìn)行故障轉(zhuǎn)移的時(shí)候,全部slave都會請求申請為master,但是有些slave可能與master斷開連接一段時(shí)間
了,導(dǎo)致數(shù)據(jù)過于陳舊,這樣的slave不應(yīng)該被提升為master。該參數(shù)就是用來判斷slave節(jié)點(diǎn)與master斷線的時(shí)
間是否過長。判斷方法是:
#比較slave斷開連接的時(shí)間和(node-timeout * slave-validity-factor) + repl-ping-slave-period
#如果節(jié)點(diǎn)超時(shí)時(shí)間為三十秒, 并且slave-validity-factor為10,假設(shè)默認(rèn)的repl-ping-slave-period是10
秒,即如果超過310秒slave將不會嘗試進(jìn)行故障轉(zhuǎn)移
# cluster-replica-validity-factor 10
# master的slave數(shù)量大于該值,slave才能遷移到其他孤立master上,如這個(gè)參數(shù)若被設(shè)為2,那么只有當(dāng)一
個(gè)主節(jié)點(diǎn)擁有2 個(gè)可工作的從節(jié)點(diǎn)時(shí),它的一個(gè)從節(jié)點(diǎn)會嘗試遷移
# cluster-migration-barrier 1
#默認(rèn)情況下,集群全部的slot有節(jié)點(diǎn)負(fù)責(zé),集群狀態(tài)才為ok,才能提供服務(wù)。設(shè)置為no,可以在slot沒有全
部分配的時(shí)候提供服務(wù)。不建議打開該配置,這樣會造成分區(qū)的時(shí)候,小分區(qū)的master一直在接受寫請求,而
造成很長時(shí)間數(shù)據(jù)不一致
# cluster-require-full-coverage yes
#*群集公告IP
#*群集公告端口
#*群集公告總線端口
# Example:
#
# cluster-announce-ip 10.1.1.5
# cluster-announce-port 6379
# cluster-announce-bus-port 6380
# slog log是用來記錄redis運(yùn)行中執(zhí)行比較慢的命令耗時(shí)。當(dāng)命令的執(zhí)行超過了指定時(shí)間,就記錄在slow log
中,slog log保存在內(nèi)存中,所以沒有IO操作。
#執(zhí)行時(shí)間比slowlog-log-slower-than大的請求記錄到slowlog里面,單位是微秒,所以1000000就是1秒。注
意,負(fù)數(shù)時(shí)間會禁用慢查詢?nèi)罩荆?則會強(qiáng)制記錄所有命令。
slowlog-log-slower-than 10000
#慢查詢?nèi)罩鹃L度。當(dāng)一個(gè)新的命令被寫進(jìn)日志的時(shí)候,最老的那個(gè)記錄會被刪掉。這個(gè)長度沒有限制。只要有足
夠的內(nèi)存就行。你可以通過 SLOWLOG RESET 來釋放內(nèi)存
slowlog-max-len 128
#延遲監(jiān)控功能是用來監(jiān)控redis中執(zhí)行比較緩慢的一些操作,用LATENCY打印redis實(shí)例在跑命令時(shí)的耗時(shí)圖表。
只記錄大于等于下邊設(shè)置的值的操作。0的話,就是關(guān)閉監(jiān)視。默認(rèn)延遲監(jiān)控功能是關(guān)閉的,如果你需要打開,也
可以通過CONFIG SET命令動態(tài)設(shè)置
latency-monitor-threshold 0
#鍵空間通知使得客戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 數(shù)據(jù)集的事件。因?yàn)殚_啟鍵空間通知功能需要消耗一些 CPU ,所以在默認(rèn)配置下,該功能處于關(guān)閉狀態(tài)。
#notify-keyspace-events 的參數(shù)可以是以下字符的任意組合,它指定了服務(wù)器該發(fā)送哪些類型的通知:
##K 鍵空間通知,所有通知以 __keyspace@__ 為前綴
##E 鍵事件通知,所有通知以 __keyevent@__ 為前綴
##g DEL 、 EXPIRE 、 RENAME 等類型無關(guān)的通用命令的通知
##$ 字符串命令的通知
##l 列表命令的通知
##s 集合命令的通知
##h 哈希命令的通知
##z 有序集合命令的通知
##x 過期事件:每當(dāng)有過期鍵被刪除時(shí)發(fā)送
##e 驅(qū)逐(evict)事件:每當(dāng)有鍵因?yàn)?nbsp;maxmemory 政策而被刪除時(shí)發(fā)送
##A 參數(shù) g$lshzxe 的別名
#輸入的參數(shù)中至少要有一個(gè) K 或者 E,否則的話,不管其余的參數(shù)是什么,都不會有任何 通知被分發(fā)。詳細(xì)使用可以參考http://redis.io/topics/notifications
notify-keyspace-events ""
# 數(shù)據(jù)量小于等于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<--不建議用于正常工作負(fù)載
#-4:最大大小:32 KB<--不推薦
#-3:最大大小:16 KB<--可能不推薦
#-2:最大大小:8kb<--良好
#-1:最大大小:4kb<--良好
list-max-ziplist-size -2
#0:禁用所有列表壓縮
#1:深度1表示“在列表中的1個(gè)節(jié)點(diǎn)之后才開始壓縮,
#從頭部或尾部
#所以:【head】->node->node->…->node->【tail】
#[頭部],[尾部]將始終未壓縮;內(nèi)部節(jié)點(diǎn)將壓縮。
#2:[頭部]->[下一步]->節(jié)點(diǎn)->節(jié)點(diǎn)->…->節(jié)點(diǎn)->[上一步]->[尾部]
#2這里的意思是:不要壓縮頭部或頭部->下一個(gè)或尾部->上一個(gè)或尾部,
#但是壓縮它們之間的所有節(jié)點(diǎn)。
#3:[頭部]->[下一步]->[下一步]->節(jié)點(diǎn)->節(jié)點(diǎn)->…->節(jié)點(diǎn)->[上一步]->[上一步]->[尾部]
list-compress-depth 0
# 數(shù)據(jù)量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set
set-max-intset-entries 512
#數(shù)據(jù)量小于等于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使用稀疏數(shù)據(jù)結(jié)構(gòu)(sparse),大于hll-sparse-max-bytes使
用稠密的數(shù)據(jù)結(jié)構(gòu)(dense)。一個(gè)比16000大的value是幾乎沒用的,建議的value大概為3000。如果對CPU要
求不高,對空間要求較高的,建議設(shè)置到10000左右
hll-sparse-max-bytes 3000
#宏觀節(jié)點(diǎn)的最大流/項(xiàng)目的大小。在流數(shù)據(jù)結(jié)構(gòu)是一個(gè)基數(shù)
#樹節(jié)點(diǎn)編碼在這項(xiàng)大的多。利用這個(gè)配置它是如何可能#大節(jié)點(diǎn)配置是單字節(jié)和
#最大項(xiàng)目數(shù),這可能包含了在切換到新節(jié)點(diǎn)的時(shí)候
# appending新的流條目。如果任何以下設(shè)置來設(shè)置
# ignored極限是零,例如,操作系統(tǒng),它有可能只是一集
通過設(shè)置限制最大#紀(jì)錄到最大字節(jié)0和最大輸入到所需的值
stream-node-max-bytes 4096
stream-node-max-entries 100
#Redis將在每100毫秒時(shí)使用1毫秒的CPU時(shí)間來對redis的hash表進(jìn)行重新hash,可以降低內(nèi)存的使用。當(dāng)你
的使用場景中,有非常嚴(yán)格的實(shí)時(shí)性需要,不能夠接受Redis時(shí)不時(shí)的對請求有2毫秒的延遲的話,把這項(xiàng)配置
為no。如果沒有這么嚴(yán)格的實(shí)時(shí)性要求,可以設(shè)置為yes,以便能夠盡可能快的釋放內(nèi)存
activerehashing yes
##對客戶端輸出緩沖進(jìn)行限制可以強(qiáng)迫那些不從服務(wù)器讀取數(shù)據(jù)的客戶端斷開連接,用來強(qiáng)制關(guān)閉傳輸緩慢的客戶端。
#對于normal client,第一個(gè)0表示取消hard limit,第二個(gè)0和第三個(gè)0表示取消soft limit,normal
client默認(rèn)取消限制,因?yàn)槿绻麤]有尋問,他們是不會接收數(shù)據(jù)的
client-output-buffer-limit normal 0 0 0
#對于slave client和MONITER client,如果client-output-buffer一旦超過256mb,又或者超過64mb持續(xù)
60秒,那么服務(wù)器就會立即斷開客戶端連接
client-output-buffer-limit replica 256mb 64mb 60
#對于pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續(xù)60秒,那么服務(wù)器就
會立即斷開客戶端連接
client-output-buffer-limit pubsub 32mb 8mb 60
# 這是客戶端查詢的緩存極限值大小
# client-query-buffer-limit 1gb
#在redis協(xié)議中,批量請求,即表示單個(gè)字符串,通常限制為512 MB。但是您可以更改此限制。
# proto-max-bulk-len 512mb
#redis執(zhí)行任務(wù)的頻率為1s除以hz
hz 10
#當(dāng)啟用動態(tài)赫茲時(shí),實(shí)際配置的赫茲將用作作為基線,但實(shí)際配置的赫茲值的倍數(shù)
#在連接更多客戶端后根據(jù)需要使用。這樣一個(gè)閑置的實(shí)例將占用很少的CPU時(shí)間,而繁忙的實(shí)例將反應(yīng)更靈敏
dynamic-hz yes
#在aof重寫的時(shí)候,如果打開了aof-rewrite-incremental-fsync開關(guān),系統(tǒng)會每32MB執(zhí)行一次fsync。這
對于把文件寫入磁盤是有幫助的,可以避免過大的延遲峰值
aof-rewrite-incremental-fsync yes
#在rdb保存的時(shí)候,如果打開了rdb-save-incremental-fsync開關(guān),系統(tǒng)會每32MB執(zhí)行一次fsync。這
對于把文件寫入磁盤是有幫助的,可以避免過大的延遲峰值
rdb-save-incremental-fsync yes
# 已啟用活動碎片整理
# activedefrag yes
# 啟動活動碎片整理的最小碎片浪費(fèi)量
# 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字段的最大數(shù)目
#主詞典掃描
# active-defrag-max-scan-fields 1000
3、配置集群節(jié)點(diǎn):修改Redis節(jié)點(diǎn)的配置文件,確保cluster-enabled yes
:啟用Redis集群模式;
分配不同的端口號給每個(gè)節(jié)點(diǎn),確保它們不沖突(例如,使用1001-9001);
根據(jù)需要配置其他相關(guān)參數(shù),如密碼、內(nèi)存限制等4、啟動redis:使用redis-server命令
5、使用reids-cli命令行工具,Redis Cluster 在5.0之后取消了ruby腳本 redis-trib.rb的支持。
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN #創(chuàng)建集群
--cluster-replicas <arg> #從節(jié)點(diǎn)個(gè)數(shù)
check host:port #檢查集群
--cluster-search-multiple-owners #檢查是否有槽同時(shí)被分配給了多個(gè)節(jié)點(diǎn)
info host:port #查看集群狀態(tài)
fix host:port #修復(fù)集群
--cluster-search-multiple-owners #修復(fù)槽的重復(fù)分配問題
reshard host:port #指定集群的任意一節(jié)點(diǎn)進(jìn)行遷移slot,重新分slots
--cluster-from <arg> #需要從哪些源節(jié)點(diǎn)上遷移slot,可從多個(gè)源節(jié)點(diǎn)完成遷移,以逗號隔開,傳遞的是節(jié)點(diǎn)的node id,還可以直接傳遞--from all,這樣源節(jié)點(diǎn)就是集群的所有節(jié)點(diǎn),不傳遞該參數(shù)的話,則會在遷移過程中提示用戶輸入
--cluster-to <arg> #slot需要遷移的目的節(jié)點(diǎn)的node id,目的節(jié)點(diǎn)只能填寫一個(gè),不傳遞該參數(shù)的話,則會在遷移過程中提示用戶輸入
--cluster-slots <arg> #需要遷移的slot數(shù)量,不傳遞該參數(shù)的話,則會在遷移過程中提示用戶輸入。
--cluster-yes #指定遷移時(shí)的確認(rèn)輸入
--cluster-timeout <arg> #設(shè)置migrate命令的超時(shí)時(shí)間
--cluster-pipeline <arg> #定義cluster getkeysinslot命令一次取出的key數(shù)量,不傳的話使用默認(rèn)值為10
--cluster-replace #是否直接replace到目標(biāo)節(jié)點(diǎn)
rebalance host:port #指定集群的任意一節(jié)點(diǎn)進(jìn)行平衡集群節(jié)點(diǎn)slot數(shù)量
--cluster-weight <node1=w1...nodeN=wN> #指定集群節(jié)點(diǎn)的權(quán)重
--cluster-use-empty-masters #設(shè)置可以讓沒有分配slot的主節(jié)點(diǎn)參與,默認(rèn)不允許
--cluster-timeout <arg> #設(shè)置migrate命令的超時(shí)時(shí)間
--cluster-simulate #模擬rebalance操作,不會真正執(zhí)行遷移操作
--cluster-pipeline <arg> #定義cluster getkeysinslot命令一次取出的key數(shù)量,默認(rèn)值為10
--cluster-threshold <arg> #遷移的slot閾值超過threshold,執(zhí)行rebalance操作
--cluster-replace #是否直接replace到目標(biāo)節(jié)點(diǎn)
add-node new_host:new_port existing_host:existing_port #添加節(jié)點(diǎn),把新節(jié)點(diǎn)加入到指定的集群,默認(rèn)添加主節(jié)點(diǎn)
--cluster-slave #新節(jié)點(diǎn)作為從節(jié)點(diǎn),默認(rèn)隨機(jī)一個(gè)主節(jié)點(diǎn)
--cluster-master-id <arg> #給新節(jié)點(diǎn)指定主節(jié)點(diǎn)
del-node host:port node_id #刪除給定的一個(gè)節(jié)點(diǎn),成功后關(guān)閉該節(jié)點(diǎn)服務(wù)
call host:port command arg arg .. arg #在集群的所有節(jié)點(diǎn)執(zhí)行相關(guān)命令
set-timeout host:port milliseconds #設(shè)置cluster-node-timeout
import host:port #將外部redis數(shù)據(jù)導(dǎo)入集群
--cluster-from <arg> #將指定實(shí)例的數(shù)據(jù)導(dǎo)入到集群
--cluster-copy #migrate時(shí)指定copy
--cluster-replace #migrate時(shí)指定replace
① 創(chuàng)建集群主節(jié)點(diǎn):
redis-cli --cluster create ip:port
② 創(chuàng)建集群主從節(jié)點(diǎn):
redis-cli --cluster create ip:port ip1:port1 --cluster-replicas 1 --cluster-replicas 參數(shù)為數(shù)字,1表示每個(gè)主節(jié)點(diǎn)需要1個(gè)從節(jié)點(diǎn)。
③ 添加集群主節(jié)點(diǎn):
redis-cli --cluster add-node ip:port
④ 添加集群從節(jié)點(diǎn):把ip:port節(jié)點(diǎn)加入到ip_master:port_master,當(dāng)做node_id為 117457eab5071954faab5e81c3170600d5192270 的從節(jié)點(diǎn),如不指定 --cluster-master-id 會隨機(jī)分配到任意一個(gè)主節(jié)點(diǎn)。redis-cli --cluster add-node ip:port ip_master:port_master --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d519227
⑤ 刪除節(jié)點(diǎn):有slot分配的主節(jié)點(diǎn)不能直接刪除。redis-cli --cluster del-node
:port f6a6957421b80409106cb36be3c7ba41f3b603ff
注意:當(dāng)被刪除掉的節(jié)點(diǎn)重新起來之后不能自動加入集群,但其和主的復(fù)制還是正常的,也可以通過該節(jié)點(diǎn)看到集群信息(通過其他正常節(jié)點(diǎn)已經(jīng)看不到該被del-node節(jié)點(diǎn)的信息)。
如果想要再次加入集群,則需要先在該節(jié)點(diǎn)執(zhí)行cluster reset,再用add-node進(jìn)行添加,進(jìn)行增量同步復(fù)制。
⑥ 檢查集群:任意連接一個(gè)集群節(jié)點(diǎn),進(jìn)行集群狀態(tài)檢查
redis-cli --cluster check 192.168.198.102:6384 --cluster-search-multiple-owners
⑦ 集群信息查看:說明:檢查ke
redis-cli --cluster set-timeout 192.168.163.112:6382 10000
y、slots、從節(jié)點(diǎn)個(gè)數(shù)的分配情況
redis-cli --cluster info ip:port
⑧ 修復(fù)集群:修復(fù)集群和槽的重復(fù)分配問題
redis-cli --cluster fix ip:port --cluster-search-multiple-owners
⑨ 設(shè)置集群的超時(shí)時(shí)間 :連接到集群的任意一節(jié)點(diǎn)來設(shè)置集群的超時(shí)時(shí)間參數(shù)cluster-node-timeout
redis-cli --cluster set-timeout 192.168.163.132:6382 1000
⑩ 集群中執(zhí)行相關(guān)命令:連接到集群的任意一節(jié)點(diǎn)來對整個(gè)集群的所有節(jié)點(diǎn)進(jìn)行設(shè)置。
redis-cli --cluster call ip:6381 config set requirepass cc
redis-cli -a cc --cluster ip1:6381 config set masterauth cc
redis-cli -a cc --cluster call ip2:6381 config rewrite
6、Redis 6.0 新增了幾個(gè)命令:fix 的子命令:--cluster-fix-with-unreachable-masters
call的子命令:--cluster-only-masters、--cluster-only-replicas
集群節(jié)點(diǎn)備份:backup
7、遷移
① 在線遷移slot :在線把集群的一些slot從集群原來slot節(jié)點(diǎn)遷移到新的節(jié)點(diǎn),即可以完成集群的在線橫向擴(kuò)容和縮容。有2種方式進(jìn)行遷移
1)直接連接到集群的任意一節(jié)點(diǎn):
redis-cli -a cc --cluster reshard ip:port
2)連接到集群的任意一節(jié)點(diǎn)來對指定節(jié)點(diǎn)指定數(shù)量的slot進(jìn)行遷移到指定的節(jié)點(diǎn):
redis-cli -a cc --cluster reshard 192.168.165.132:6379 --cluster-from 117457eab5071954faab5e81c3170600d5192270 --cluster-to 815da8448f5d5a304df0353ca10d8f9b77016b28 --cluster-slots 10 --cluster-yes --cluster-timeout 5000 --cluster-pipeline 10 --cluster-replace
② 平衡(rebalance)slot :
1)平衡集群中各個(gè)節(jié)點(diǎn)的slot數(shù)量
redis-cli -a cc --cluster rebalance 192.168.163.132:6379
2)根據(jù)集群中各個(gè)節(jié)點(diǎn)設(shè)置的權(quán)重等平衡slot數(shù)量(不執(zhí)行,只模擬)redis-cli -a cc --cluster rebalance --cluster-weight 117457eab5071954faab5e81c3170600d5192270=5 815da8448f5d5a304df0353ca10d8f9b77016b28=4 56005b9413cbf225783906307a2631109e753f8f=3 --cluster-simulate 192.168.163.132:6379
③ 導(dǎo)入集群:外部Redis實(shí)例(9021)導(dǎo)入到集群中的任意一節(jié)點(diǎn)。
redis-cli --cluster import 192.168.165.132:6379 --cluster-from 192.168.165.132:9021 --cluster-replace
注意:測試下來發(fā)現(xiàn)參數(shù)--cluster-replace沒有用,如果集群中已經(jīng)包含了某個(gè)key,在導(dǎo)入的時(shí)候會失敗,不會覆蓋,只有清空集群key才能導(dǎo)入。
如果集群設(shè)置了密碼,也會導(dǎo)入失敗,需要設(shè)置集群密碼為空才能進(jìn)行導(dǎo)入(call)。通過monitor(9021)的時(shí)候發(fā)現(xiàn),在migrate的時(shí)候需要密碼進(jìn)行auth認(rèn)證。