上一篇博客咱們聊了下redis的rdb持久化、安全鏈接、資源限制相關配置;回顧請參考:http://www.javashuo.com/article/p-pcirhphf-kb.html;今天咱們來聊一聊redis主從複製、aof持久化、集羣、慢日誌相關配置;html
REPLICATION 相關配置node
slaveof <masterip> <masterport>:該指令用於指定redis主從複製中的master的ip地址和端口;mysql
示例:redis
提示:redis默認工做在master模式,配置了這個指令之後,redis默認會從master自動降級爲slave角色;sql
提示:以上配置表示讓本機redis從屬於192.168.0.41 ;也就是說192.168.0.41是master,本節點爲slave;安全
masterauth <master-password>:該指令用於指定鏈接master的密碼bash
示例:服務器
提示:以上配置表示指定鏈接master認證密碼爲admin123.com;這個密碼是咱們在master上設置的requirepass 指令後面的密碼;一般建議一個集羣中的redis密碼和版本都弄成相同的;網絡
驗證:重啓redis,鏈接redis看看是否自動降級爲slave?併發
查看同步日誌
主節點日誌
從節點日誌
提示:從上面的日誌信息能夠了解到,redis的主從複製主要經歷了這幾個操做,第一slave鏈接master,併發送sync命令;第二是master接收到slave的sync命令後,開始執行bgsave命令生成rdb快照文件,並使用緩衝區記錄此後執行的全部命令;第三master執行完bgsave後,向全部的slave發送快照,並在發送期間繼續記錄被執行寫操做的命令;第四是slave接收到master的快照後,slave會丟棄以前存在的全部舊數據,而後將接收到的快照文件加載到內存;第五master發送完快照文件後,開始向slave發送緩衝區接收到寫操做命令;第六slave完成master發送過來的快照文件加載到內存後,開始接收master發送過來的緩衝區寫操做命令,而後將這些命令在slave上執行;第七後期的同步操做,slave會發送本身的slave_repl_offset位置給master,master會根據從服務器發送過來的slave_repl_offset位置,把這以後的數據以rdb快照的方式發送給從服務器;
驗證:查看slave中的數據是否和master中的數據同樣?
提示:從上面的結果看,master和salve都是空的,沒有數據
驗證:在master上寫入數據,看看slave上是否可以及時的同步過來?
提示:能夠看到在主服務器上執行寫操做,是可以及時的同步到從節點;
slave/replica-serve-stale-data:該指令用於指定當主從複製失去鏈接,或者主從節點正在同步數據,是否從從節點響應客戶端的讀請求,默認是yes表示從庫會繼續響應客戶端的讀請求;若是設置的no,除去指定點命令以外的任何請求都會返回一個錯誤「sync with master in progress」
示例:設置slave-serve-stale-data爲no 重啓redis ,而後將主庫宕機,在從庫執行讀操做,看看是否能夠讀?
重啓redis,在從庫上執行讀操做
提示:在主庫正常的狀況下,從庫能夠正常的執行讀操做。
把主庫宕機,看看從庫是否還能夠執行讀操做?
提示:當主庫宕機時,從庫上執行讀操做就報錯了;
slave/replica-read-only:該指令用於指定從庫是否能夠讀;默認是從庫只讀,不可寫;
repl-diskless-sync:該指令用於指定否使用socket方式複製數據;redis同步數據的方式有兩種,一種是socket方式,所謂socker方式複製數據是指在複製數據是master在作快照時,不將快照存入磁盤,直接將rdb文件經過socket方式發送給從節點;這種方式若是是在多個從節點上同步數據,它是串行復制,也就是說第一個slave同步完成後,再同步第二個slave;disk是指主節點將rdb保存到磁盤,而後在發送給從節點;disk方式同步數據在多個slave情景中,它能夠共享rdb文件,主節點不用重複生成多個相同的rdb發送給slave;一般狀況只有在磁盤速度緩慢可是網絡相對較快的狀況下才使用 socket 方式,不然都是用disk方式;
repl-diskless-sync-delay:該指令用於指定disk方式同步數據的延遲時間,單位秒;設置爲0 表示關閉延遲,關閉延遲則意味着一旦有同步請求,在同步開始到結束前,master不會再接收新的slave的同步請求,直到本次同步完成;
repl-ping-slave-period:該指令用於指定slave根據master指定的時間進行週期性的 PING 監測,單位秒;
repl-timeout:該指令用於指定複製連接超時時間,單位秒;一般這個超時時間要大於上面的repl-ping-slave-period指令指定的時間,不然會常常報同步鏈接超時;
repl-disable-tcp-nodelay:該指令用於指定socket模式下是否在slave套接字發送sync以後禁用TCP-NODELAY,若是該指令的值爲yes,則表示禁用TCP-NODELAY,這樣設置後,redis會使用更少的TCP包和帶寬向slave發送數據;可是這將使數據傳輸到 slave上有延遲,Linux 內核的默認配置會達到 40 毫秒;若是該指令的值爲no,數據傳輸到 salve 的延遲將會減小但要使用更多的帶寬;
repl-backlog-size:該指令用於指定複製緩衝區大小,只有在 slave 鏈接以後才分配內存,默認是1MB;
repl-backlog-ttl:該指令用於指定多少時間master沒有slave鏈接,master就狀況backlog緩衝區;默認是3600秒;
replica-priority:該指令用於指定當master不可用時,sentinel會根據slave的優先級選舉一個新master,最低的優先級的 slave,當選 master。而配置成 0,永遠不會被選舉。該選項默認是100
min-slaves-to-write:該指令用於指定最少slave數量,若是啓用這個選項,master檢測從服務的數量小於咱們指定數量,將拒絕寫請求;
示例:
提示:在slave小於咱們指定的最小slave數量時,master上執行寫操做命令就提示咱們沒有足夠的slave節點;
min-slaves-max-lag:該指令用於指定slave的最大延遲時間;若是slave的延遲時間超出咱們指定的時間,master就拒絕寫操做;
示例
提示:能夠看到延遲時間小於咱們指定的時間,主服務器上能夠正常執行寫操做;一般用min-slaves-max-lag和min-slaves-to-write這兩個選項來防止主庫不安全時主庫寫操做的命令執行;這兩個選項一塊兒使用只要有一個不知足條件,主庫將拒絕寫操做;
slave/replica-announce-ip:該指令用於指定當在端口轉發或NAT網絡環境中,slave有多個ip地址,可使用該選項指定slave的ip地址;
slave/replica-announce-port:該指令用於指定當在端口轉發或NAT網絡環境中,指定slave的端口;
APPEND ONLY MODE相關配置
appendonly:該指令 用於指定是否開啓AOF日誌記錄,默認是no不開啓; 默認 redis 使用的是 rdb 方式持久化,這種方式若是redis在作完快照後忽然宕機,會致使作快照期間寫的數據丟失(由於作快照期間的數據還在內存);AOF持久化是Redis 會把每次寫入的數據在接收後都寫入 appendonly.aof 文件(有點相似mysql中的binlog),每次啓動時 Redis 都會先把這個文件的數據讀入內存裏,先忽略 RDB 文件(優先級高於RDB)。
appendfilename:該指令用於指定AOF文件名稱,默認是appendonly.aof;該文件存儲在 dir 指令指定的目錄下,同rdb文件在同一個目錄下;
示例:
提示:以上配置表示開啓AOF日誌持久化,並保持爲appendonly.aof
驗證:重啓redis服務,看看對應目錄是否有對應的aof文件生成?
鏈接redis,執行寫操做命令,看看appendonly.aof中是否記錄?
[root@node1 ~]# redis-cli -a admin123.com 127.0.0.1:6379> KEYS * (empty list or set) 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k2 "v2" 127.0.0.1:6379> quit [root@node1 ~]# file /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof: ASCII text, with CRLF line terminators [root@node1 ~]# cat /var/lib/redis/appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $2 k1 $2 v1 *3 $3 set $2 k2 $2 v2 [root@node1 ~]#
提示:能夠看到AOF是一個文本文件,從AOF文件中能夠清晰看到咱們執行的set命令;
appendfsync:該指令用於指定AOF持久化策略的配置;no表示不自信fsync,有操做系統同步數據到磁盤,always表示每次寫入都執行fsync,以保證數據同步到磁盤,everysec表示每秒執行一次fsync同步數據到磁盤;默認是everysec;
no-appendfsync-on-rewrite:該指令用於指定在 aof rewrite 期間,是否對 aof 新記錄的 append 暫緩使用文件同步策略,主要考慮磁盤 IO 開支和請求阻塞時間。默認爲 no,表示"不暫緩",新的 aof 記錄仍然會被當即同步,Linux 的默認 fsync 策略是 30 秒,若是爲 yes 可能丟失 30 秒數據,但因爲 yes 性能較好並且會避免出現阻塞所以比較推薦。
auto-aof-rewrite-percentage:該指令用於指定當 AOF log 增加超過指定百分比例時,重寫 log file, 設置爲 0 表示不自動重寫 Aof 日誌,重寫是爲了使 aof 體積保持最小,而確保保存最完整的數據。
auto-aof-rewrite-min-size:該指令用於指定觸發AOF重寫的最小文件大小;
aof-load-truncated:該指令用於指定是否加載因爲其餘緣由致使的末尾異常的 AOF 文件;好比主進程被 kill/斷電等緣由形成的AOF文件異常;默認是yes表示加載;
aof-use-rdb-preamble:redis4.0 新增 RDB-AOF 混合持久化格式,在開啓了這個功能以後,AOF 重寫產生的文件將同時包含 RDB 格式的內容和 AOF 格式的內容,其中 RDB 格式的內容用於記錄已有的數據,而 AOF 格式的內存則用於記錄最近發生了變化的數據,這樣 Redis 就能夠同時兼有 RDB 持久化和AOF 持久化的優勢(既可以快速地生成重寫文件,也可以在出現問題時,快速地載入數據)。
LUA SCRIPTING相關配置
lua-time-limit:該指令用於指定lua腳本的最大執行時間,單位是毫秒;默認是5000毫秒;
REDIS CLUSTER相關配置
cluster-enabled:該指令用於指定是否開啓集羣模式,默認是單機模式;
cluster-config-file:該指令用於指定由 node 節點自動生成的集羣配置文件;
cluster-node-timeout:該指令用於指定集羣中 node 節點鏈接超時時間;
cluster-replica-validity-factor:該指令用於指定集羣有效因子,這個選項的值×cluster-node-timeout選項的值就等於節點當選master的有效時間;在執行故障轉移的時候可能有些節點和 master 斷開一段時間數據比較舊,這些節點就不適用於選舉爲 master,超過這個時間的就不會被進行故障轉移;
cluster-migration-barrier:該指令用於指定一個主節點擁有的至少正常工做的從節點,即若是主節點的 slave 節點故障後會將多餘的從節點分配到當前主節點成爲其新的從節點。默認是1;
cluster-require-full-coverage:該指令用於指定集羣槽位不全時,是否再也不對外提供服務;當集羣槽位覆蓋,若是一個主庫宕機且沒有備庫就會出現集羣槽位不全,那麼 yes 狀況下 redis 集羣槽位驗證不全就再也不對外提供服務,而 no 則能夠繼續使用可是會出現查詢數據查不到的狀況(由於有數據丟失)。
SLOW LOG 相關配置
slowlog-log-slower-than:該指令用於指定大於多少時間的命令執行時間爲慢日誌;單位微妙;該指令值爲負數表示禁用慢日誌,爲 0 會記錄每一個命令操做。
slowlog-max-len:該指令用於指定慢日誌隊列長度,超出該隊列長度會覆蓋最先的記錄,以此滾動刪除;
示例
提示:以上配置表示記錄每一個命令的操做爲慢日誌中,慢日誌的最大隊列長度爲10;
驗證:重啓redis,鏈接redis執行命令,看看是否都將執行的命令都記錄爲慢日誌中?
[root@node1 ~]# systemctl restart redis [root@node1 ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 511 192.168.0.41:6379 *:* LISTEN 0 511 127.0.0.1:6379 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* [root@node1 ~]# redis-cli -a admin123.com 127.0.0.1:6379> KEYS * 1) "k2" 2) "k1" 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k2 "v2" 127.0.0.1:6379> set k3 v3 OK 127.0.0.1:6379> SLOWLOG len (integer) 10 127.0.0.1:6379> SLOWLOG get 1) 1) (integer) 78 2) (integer) 1596294355 3) (integer) 2 4) 1) "REPLCONF" 2) "ACK" 3) "137" 2) 1) (integer) 77 2) (integer) 1596294354 3) (integer) 2 4) 1) "REPLCONF" 2) "ACK" 3) "137" 3) 1) (integer) 76 2) (integer) 1596294353 3) (integer) 3 4) 1) "REPLCONF" 2) "ACK" 3) "137" 4) 1) (integer) 75 2) (integer) 1596294352 3) (integer) 88 4) 1) "REPLCONF" 2) "ACK" 3) "137" 5) 1) (integer) 74 2) (integer) 1596294351 3) (integer) 3 4) 1) "REPLCONF" 2) "ACK" 3) "137" 6) 1) (integer) 73 2) (integer) 1596294350 3) (integer) 2 4) 1) "REPLCONF" 2) "ACK" 3) "137" 7) 1) (integer) 72 2) (integer) 1596294349 3) (integer) 3 4) 1) "REPLCONF" 2) "ACK" 3) "137" 8) 1) (integer) 71 2) (integer) 1596294348 3) (integer) 2 4) 1) "REPLCONF" 2) "ACK" 3) "137" 9) 1) (integer) 70 2) (integer) 1596294347 3) (integer) 3 4) 1) "REPLCONF" 2) "ACK" 3) "137" 10) 1) (integer) 69 2) (integer) 1596294346 3) (integer) 3 4) 1) "REPLCONF" 2) "ACK" 3) "123" 127.0.0.1:6379>
提示:從上面的日誌能夠看到慢日誌的對了長度只有10,可是咱們執行的命令沒有在裏面看到,緣由是咱們開啓了主從複製,後臺一直在執行REPLCONF ACK命令,把咱們執行的命令給覆蓋了;
驗證:關閉主從複製,鏈接redis,再執行命令,看看是否記錄咱們執行的命令?
[root@node1 ~]# systemctl restart redis [root@node1 ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 511 192.168.0.41:6379 *:* LISTEN 0 511 127.0.0.1:6379 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* [root@node1 ~]# redis-cli -a admin123.com 127.0.0.1:6379> KEYS * 1) "k1" 2) "k3" 3) "k5" 4) "k2" 5) "k4" 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k2 "v2" 127.0.0.1:6379> del k3 (integer) 1 127.0.0.1:6379> del k4 (integer) 1 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379> SLOWLOG len (integer) 8 127.0.0.1:6379> SLOWLOG get 3 1) 1) (integer) 8 2) (integer) 1596295476 3) (integer) 4 4) 1) "SLOWLOG" 2) "len" 2) 1) (integer) 7 2) (integer) 1596295454 3) (integer) 52 4) 1) "info" 2) "replication" 3) 1) (integer) 6 2) (integer) 1596295447 3) (integer) 10 4) 1) "del" 2) "k4" 127.0.0.1:6379> SLOWLOG get 1) 1) (integer) 9 2) (integer) 1596295482 3) (integer) 48 4) 1) "SLOWLOG" 2) "get" 3) "3" 2) 1) (integer) 8 2) (integer) 1596295476 3) (integer) 4 4) 1) "SLOWLOG" 2) "len" 3) 1) (integer) 7 2) (integer) 1596295454 3) (integer) 52 4) 1) "info" 2) "replication" 4) 1) (integer) 6 2) (integer) 1596295447 3) (integer) 10 4) 1) "del" 2) "k4" 5) 1) (integer) 5 2) (integer) 1596295442 3) (integer) 8 4) 1) "del" 2) "k3" 6) 1) (integer) 4 2) (integer) 1596295439 3) (integer) 7 4) 1) "get" 2) "k2" 7) 1) (integer) 3 2) (integer) 1596295437 3) (integer) 7 4) 1) "get" 2) "k1" 8) 1) (integer) 2 2) (integer) 1596295412 3) (integer) 31 4) 1) "KEYS" 2) "*" 9) 1) (integer) 1 2) (integer) 1596295408 3) (integer) 1410 4) 1) "COMMAND" 10) 1) (integer) 0 2) (integer) 1596295408 3) (integer) 4 4) 1) "AUTH" 2) "admin123.com" 127.0.0.1:6379>
提示:能夠看到關閉主從複製之後,重啓master後,再鏈接redis執行命令,在慢日誌中就能夠清楚看到咱們執行的命令;slowlog len命令用於獲取當前slowlog的對列長度;slowlog get命令用於獲取指定個數的慢日誌,若是沒有指定慢日誌條目數表示獲取當前隊列全部日誌;