1. 程式人生 > >redis主從同步和資料持久化詳解

redis主從同步和資料持久化詳解

一 主從同步
1 主從複製工作原理:
–slave向master傳送sync命令
–master啟動後臺存檔程序,並收集所有修改資料命令 //處理客戶端請求的程序與處理從伺服器請求同步的程序不一樣
–master完成後臺存檔後,傳送整個資料檔案到slave
–slave接受資料檔案,載入到記憶體中完成首次完全同步
–後續有新資料產生時,master繼續將新的資料收集到的修改命令依次傳給slave,完成同步

2 主從複製的缺點:
當網路或者系統繁忙時,會造成資料同步延時

3 配置主從同步結構
1)預設一個獨立的資料庫開啟後,它自己就是master
2)將52配自為資料庫51的從

192.168.4.52:6352> slaveof 192.168.4.51 6351  
192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up

3)主從結構模式下,訪問從庫時,可以正常查詢,為只讀模式,不可以寫入

slave_repl_offset:14
slave_priority:100
slave_read_only:1

4)當重啟redis服務後,主從模式消失,因為之前為手動配置,之前同步的資料被存入磁碟

4 永久配置從庫:修改主配置檔案
先關閉redis服務

[[email protected] ~]# vim /etc/redis/6379.conf  //永久生效
 282 slaveof 192.168.4.51 6351

啟動redis服務,檢視資訊:

192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1162
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:800f18261e0fe311310132e824216c0a4903fe32
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1162
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1121
repl_backlog_histlen:42

5 臨時不做從庫,反客為主:

192.168.4.52:6352> slaveof no one

6 當主庫有密碼時,設定從庫:
修改從庫配置檔案

 288 masterauth 123456
  重啟redis服務

7 在登入狀態下,可以臨時修改配置檔案選項:

192.168.4.53:6353> slaveof no one
OK
192.168.4.53:6353> config set  masteranth="123456"   //只對當前程序有效,服務重啟後,設定失效
OK
192.168.4.53:6353> slaveof 192.168.4.51 6351
OK
192.168.4.53:6353> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up

8 主從從結構:

52做51的從,53做52的從。
直接在53的配置檔案修改

282 slaveof 192.168.4.52 6352

檢視52的複製狀態:(52現在為雙重身份,既為主又為從)

 192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:1568
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=192.168.4.53,port=6353,state=online,offset=1568,lag=1                 //表示有一個從庫53
master_replid:799b5472c74f57b29859779bbfbd620ebf172aa6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1568
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:1526

9 將54配置為51的從庫,在配置之前存放在本機54的資料如何儲存

 192.168.4.54:6354> keys *
1) "q2"
2) "q1"
3) "q3"
 192.168.4.54:6354> config set masterauth "123456"                    //只對當前程序有效,服務重啟後,設定失效
192.168.4.54:6354> slaveof 192.168.4.51 6351
OK
192.168.4.54:6354> info replication

 Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_second

192.168.4.54:6354> keys *        //之前儲存的資料消失了 51將資料同步時,將54上的資料給覆蓋來了!!!!
1) "r"
2) "y"
3) "t"
4) "x"
5) "w"

10 哨兵模式:(哨兵伺服器提供redis主從同步服務的高可用)
1)將55主機設為主庫,命令列新增密碼,臨時生效

192.168.4.55:6355> config set requirepass "123456"
 OK

退出後再次用密碼登入

 192.168.4.55:6355> info replication
NOAUTH Authentication required.

2)56主機設為55的從庫,命令列設定臨時生效

192.168.4.56:6356> config set masterauth "123456"
OK
192.168.4.56:6356> slaveof 192.168.4.55 6355
OK
192.168.4.56:6356> info replication
# Replication

role:slave
master_host:192.168.4.55
master_port:6355
master_link_status:up

3)主機54停止redis服務,配置哨兵伺服器,runtest-sentinel是redis軟體內的服務程式 (另外配置54為主,55為從)
監視當前的主庫。當主庫宕機後,自動將從庫提升為master伺服器
在原始碼包內有一個模板檔案

[[email protected] redis-4.0.8]# ls
00-RELEASENOTES  CONTRIBUTING  deps     Makefile   README.md   runtest          runtest-sentinel  src    utils
BUGS             COPYING       INSTALL  MANIFESTO  redis.conf  runtest-cluster  sentinel.conf     tests
[[email protected] redis-4.0.8]# cat sentinel.conf 

也可以直接編輯一個檔案:

[[email protected] ~]# vim /etc/sentinel.conf
bind 0.0.0.0                //本機所有地址
sentinel monitor  mysql55 192.168.4.55 6355 1                  格式:sentinel monitor +主機名 + 需要監控主庫的IP地址 + 埠號 + 次數
sentinel auth-pass mysql55 123456                                       次數:表示有多少臺哨兵伺服器發現主庫宕機了才確定主庫真正宕機了,再執行提升slave為master

4)啟動哨兵程式

[[email protected] ~]# redis-sentinel /etc/sentinel.conf               //執行哨兵程式
3656:X 03 Dec 15:20:18.099 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3656:X 03 Dec 15:20:18.099 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=3656, just started
3656:X 03 Dec 15:20:18.099 # Configuration loaded
3656:X 03 Dec 15:20:18.099 * Increased maximum number of open files to 10032 (it was originally set to 1024).


             _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 3656
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3656:X 03 Dec 15:20:18.101 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3656:X 03 Dec 15:20:18.147 # Sentinel ID is 5d38dea86f2d1a8325530c07699ad9d64749c6bf
3656:X 03 Dec 15:20:18.147 # +monitor master mysql55 192.168.4.55 6355 quorum 1
3656:X 03 Dec 15:20:18.148 * +slave slave 192.168.4.56:6356 192.168.4.56 6356 @ mysql55 192.168.4.55 6355

5)測試:
將55主庫的redis服務停止:測試哨兵伺服器的功能

[[email protected] ~]# redis-cli -h 192.168.4.55 -p 6355 -a 123456 shutdown

在56上檢視複製狀態:(已經變為主庫)

192.168.4.56:6356> info replication
# Replication
role:master
connected_slaves:0

再開一個[終端檢視哨兵配置檔案:(配置檔案已經被自動修改)

[email protected] ~]# vim /etc/sentinel.conf
bind 0.0.0.0
sentinel myid 5d38dea86f2d1a8325530c07699ad9d64749c6bf
sentinel monitor mysql55 192.168.4.56 6356 1
# Generated by CONFIG REWRITE
port 26379
dir "/root"
sentinel auth-pass mysql55 123456
sentinel config-epoch mysql55 1
sentinel leader-epoch mysql55 1
sentinel known-slave mysql55 192.168.4.55 6355
sentinel current-epoch 1

將55恢復redis服務,此時55會自動變為56的從庫:

192.168.4.55:6355> info replication

# Replication
role:slave
master_host:192.168.4.56
master_port:6356
master_link_status:up

注意:哨兵伺服器可以配置在從庫的主機上,節省資源

二 redis持久化:
1 rdb介紹:
1) redis資料庫檔案,全稱 Redis DataBase
–資料持久化方式之一
–按照指定時間間隔,將記憶體中的資料集快照寫入硬碟 //定期時間間隔為配置檔案設定
–術語叫Snapshot快照
–恢復時,將快照檔案直接讀入記憶體

2)相關配置引數:
檔名:
–dbfilename “dump.rdb” //檔名
–save “” //禁用RDB
從記憶體儲存到硬碟的頻率
–save 900 1 //900秒即15分鐘內且有1次修改
–save 300 10 //300秒即5分鐘內且有10次修改
–save 60 10000 //60秒即1分鐘內且有10000次修改
配置檔案裡定義資料庫檔名
[[email protected] ~]# vim /etc/redis/6379.conf
253 # The filename where to dump the DB
254 dbfilename dump.rdb
壓縮
–rdbcompression yes|no (節省空間,耗費cpu)
在儲存快照後,使用crc16演算法做資料校驗
–rdbchecksum yes|no (保證資料完整性)
bgsave出錯時停止寫操作
–stop-writes-on-bgsave-error yes|no

3)手動立刻存檔
–save //阻塞寫存檔
–bgsave //不阻塞寫存檔

4) 使用RDB檔案恢復資料
備份資料: 備份dump.rdb 檔案到其他位置

[[email protected] ~]# cp /var/lib/redis/6379/dump.rdb /root

恢復資料: 拷貝檔案到資料庫目錄,重啟redis服務

[[email protected] ~]# /etc/init.d/redis_6379 stop   //先停止服務
[[email protected] ~]# rm -rf /var/lib/redis/6379/dump.rdb  //刪除資料庫檔案[
[[email protected] ~]# cp /root/dump.rdb /var/lib/redis/6379/      //備份
[[email protected] ~]# ls /var/lib/redis/6379/
dump.rdb
[[email protected] ~]#/etc/init.d/redis_6379 start
[[email protected] ~]# redis_cli
192.168.4.50:6350> keys *              //完成資料恢復
1) "a"
2) "w"
3) "d"
4) "q"
5) "f"
192.168.4.50:6350>

4)RDB的優點和缺點
RDB優點
–高效能的持久化實現 —>建立一個子程序來執行持久化,先將資料寫入臨時檔案,持久化過程介乎後,再用這個臨時檔案替換上次持久化號的完呢鍵; 過程中主程序不做任何IO操作(處理客戶端請求的程序和負責存檔的程序不是同一個程序)
–比較適合大規模資料恢復,且對資料完整性要求不是很高
RDB的缺點
–意外宕機時,最後一次持久化的資料會丟失

2 持久化之AOF(類似與Mysql裡的binlog日誌)
1 )只做追加操作的檔案,Append Only File
–記錄redis服務的所有寫操作
–不斷的將新的寫操作追加到檔案末尾
–使用cat命令可以檢視檔案內容

2) 相關配置引數
檔名
–appendfilename “appendonly.aof” //指定檔名
–appendonly yes //啟用aof ,預設為no
AOF檔案記錄寫操作的方式
–appendfsync always //有新寫操作立即記錄
–appendfsync everysec //每秒記錄一次
–appendfsync no //只記錄SQL命令到AOF檔案,不寫入dump.rdb
日誌檔案會不斷增大,何時觸發日誌重寫?
–redis會記錄上次重寫時AOF檔案的大小
–預設配置當AOF檔案是上次rewrite後大小的1倍且檔案大於64M時觸發
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
當aof檔案達到64mb時,對其進行重寫,達到壓縮空間的目的。比如說重寫後的AOF檔案的大小為40mb,當檔案大小到達80mb(增加大小為原檔案大小的100%)時對檔案再次進行重寫。

3)修復AOF檔案
–把檔案恢復到最後一次的正確操作
[[email protected] 6379]# redis-check-aof --fix appendonly.aof
注意:這個修復方式只限於將AOF檔案的最後一個記錄改錯的情況下有效,如果時中間的記錄被修改錯了,那麼這個命令不起作用。

[[email protected] ~]# vim /etc/redis/6379.conf
 673 appendonly yes                 //啟用AOF檔案,預設為no。
 674 
 675 # The name of the append only file (default: "appendonly.aof")
 676 //appendonly.aof 這個檔案是可以編輯的,根據你的需要進行操作。
 677 appendfilename "appendonly.aof"          //預設檔名

注意:如果之前使用的是RDB,而且資料庫裡有資料,此時在配置檔案開啟AOF ,重啟服務後,redis資料庫會優先讀取AOF的資料,此時AOF裡沒有資料,那麼當登入資料庫查詢時,之前的所有資料將查詢不到。所以配置時最好將RDB和AOF一起啟用。
如果要解決這個問題,在登入資料庫後利用config set 修改AOF配置項即可。
appendfsync no //記錄SQL命令到aof檔案,不寫入磁碟

4)備份和恢復AOF資料:方式和RDB一樣

5)AOF優點和缺點
AOF優點:
– 可以靈活設定持久化方式,同步持久化方式有三種,同步持久化appendfsync always或非同步持久化appendfsync everysec
–出現以外宕機時,僅肯能丟失1秒的資料

AOF缺點
–持久化檔案的體積通常會大於RDB的體積
–執行fsync策略時的速度可能會比RDB方式慢