天天看點

Linux雲計算運維架構師(連載)緩存服務 Redis 叢集-11

2、Redis 主從複制原理

1、Redis 主從同步方式

redis 主從同步有兩種方式(或者所兩個階段):全同步和部分同步。

主從剛剛連接配接的時候,進行全同步;全同步結束後,進行部分同步。當然,如果有需要,slave 在任何時候都可以發起全同步。

redis 政策是,無論如何,首先會嘗試進行部分同步,如不成功,要求從機進行全同步,并啟動 BGSAVE……BGSAVE 結束後,傳輸 RDB 檔案;如果成功,允許從機進行部分同步,并傳輸積壓空間中的資料。

下面這幅圖,總結了主從同步的機制:

Linux雲計算運維架構師(連載)緩存服務 Redis 叢集-11

2、Redis 主從複制原理

  1. 從伺服器向主伺服器發送 SYNC 指令。
  2. 接到 SYNC 指令的主伺服器會調用BGSAVE 指令,建立一個 RDB 檔案,并使用緩沖區記錄接下來執行的所有寫指令。
  3. 當主伺服器執行完 BGSAVE 指令時,它會向從伺服器發送 RDB 檔案,而從伺服器則會接收并載入這個檔案。
  4. 主伺服器将緩沖區儲存的所有寫指令發送給從伺服器執行。

3、Redis 指令的傳播

在主從伺服器完成同步之後,主伺服器每執行一個寫指令,它都會将被執行的寫指令發送給從伺服器執行,這個操作被稱為“指令傳播”(command propagate)。

Linux雲計算運維架構師(連載)緩存服務 Redis 叢集-11

指令傳播是一個持續的過程:隻要複制仍在繼續,指令傳播就會一直進行,使得主從伺服器的狀态可以一直保持一緻。

3、Redis 複制中的 SYNC 與 PSYNC

在 Redis 2.8 版本之前, 斷線之後重連的從伺服器總要執行一次完整重同步(full resynchronization)操作。

從 Redis 2.8 開始,Redis 使用 PSYNC 指令代替 SYNC 指令。PSYNC 比起 SYNC 的最大改進在于 PSYNC 實作了部分重同步(partial resync)特性:在主從伺服器斷線并且重新連接配接的時候,隻要條件允許,PSYNC 可以讓主伺服器隻向從伺服器同步斷線期間缺失的資料,而不用重新向從伺服器同步整個資料庫。

4、Redis 複制的一緻性問題

Linux雲計算運維架構師(連載)緩存服務 Redis 叢集-11

在讀寫分離環境下,用戶端向主伺服器發送寫指令 SET n 10086,主伺服器在執行這個寫指令之後,向用戶端傳回回複,并将這個寫指令傳播給從伺服器。

接到回複的用戶端繼續向從伺服器發送讀指令 GET n ,并且因為網絡狀态的原因,用戶端的 GET指令比主伺服器傳播的SET 指令更快到達了從伺服器。

因為從伺服器鍵 n 的值還未被更新,是以用戶端在從伺服器讀取到的将是一個錯誤(過期)的 n值。

5、Redis 複制安全性提升

主伺服器隻在有至少 N 個從伺服器的情況下,才執行寫操作從 Redis 2.8 開始, 為了保證資料的安全性, 可以通過配置, 讓主伺服器隻在有至少 N 個目前已連接配接從伺服器的情況下, 才執行寫指令。

不過, 因為 Redis 使用異步複制, 是以主伺服器發送的寫資料并不一定會被從伺服器接收到, 是以, 資料丢失的可能性仍然是存在的。

通過以下兩個參數保證資料的安全:

min-slaves-to-write <number of slaves>
min-slaves-max-lag <number of seconds>           

複制

6、Redis 主從複制實踐

1、Redis 多執行個體的配置

準備兩個或兩個以上redis執行個體
[[email protected] redis]# tree
.
├── 6380
│   ├── redis.conf
│   └── redis-server
├── 6381
│   ├── redis.conf
│   └── redis-server
├── 6382
│   ├── redis.conf
│   └── redis-server
├── install-redis.sh
└── start-redis.sh           

複制

2、Redis 配置檔案示例

[[email protected] redis]# vim 6380/redis.conf
bind 127.0.0.1 10.0.0.186
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
loglevel notice
logfile "/var/log/redis_6380.log"
dbfilename dump.rdb
dir /application/redis/6380/
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
slowlog-log-slower-than 10000
slowlog-max-len 128
protected-mode no           

複制

3、啟動 Redis 執行個體

[[email protected] redis]# ./6380/redis-server ./6380/redis.conf
[[email protected] redis]# ./6381/redis-server ./6381/redis.conf
[[email protected] redis]# ./6382/redis-server ./6382/redis.conf           

複制

4、Redis 複制環境說明

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

複制

5、Redis 開啟主從(在6381 6382執行個體中執行)

[root@localhost redis]# redis-cli -h 192.168.152.161 -p 6380
192.168.152.161:6380> slaveof 192.168.152.161 6381
OK           

複制

6、Redis 主從複制完成

7、Redis 主從複制管理

  • 主從複制狀态監控:info replication
  • 主從切換: slaveof no one