上篇介紹了Redis的基本情況、單機版的安裝以及基本數據型別,詳情請點選這裏。
本篇文章主要介紹Redis的常用命令、redis.conf組態檔的介紹、數據持久化的兩種方式以及叢集的搭建。
叢集搭建所需檔案:
鏈接:https://pan.baidu.com/s/1kVOpe2hO1wAXn6mfvBoZXw
提取碼:hxfe
ping
: 測試 redis 是否鏈接 如果已鏈接返回 PONG
echo value
: 測試 redis 是否鏈接 如果已鏈接返回 echo 命令後給定的值
keys *
:返回所有的 key,可以加*通配 (重點掌握)
exists key
: 判斷 string 型別一個 key 是否存在 如果存在返回 1 否則返回 0
expire key time(s)
: 設定一個 key 的過期時間 單位秒。時間到達後會刪除 key 及 value (重點掌握)
ttl key
:查詢已設定過期時間的 key 的剩餘時間 如果返回-2 表示該鍵值對已經被刪除,如果沒有設定失效時間,會返回-1 (重點掌握)
persist
: 移除給定 key 的過期時間 (重點掌握)
select dbindex
: 選擇數據庫(0-15)
move key dbIndex
: 將當前數據庫中的 key 轉移到其他數據庫中
dbsize
: 返回當前數據庫中的 key 的數目
info
: 獲取伺服器的資訊和統計
flushdb
: 刪除當前選擇的數據庫中的 key
flushall
: 刪除所有數據庫中的所有 key
quit
: 退出連線,這時候redis還在後台執行。
./redis-cli shutdown 纔是真正的結束redis
由於組態檔比較長,這裏將組態檔的中文註釋全部給出來。
在redis的安裝目錄下的bin目錄中有一個redis.conf檔案,使用vim編輯檢視即可,稍微重要一點的我會用空格換行加橫線進行表明,具體內容如下所示:
#redis.conf
# Redis configuration file example.
# ./redis-server /path/to/redis.conf
################################## INCLUDES
###################################
#這在你有標準設定模板但是每個 redis 伺服器又需要個性設定的時候很有用。
# include /path/to/local.conf
# include /path/to/other.conf
################################ GENERAL #####################################
#——————————————————————————————
#是否在後台執行,yes:後臺執行;no:不是後臺執行(老版本預設)
daemonize yes
#——————————————————————————————
#3.2 裡的參數,是否開啓保護模式,預設開啓。要是設定裡沒有指定 bind 和密碼。開啓該參數後,redis
只會本地進行存取,拒絕外部存取。要是開啓了密碼 和 bind,可以開啓。否則最好關閉,設定爲no。
protected-mode yes
#redis 的進程檔案
pidfile /var/run/redis/redis-server.pid
#——————————————————————————————
#redis 監聽的埠號。
port 6379
#——————————————————————————————
#此參數確定了 TCP 連線中已完成佇列(完成三次握手之後)的長度, 當然此值必須不大於 Linux 系統定
義的/proc/sys/net/core/somaxconn 值,預設是 511,而 Linux 的預設參數值是 128。當系統並
髮量大並且用戶端速度緩慢的時候,可以將這二個參數一起參考設定。該內核參數預設值一般是 128,對
於負載很大的服務程式來說大大的不夠。一般會將它修改爲 2048 或者更大。在/etc/sysctl.conf 中
新增:net.core.somaxconn = 2048,然後在終端中執行 sysctl -p。
tcp-backlog 511
#——————————————————————————————
#指定 redis 只接收來自於該 IP 地址的請求,如果不進行設定,那麼將處理所有請求
#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
#——————————————————————————————
#數據庫的數量,預設使用的數據庫是 DB 0。可以通過」SELECT 「命令選擇一個 db
databases 16
#——————————————————————————————
#——————————————————————————————
################################ SNAPSHOTTING ################################
# 快照設定
# 註釋掉「save」這一行設定項就可以讓儲存數據庫功能失效
# 設定 sedis 進行數據庫映象的頻率。
# 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 檔案,rdb 檔案壓縮使用 LZF 壓縮演算法,yes:壓縮,但是需要一些 cpu 的消耗。no:不壓縮,需要更多的磁碟空間
rdbcompression yes
#是否校驗 rdb 檔案。從 rdb 格式的第五個版本開始,在 rdb 檔案的末尾會帶上 CRC64 的校驗和。這跟有利於檔案的容錯性,
但是在儲存 rdb 檔案的時候,會有大概 10%的效能損耗,所以如果你追求高效能,可以關閉該設定。
rdbchecksum yes
#——————————————————————————————
#rdb 檔案的名稱
dbfilename dump.rdb
#數據目錄,數據庫的寫入會在這個目錄。rdb、aof 檔案也會寫在這個目錄
dir /root/temp
#——————————————————————————————
################################# REPLICATION
#################################
#複製選項,slave 複製對應的 master。
# slaveof <masterip> <masterport>
#如果 master 設定了 requirepass,那麼 slave 要連上 master,需要有 master 的密碼才行。
masterauth 就是用來設定 master 的密碼,這樣可以在連上 master 後進行認證。
# masterauth <master-password>
#當從庫同主機失去連線或者複製正在進行,從機庫有兩種執行方式:1) 如果
slave-serve-stale-data 設定爲 yes(預設設定),從庫會繼續響應用戶端的請求。2) 如果
slave-serve-stale-data 設定爲 no,除去 INFO 和 SLAVOF 命令之外的任何請求都會返回一個錯
誤」SYNC with master in progress」。
slave-serve-stale-data yes
#作爲從伺服器,預設情況下是隻讀的(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 禁用這個特性。
# Setting one or the other to 0 disables the feature.
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.
################################## SECURITY
###################################
#requirepass 設定可以讓使用者使用 AUTH 命令來認證密碼,才能 纔能使用其他命令。這讓 redis 可以使用在不受信任的網路中。爲了保持向後的相容性,可以註釋該命令,因爲大部分使用者也不需要認證。使用requirepass 的時候需要注意,因爲 redis 太快了,每秒可以認證 15w 次密碼,簡單的密碼很容易被攻破,所以最好使用一個更復雜的密碼。
# requirepass foobared
#把危險的命令給修改成其他名稱。比如 CONFIG 命令可以重新命名爲一個很難被猜到的命令,這樣使用者不能使用,而內部工具還能接着使用。
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#設定成一個空的值,可以禁止一個命令
# rename-command CONFIG ""
################################### LIMITS
####################################
# 設定能連上 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 請求。寫命令包括: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 檢測的樣本數。使用 lru 或者 ttl 淘汰演算法,從需要淘汰的列表中隨機選擇 sample 個 key,選出
閒置時間最長的 key 移除。
# maxmemory-samples 5
############################## APPEND ONLY MODE ###############################
#預設 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
################################ LUA SCRIPTING ###############################
# 如果達到最大時間限制(毫秒),redis 會記個 log,然後返回 error。當一個指令碼超過了最大時限。
只有 SCRIPT KILL 和 SHUTDOWN NOSAVE 可以用。第一個可以殺沒有調 write 命令的東西。要是已經
呼叫了 write,只能用第二個命令殺。
lua-time-limit 5000
#——————————————————————————————
################################ REDIS CLUSTER ###############################
#叢集開關,預設是不開啓叢集模式。
# cluster-enabled yes
#——————————————————————————————
#叢集組態檔的名稱,每個節點都有一個叢集相關的組態檔,持久化儲存叢集的資訊。這個檔案並不需要手動設定,這個組態檔有 Redis 生成並更新,每個 Redis 叢集節點需要一個單獨的組態檔,請確保與範例執行的系統中組態檔名稱不衝突
# cluster-config-file nodes-6379.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
################################## SLOW LOG
###################################
###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
################################ LATENCY MONITOR
##############################
#延遲監控功能是用來監控 redis 中執行比較緩慢的一些操作,用 LATENCY 列印 redis 範例在跑命令時
的耗時圖表。只記錄大於等於下邊設定的值的操作。0 的話,就是關閉監視。預設延遲監控功能是關閉的,
如果你需要開啓,也可以通過 CONFIG SET 命令動態設定。
latency-monitor-threshold 0
############################# EVENT NOTIFICATION
##############################
#鍵空間通知使得用戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 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,否則的話,不管其餘的參數是什麼,都不會有任何 通知被分發。
詳細使用可以參考 http://redis.io/topics/notifications
notify-keyspace-events ""
############################### ADVANCED CONFIG
###############################
#數據量小於等於 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
#數據量小於等於 list-max-ziplist-entries 用 ziplist,大於 list-max-ziplist-entries
用 list。
list-max-ziplist-entries 512#value 大小小於等於 list-max-ziplist-value 的用
ziplist,大於 list-max-ziplist-value 用 list。
list-max-ziplist-value 64
#數據量小於等於 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
#Redis 將在每 100 毫秒時使用 1 毫秒的 CPU 時間來對 redis 的 hash 表進行重新 hash,可以降低記憶體
的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受 Redis 時不時的對請求有 2 毫秒的延
遲的話,把這項設定爲 no。如果沒有這麼嚴格的實時性要求,可以設定爲 yes,以便能夠儘可能快的釋放
記憶體。activerehashing yes
##對用戶端輸出緩衝進行限制可以強迫那些不從伺服器讀取數據的用戶端斷開連線,用來強制關閉傳輸緩
慢的用戶端。
#對於 normal client,第一個 0 表示取消 hard limit,第二個 0 和第三個 0 表示取消 soft limit,
normal client 預設取消限制,因爲如果沒有尋問,他們是不會接收數據的。
client-output-buffer-limit normal 0 0 0#對於 slave client 和 MONITER client,如果
client-output-buffer 一旦超過 256mb,又或者超過 64mb 持續 60 秒,那麼伺服器就會立即斷開客
戶端連線。
client-output-buffer-limit slave 256mb 64mb 60#對於 pubsub client,如果
client-output-buffer 一旦超過 32mb,又或者超過 8mb 持續 60 秒,那麼伺服器就會立即斷開客戶
端連線。
client-output-buffer-limit pubsub 32mb 8mb 60
#redis 執行任務的頻率爲 1s 除以 hz。
hz 10
#在 aof 重寫的時候,如果打開了 aof-rewrite-incremental-fsync 開關,系統會每 32MB 執行一
次 fsync。這對於把檔案寫入磁碟是有幫助的,可以避免過大的延遲峯值。
aof-rewrite-incremental-fsync yes
其餘的可以根據註釋進行檢視,可能格式的原因,所以會有點難看。
對記憶體中數據庫狀態進行快照。
RDB 方式:將 Redis 在記憶體中的數據庫狀態儲存到磁盤裏面,RDB 檔案是一個經過壓縮的二進制檔案,通過該檔案可以還原生成 RDB 檔案時的數據庫狀態 ( 預設下,持久化到dump.rdb 檔案,並且在 redis 重新啓動後,自動讀取其中檔案,據悉,通常情況下一千萬的字串型別鍵,1GB 的快照檔案,同步到記憶體中的 時間是 20-30 秒)
RDB 的生成方式:
簡述:
(1)SAVE命令爲什麼會阻塞Redis伺服器進程呢?
Redis是以單進程的形式執行的,如果執行了一個SAVE命令,此時這個SAVE命令會在Redis進程當中執行,SAVE命令是做數據持久化,而這個數據持久化是有時間的,它要做I/O處理,這個時候會造成執行緒阻塞,直到RDB檔案備份完成,在備份期間任何命令操作都不能去執行。
(2)BGSAVE是啓動一個新的子進程,在新的進程當中去執行這個數據的備份,這個時候還是會阻塞,但是阻塞僅僅是阻塞子進程,對於父進程(伺服器進程)是沒有任何影響的,父進程可以繼續處理命令請求的。在平時開發中,推薦使用這個命令。
那麼只要滿足以下三個條件中的任意一個,BGSAVE 命令就會被執行
伺服器在 900 秒之內,對數據庫進行了至少 1 次修改
伺服器在 300 秒之內,對數據庫進行了至少 10 次修改
伺服器在 60 秒之內,對數據庫進行了至少 10000 次修改
dump.rdb 檔案的存放位置爲:在哪個目錄下啓動redis,就會在哪個目錄下生成這個檔案,組態檔中的(./)就是這個意思。
AOF 持久化方式在 redis 中預設是關閉的,需要修改組態檔開啓該方式。
AOF:把每條命令都寫入檔案,類似 mysql 的 binlog 日誌。
AOF 方式:是通過儲存 Redis 伺服器所執行的寫命令來記錄數據庫狀態的檔案。
AOF 檔案重新整理的方式,有三種:
appendfsync always - 每提交一個修改命令都呼叫 fsync 重新整理到 AOF 檔案,非常非常慢,但也非常安全。
appendfsync everysec - 每秒鐘都呼叫 fsync 重新整理到 AOF 檔案,很快,但可能會丟失一秒以內的數據。
appendfsync no - 依靠 OS 進行重新整理,redis 不主動重新整理 AOF,這樣最快,但安全性就差。
預設並推薦每秒重新整理,這樣在速度和安全上都做到了兼顧
AOF 數據恢復方式:
伺服器在啓動時,通過載入和執行 AOF 檔案中儲存的命令來還原伺服器關閉之前的數據庫狀態,具體過程:
如果同時啓用了 RDB 和 AOF 方式,AOF 優先,啓動時只載入 AOF 檔案恢復數據
開啓AOF方式步驟:
首先進入redis.conf組態檔:
將no改爲yes,檔案存放的位置預設在bin目錄下,還有重新整理的方法,預設推薦是每秒重新整理一次。
Redis3.0 版本之後支援 Cluster。
叢集要求叢集節點中必須要支援主備模式,也就說集中的主節點(Master)至少要有一個從節點(Slave),下圖中的每一個藍色的圈都代表着一個 redis 叢集中的主節點。它們任何兩個節點之間都是相互連通的。
用戶端可以與任何一個節點相連線,然後就可以存取叢集中的任何一個節點。對其進行存取和其他操作。
Redis 之間通過互相的 ping-pong 判斷是否節點可以連線上。如果有一半以上的節點去ping 一個節點的時候沒有迴應,叢集就認爲這個節點宕機了,然後去連線它的從節點。如果某個節點和所有從節點全部掛掉,我們叢集就進入 fail 狀態。還有就是如果有一半以上的主節點宕機,那麼我們叢集同樣進入 fail 了狀態。這就是我們的 redis 的投票機制 機製,具體原理如下圖所示:
投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超時(cluster-node-timeout),認爲當前 master 節點掛掉.
問題:什麼時候整個叢集不可用(cluster_state:fail)?
當我們的存取的 key 到達的時候,redis 會根據 crc16 的演算法得出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作。
在 Node1 執行 set name oldou
1. 使用 CRC16 演算法對 key 進行計算,得到一個數字,然後對數位進行取餘。
CRC16 : name = 26384
26384%16384 = 10000
2. 查詢到包含 10000 插槽的節點,比如是 node2,自動跳轉到 node2
3. 在 node2 上執行 set name oldou命令完成數據的插入
4. 如果在 node1 上執行 get name,先使用 CRC16 演算法對 key 進行計算,在使用16384 取餘,得到插槽的下標,然後跳到擁有該插槽的 node2 中執行 get name 命令,並返回結果。
redis 叢集時需要使用一個 ruby 的指令碼來完成叢集。
進入到/root/temp/redis-3.0.0/src
目錄下,查詢命令:ll *.rb
就可以看到一個檔案,在執行這個檔案之前,需要我們安裝一個ruby。
第一步:安裝 ruby 環境
命令: yum install ruby
第二步:安裝 ruby 的包管理器
命令:yum install rubygems
第三步:在 redis 的安裝目錄下的 src 目錄下找到 redis-trib.rb 這個檔案,這是叢集時需要的指令碼
第四步:這個指令碼的執行需要依賴於一些其他的 ruby 包 所以我們還要下載一個redis-3.0.0.gem,將這個檔案上傳到 linux 伺服器的temp中(這個檔案在資料的ruby和redis介面資料夾中)。
第五步:安裝這個 ruby 包—進入到temp目錄中
命令:gem install redis-3.0.0.gem
第六步:先啓動 redis 的 6 個範例–(暫時沒有,這個時候建立)
先在 local 目錄下建立一個目錄名稱爲:redis-cluster
命令:mkdir redis-cluster
第七步:將安裝好的 單機版redis下的 bin 目錄拷貝到 redis-cluster 目錄下 並起名爲 redis01
命令:進入到 redis 目錄下執行:cp -r bin ../redis-cluster/redis01
之後進入到redis01中刪除dump.rdb 與 apeendonly.aof 檔案, 然後再修改redis01中的組態檔,vim編輯redis.conf檔案修改的地方如下:
修改完成儲存並且退出,第三個圖特別重要,如果不開啓的話就不能建立叢集。
然後進入到/usr/local/redis-cluster的目錄下,將redis01拷貝5份:
命令:
cp -r redis01/ redis02
cp -r redis01/ redis03
cp -r redis01/ redis04
cp -r redis01/ redis05
cp -r redis01/ redis06
第八步:修改 redis.conf 組態檔–修改拷貝的這些 redis 的埠
命令:vim redis.conf
(1)修改埠:預設的爲 6379 將六個 redis 範例的埠改成從 8001-8006 在組態檔的 port 屬性中。
命令:
[root@localhost redis-cluster]# vim redis02/redis.conf
[root@localhost redis-cluster]# vim redis03/redis.conf
[root@localhost redis-cluster]# vim redis04/redis.conf
[root@localhost redis-cluster]# vim redis05/redis.conf
[root@localhost redis-cluster]# vim redis06/redis.conf
第九步 把建立叢集的 ruby 指令碼複製到 redis-cluster 中
cd /root/temp/redis-3.0.0/src/ 進入到該目錄下
cp *.rb /usr/local/redis-cluster/ 拷貝
第十步 建立一個能夠批次啓動的指令碼程式,在redis-cluster的目錄下執行以下命令
命令:vim startall.sh
第十一步 在指令碼檔案中新增命令
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
第十二步:將批次啓動指令碼設定爲可執行許可權
命令:chmod +x startall.sh
第十三步 執行這個批次啓動的指令碼
命令:./startall.sh
第十四步 檢視 redis 是否啓動成功
命令:ps aux|grep redis
第十五步 建立叢集
命 令 : ./redis-trib.rb create --replicas 1 192.168.15.132:8001 192.168.15.132:8002 192.168.15.132:8003 192.168.15.132:8004 192.168.15.132:8005 192.168.15.132:8006
控制檯會顯示如下資訊 輸入 yes
Connecting to node 192.168.122.129:8001: OK
Connecting to node 192.168.122.129:8002: OK
Connecting to node 192.168.122.129:8003: OK
Connecting to node 192.168.122.129:8004: OK
Connecting to node 192.168.122.129:8005: OK
Connecting to node 192.168.122.129:8006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.122.129:8001
192.168.122.129:8002
192.168.122.129:8003
Adding replica 192.168.122.129:8004 to 192.168.122.129:8001
Adding replica 192.168.122.129:8005 to 192.168.122.129:8002
Adding replica 192.168.122.129:8006 to 192.168.122.129:8003
M: 6ab91146f6757f18beafd45b962489cab3d341f7 192.168.122.129:8001
slots:0-5460 (5461 slots) master
M: e4f4d7176f11272f29c6a35fb47ae4078557c9ab 192.168.122.129:8002
slots:5461-10922 (5462 slots) master
M: 06d1a2d7cd21d9b43b115c222a34ebce6f007d77 192.168.122.129:8003
slots:10923-16383 (5461 slots) master
S: 9ac5a60f61197d364a3e4da1887ddbfb311145bd 192.168.122.129:8004
replicates 6ab91146f6757f18beafd45b962489cab3d341f7
S: f7c22c52f2ce2096f54429c48a8d4b7027f6d7b3 192.168.122.129:8005
replicates e4f4d7176f11272f29c6a35fb47ae4078557c9ab
S: e4c559c018adccc965171eaa4b19d1a51a4f025a 192.168.122.129:8006
replicates 06d1a2d7cd21d9b43b115c222a34ebce6f007d77
Can I set the above configuration? (type 'yes' to accept): yes
上圖中的M表示主節點,S表示從節點。
如果控制檯輸出如下資訊表叢集成功
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.122.129:8001)
M: 6ab91146f6757f18beafd45b962489cab3d341f7 192.168.122.129:8001
slots:0-5460 (5461 slots) master
M: e4f4d7176f11272f29c6a35fb47ae4078557c9ab 192.168.122.129:8002
slots:5461-10922 (5462 slots) master
M: 06d1a2d7cd21d9b43b115c222a34ebce6f007d77 192.168.122.129:8003
slots:10923-16383 (5461 slots) master
M: 9ac5a60f61197d364a3e4da1887ddbfb311145bd 192.168.122.129:8004
slots: (0 slots) master
replicates 6ab91146f6757f18beafd45b962489cab3d341f7
M: f7c22c52f2ce2096f54429c48a8d4b7027f6d7b3 192.168.122.129:8005
slots: (0 slots) master
replicates e4f4d7176f11272f29c6a35fb47ae4078557c9ab
M: e4c559c018adccc965171eaa4b19d1a51a4f025a 192.168.122.129:8006
slots: (0 slots) master
replicates 06d1a2d7cd21d9b43b115c222a34ebce6f007d77
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
建立叢集成功之後,在每個redis01/redis02/…的目錄下都會產生:
第十六步 編寫關閉指令碼
編寫一個批次關閉的指令碼
命令:vim shutdown.sh
redis01/redis-cli -h 192.168.15.132 -p 8001 shutdown
redis01/redis-cli -h 192.168.15.132 -p 8002 shutdown
redis01/redis-cli -h 192.168.15.132 -p 8003 shutdown
redis01/redis-cli -h 192.168.15.132 -p 8004 shutdown
redis01/redis-cli -h 192.168.15.132 -p 8005 shutdown
redis01/redis-cli -h 192.168.15.132 -p 8006 shutdown
分配許可權chmod +x shutdown.sh
測試 Redis 叢集:可以連線叢集中的任意一個節點進行測試 注意一定要有-c 參數,否則能連上,但是無法操作 redis 叢集
命令: ./redis01/redis-cli -h 192.168.15.132 -p 8001 -c
注意:一定要加-c 不然會把你當作一個單機來處理。