1. 程式人生 > >linux之 redis 的rdb 轉 aof 及主從復 redis不重啟,切換RDB備份到AOF備份

linux之 redis 的rdb 轉 aof 及主從復 redis不重啟,切換RDB備份到AOF備份

redis持久化
RDB
基於快照的持久化
通過save命令,強制持久化 
在redis.conf中
dbfilename  dbmp.rdb
save  900 1
save 300 10
save 60  10000  
AOF
將修改命令,全部收集寫入到一個aof檔案中
appendonly yes
appendfsync  everysec   #每秒鐘記錄一次變化   RDB資料切換AOF資料的操作
1.準備redis.conf配置檔案,確保開啟rdb功能,配置引數如下  port 6379
 daemonize yes
 pidfile /data/redis.pid
 loglevel notice
 logfile "/data/redis.log"
 dir /data/
 dbfilename  dbmp.rdb
 save  900 1
 save 300 10
 save 60  10000
2.啟動redis服務端
 redis-server redis.conf
3.插入redis資料,通過save命令,強制寫入持久化rdb檔案(此時還是使用rdb持久化)
 set name shahe
 set age 11
 save 
 
4.通過命令,切換到aof持久化,(注意此步只是臨時生效,必須將AOF的配置,寫入redis.conf)
127.0.0.1:6379> CONFIG set appendonly yes   #開啟AOF功能
OK
127.0.0.1:6379> CONFIG SET save ""  #關閉RDB功能
OK 5.修改配置檔案,新增aof引數,(此步重啟後,rdb持久化完全切換aof持久化,且資料保持一致) port 6379
daemonize yes
pidfile /data/redis.pid
loglevel notice
logfile "/data/redis.log"
dir /data/
appendonly yes
appendfsync  everysec 6.重啟redis服務 ******************************************************************************************************** redis主從複製:
1.環境準備3個redis例項
redis-6380.conf
redis-6381.conf
redis-6382.conf
    三個配置檔案的區別,僅僅是埠的不同修改即可
port 6380
daemonize yes  
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no 2.啟動三個redis例項
redis-server 6380.conf
redis-server 6381.conf
redis-server 6382.conf 3.此時可以檢視redis身份資訊,通過info引數()此時還未配置主從,因此都是master身份
redis-cli -p 6382 info Replication
redis-cli -p 6381 info Replication
redis-cli -p 6380 info Replication 4.配置從節點的身份(6380為主,6381,6382為從),通過命令指明master節點資訊即可
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 127.0.0.1:6382> SLAVEOF 127.0.0.1 6380 5.檢視各個各個節點的身份資訊
redis-cli -p 6382 info Replication  從節點
redis-cli -p 6381 info Replication    從節點
redis-cli -p 6380 info Replication  ()主節點   #手動切換主從身份
1.將主節點掛掉
kill -9 主節點 6380 2.將6382去掉slave的身份
redis-cli -p 6382 slaveof no one 3.將6381設定新的主人,設定為6382
redis-cli -p 6381 slaveof 127.0.0.1 6382   #通過配置檔案,決定主從身份
1.在配置檔案中,新增一條引數即可(主節點不做配置,從節點指明主人的ip埠資訊即可)
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
slaveof 127.0.0.1 6381          

redis不重啟,切換RDB備份到AOF備份

 

確保redis版本在2.2以上

[[email protected] /data 22:23:30]#redis-server -v
Redis server v=4.0.10 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=64cb6afcf41664c

本文在redis4.0中,通過config set命令,達到不重啟redis服務,從RDB持久化切換為AOF

實驗環境準備

redis.conf服務端配置檔案

複製程式碼
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename  dbmp.rdb
save 900 1                    #rdb機制 每900秒 有1個修改記錄
save 300 10                    #每300秒        10個修改記錄
save 60  10000                #每60秒內        10000修改記錄
複製程式碼

啟動redis服務端

redis-server redis.conf

登入redis-cli插入資料,手動持久化

複製程式碼
127.0.0.1:6379> set name chaoge
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set addr shahe
OK
127.0.0.1:6379> save
OK
複製程式碼

檢查RDB檔案

[[email protected] /data 22:34:16]#ls 6379/
dbmp.rdb  redis.log

備份這個rdb檔案,保證資料安全

[[email protected] /data/6379 22:35:38]#cp dbmp.rdb /opt/

執行命令,開啟AOF持久化

127.0.0.1:6379> CONFIG set appendonly yes   #開啟AOF功能
OK
127.0.0.1:6379> CONFIG SET save ""  #關閉RDB功能
OK

確保資料庫的key數量正確

127.0.0.1:6379> keys *
1) "addr"
2) "age"
3) "name"

確保插入新的key,AOF檔案會記錄

127.0.0.1:6379> set title golang
OK

此時RDB已經正確切換AOF,注意還得修改redis.conf新增AOF設定,不然重啟後,通過config set的配置將丟失

 

redis主從同步

原理:
1. 從伺服器向主伺服器傳送 SYNC 命令。
2. 接到 SYNC 命令的主伺服器會呼叫BGSAVE 命令,建立一個 RDB 檔案,並使用緩衝區記錄接下來執行的所有寫命令。
3. 當主伺服器執行完 BGSAVE 命令時,它會向從伺服器傳送 RDB 檔案,而從伺服器則會接收並載入這個檔案。
4. 主伺服器將緩衝區儲存的所有寫命令傳送給從伺服器執行。


-------------
1、在開啟主從複製的時候,使用的是RDB方式的,同步主從資料的
2、同步開始之後,通過主庫命令傳播的方式,主動的複製方式實現
3、2.8以後實現PSYNC的機制,實現斷線重連

 

環境準備

6380.conf

複製程式碼
1、環境:
準備兩個或兩個以上redis例項

mkdir /data/638{0..2}  #建立6380 6381 6382資料夾

配置檔案示例:
vim   /data/6380/redis.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
複製程式碼

6381.conf

複製程式碼
vim   /data/6381/redis.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
複製程式碼

6382.conf

複製程式碼
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
複製程式碼

啟動三個redis例項

redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

主從規劃

主節點:6380
從節點:6381、6382

配置主從同步

6381/6382命令列

redis-cli -p 6381
SLAVEOF 127.0.0.1 6380  #指明主的地址

redis-cli -p 6382
SLAVEOF 127.0.0.1 6380  #指明主的地址

檢查主從狀態

從庫:

127.0.0.1:6382> info replication
127.0.0.1:6381> info replication

主庫:

127.0.0.1:6380> info replication

測試寫入資料,主庫寫入資料,檢查從庫資料

複製程式碼
主
127.0.0.1:6380> set name chaoge


從
127.0.0.1:6381>get name 
複製程式碼

手動進行主從複製故障切換

#關閉主庫6380
redis-cli -p 6380 shutdown

檢查從庫主從資訊,此時master_link_status:down 

複製程式碼
redis-cli -p 6381
info replication

redis-cli -p 6382
info replication
 
複製程式碼

既然主庫掛了,我想要在6381 6382之間選一個新的主庫

1.關閉6381的從庫身份

redis-cli -p 6381
info replication
slaveof no one

2.將6382設為6381的從庫

6382連線到6381:
[[email protected] ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381

3.檢查6382,6381的主從資訊

 

 

           

確保redis版本在2.2以上

[[email protected] /data 22:23:30]#redis-server -v
Redis server v=4.0.10 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=64cb6afcf41664c

本文在redis4.0中,通過config set命令,達到不重啟redis服務,從RDB持久化切換為AOF

實驗環境準備

redis.conf服務端配置檔案

複製程式碼
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename  dbmp.rdb
save 900 1                    #rdb機制 每900秒 有1個修改記錄
save 300 10                    #每300秒        10個修改記錄
save 60  10000                #每60秒內        10000修改記錄
複製程式碼

啟動redis服務端

redis-server redis.conf

登入redis-cli插入資料,手動持久化

複製程式碼
127.0.0.1:6379> set name chaoge
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set addr shahe
OK
127.0.0.1:6379> save
OK
複製程式碼

檢查RDB檔案

[[email protected] /data 22:34:16]#ls 6379/
dbmp.rdb  redis.log

備份這個rdb檔案,保證資料安全

[[email protected] /data/6379 22:35:38]#cp dbmp.rdb /opt/

執行命令,開啟AOF持久化

127.0.0.1:6379> CONFIG set appendonly yes   #開啟AOF功能
OK
127.0.0.1:6379> CONFIG SET save ""  #關閉RDB功能
OK

確保資料庫的key數量正確

127.0.0.1:6379> keys *
1) "addr"
2) "age"
3) "name"

確保插入新的key,AOF檔案會記錄

127.0.0.1:6379> set title golang
OK

此時RDB已經正確切換AOF,注意還得修改redis.conf新增AOF設定,不然重啟後,通過config set的配置將丟失

 

redis主從同步

原理:
1. 從伺服器向主伺服器傳送 SYNC 命令。
2. 接到 SYNC 命令的主伺服器會呼叫BGSAVE 命令,建立一個 RDB 檔案,並使用緩衝區記錄接下來執行的所有寫命令。
3. 當主伺服器執行完 BGSAVE 命令時,它會向從伺服器傳送 RDB 檔案,而從伺服器則會接收並載入這個檔案。
4. 主伺服器將緩衝區儲存的所有寫命令傳送給從伺服器執行。


-------------
1、在開啟主從複製的時候,使用的是RDB方式的,同步主從資料的
2、同步開始之後,通過主庫命令傳播的方式,主動的複製方式實現
3、2.8以後實現PSYNC的機制,實現斷線重連

 

環境準備

6380.conf

複製程式碼
1、環境:
準備兩個或兩個以上redis例項

mkdir /data/638{0..2}  #建立6380 6381 6382資料夾

配置檔案示例:
vim   /data/6380/redis.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
複製程式碼

6381.conf

複製程式碼
vim   /data/6381/redis.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
複製程式碼

6382.conf

複製程式碼
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
複製程式碼

啟動三個redis例項

redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

主從規劃

主節點:6380
從節點:6381、6382

配置主從同步

6381/6382命令列

redis-cli -p 6381
SLAVEOF 127.0.0.1 6380  #指明主的地址

redis-cli -p 6382
SLAVEOF 127.0.0.1 6380  #指明主的地址

檢查主從狀態

從庫:

127.0.0.1:6382> info replication
127.0.0.1:6381> info replication

主庫:

127.0.0.1:6380> info replication

測試寫入資料,主庫寫入資料,檢查從庫資料

複製程式碼
主
127.0.0.1:6380> set name chaoge


從
127.0.0.1:6381>get name 
複製程式碼

手動進行主從複製故障切換

#關閉主庫6380
redis-cli -p 6380 shutdown

檢查從庫主從資訊,此時master_link_status:down 

複製程式碼
redis-cli -p 6381
info replication

redis-cli -p 6382
info replication
 
複製程式碼

既然主庫掛了,我想要在6381 6382之間選一個新的主庫

1.關閉6381的從庫身份

redis-cli -p 6381
info replication
slaveof no one

2.將6382設為6381的從庫

6382連線到6381:
[[email protected] ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381

3.檢查6382,6381的主從資訊