05: redis 主從複製

 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

從節點:63816382

 

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

相關文章
相關標籤/搜索