Redis服務之經常使用配置(三)

  上一篇博客咱們聊了下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命令用於獲取指定個數的慢日誌,若是沒有指定慢日誌條目數表示獲取當前隊列全部日誌;

相關文章
相關標籤/搜索