![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLzlGZlJXNykDN3EDMxQDMwIzXv9CXwcTO1UjNx8CX0cDOx0SbvhWdpF3Lc12bj91cn9Gbi52YvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
redis同步資料的方式有兩種,一種是socket方式,所謂socker方式複制資料是指master在做快照時,不将快照存入磁盤,直接将rdb檔案通過網絡發送給從節點;這種方式如果是在多個從節點上同步資料,它是串行複制,也就是說第一個slave同步完成後,再同步第二個slave;disk是指主節點将rdb儲存到磁盤,然後在發送給從節點;disk方式同步資料在多個slave情景中,它可以共享rdb檔案,主節點不用重複生成多個相同的rdb發送給slave;通常情況隻有在磁盤速度緩慢但是網絡相對較快的情況下才使用 socket 方式,否則都是用disk方式;
上一篇部落格我們聊了下redis的rdb持久化、安全連接配接、資源限制相關配置;回顧請參考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我們來聊一聊redis主從複制、aof持久化、叢集、慢日志相關配置;
REPLICATION 相關配置
slaveof <masterip> <masterport>:該指令用于指定redis主從複制中的master的ip位址和端口;
示例:
提示:redis預設工作在master模式,配置了這個指令以後,redis預設會從master自動降級為slave角色;
提示:以上配置表示讓本機redis從屬于192.168.0.41 ;也就是說192.168.0.41是master,本節點為slave;
masterauth <master-password>:該指令用于指定連接配接master的密碼
提示:以上配置表示指定連接配接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檔案通過網絡發送給從節點;這種方式如果是在多個從節點上同步資料,它是串行複制,也就是說第一個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-use-rdb-preamble:redis4.0 新增 RDB-AOF 混合持久化格式,在開啟了這個功能之後,AOF 重寫産生的檔案将同時包含 RDB 格式的内容和 AOF 格式的内容,其中 RDB 格式的内容用于記錄已有的資料,而 AOF 格式的記憶體則用于記錄最近發生了變化的資料,這樣 Redis 就可以同時兼有 RDB 持久化和AOF 持久化的優點(既能夠快速地生成重寫檔案,也能夠在出現問題時,快速地載入資料)。
aof-load-truncated:該指令用于指定是否開啟AOF恢複資料時,清除不完整語句(由伺服器掉電等因素造成語句不完整),預設yes表示加載清理不完整語句後的AOF檔案;no表示不清除不完整語句,直接加載AOF檔案(這樣會導緻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指令用于擷取指定個數的慢日志,如果沒有指定慢日志條目數表示擷取目前隊列所有日志;
作者:Linux-1874
出處:https://www.cnblogs.com/qiuhom-1874/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.