redis主從複製redis
原理:sql
1. 從服務器向主服務器發送 SYNC 命令。vim
2. 接到 SYNC 命令的主服務器會調用BGSAVE 命令,建立一個 RDB 文件,並使用緩衝區記錄接下來執行的全部寫命令。安全
3. 當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 文件,而從服務器則會接收並載入這個文件。服務器
4. 主服務器將緩衝區儲存的全部寫命令發送給從服務器執行。網絡
詳細的過程:架構
主從常見架構:nosql
一個主服務器能夠有多個從服務器。spa
從服務器也能夠有本身的從服務器。命令行
複製功能不會阻塞主服務器。
主從數據一致性保證:
min-slaves-to-write 1
min-slaves-max-lag
這個特性的運做原理:
從服務器以每秒一次的頻率 PING 主服務器一次, 並報告複製流的處理狀況。
主服務器會記錄各個從服務器最後一次向它發送 PING 的時間。
用戶能夠經過配置, 指定網絡延遲的最大值 min-slaves-max-lag ,
以及執行寫操做所需的至少從服務器數量 min-slaves-to-write 。
若是至少有 min-slaves-to-write 個從服務器, 而且這些服務器的延遲值都少於 min-slaves-max-lag秒,
那麼主服務器就會執行客戶端請求的寫操做。
你能夠將這個特性看做 CAP 理論中的 C 的條件放寬版本: 儘管不能保證寫操做的持久性,
但起碼丟失數據的窗口會被嚴格限制在指定的秒數中。
另外一方面, 若是條件達不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的條件, 那麼寫操做就不會被執行
主服務器會向請求執行寫操做的客戶端返回一個錯誤。
---------------------
主庫是否要開啓持久化?
若是不開有可能,主庫重啓操做,形成全部主從數據丟失!
主從服務器數據所有丟失的例子:
1. 假設節點A爲主服務器,而且關閉了持久化。 而且節點B和節點C從節點A複製數據
2. 節點A崩潰,而後由自動拉起服務重啓了節點A. 因爲節點A的持久化被關閉了,因此重啓以後沒有任何數據
3. 節點B和節點C將從節點A複製數據,可是A的數據是空的, 因而就把自身保存的數據副本刪除。
在關閉主服務器上的持久化,並同時開啓自動拉起進程的狀況下,即使使用Sentinel來實現Redis的高可用性,也是很是危險的。 由於主服務器可能拉起得很是快,以致於Sentinel在配置的心跳時間間隔內沒有檢測到主服務器已被重啓,而後仍是會執行上面的數據丟失的流程。
不管什麼時候,數據安全都是極其重要的,因此應該禁止主服務器關閉持久化的同時自動拉起。
---------------------
主從複製實現:
1、環境:
準備兩個或兩個以上redis實例
mkdir /nosql/638{0..2}
配置文件示例:
vim /nosql/6380/redis.conf
port 6380
daemonize yes
pidfile /nosql/6380/redis.pid
loglevel notice
logfile "/nosql/6380/redis.log"
dbfilename dump.rdb
dir /nosql/6380
protected-mode no
vim /nosql/6381/redis.conf
port 6381
daemonize yes
pidfile /nosql/6381/redis.pid
loglevel notice
logfile "/nosql/6381/redis.log"
dbfilename dump.rdb
dir /nosql/6381
protected-mode no
vim /nosql/6382/redis.conf
port 6382
daemonize yes
pidfile /nosql/6382/redis.pid
loglevel notice
logfile "/nosql/6382/redis.log"
dbfilename dump.rdb
dir /nosql/6382
protected-mode no
啓動:
redis-server /nosql/6380/redis.conf
redis-server /nosql/6381/redis.conf
redis-server /nosql/6382/redis.conf
主節點:6380
從節點:6381、6382
2、開啓主從:
6381/6382命令行:
redis-cli -p 6381
SLAVEOF 127.0.0.1 6380
redis-cli -p 6382
SLAVEOF 127.0.0.1 6380
3、查詢主從狀態
從庫:
127.0.0.1:6382> info replication
主庫:
127.0.0.1:6380> info replication
4、從庫切爲主庫
模擬主庫故障
redis-cli -p 6380
shutdown
redis-cli -p 6381
info replication
slaveof no one
6382鏈接到6381:
[root@db03 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381