目錄
一、配置
1.1 建立復制
1.2 斷開復制
1.3 安全性
1.4 只讀
1.5 傳輸延遲
二、拓撲
2.1 一主一從結構
2.2 一主多從結構
2.3 樹形主從結構
在分布式系統中為了解決單點問題,通常會把數據復制多個副本部署到其他服務器,滿足故障恢
復和負載均衡等需求。Redis 也是如此,它為我們提供了復制的功能,實現了相同數據的多個 Redis 副本。復制功能是高可用?Redis 的基礎,哨兵和集群都是在復制的基礎上構建的。
一、配置
1.1 建立復制
參與復制的 Redis 實例劃分為主節點(master)和從節點(slave)。每個從結點只能有?個主節點,而?個主節點可以同時具有多個從結點。復制的數據流是單向的,只能由主節點到從節點。配置復制的方式有以下三種:
1. 在配置文件中加入?slaveof {masterHost} {masterPort} 隨 Redis 啟動生效。
2. 在 redis-server 啟動命令時加入?--slaveof {masterHost} {masterPort} 生效。
3. 直接使用?redis 命令:slaveof {masterHost} {masterPort} 生效
接下來,我們將 redis.conf 配置文件復制?份 redis-slave.conf,并且修改其 daemonize 為 yes。
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
接下來,默認啟動的 redis 作為主 Redis,重新通過命令行啟動?個 Redis 實例作為從 Redis:
# ubuntu
redis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379# centos
redis-server /etc/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
注意: 修改配置主要是修改從機的配置. 主機配置不變
通過 netstat -nlpt 確保兩個 Redis 均已正確啟動。
[root@host ~]# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 49264/redis-server
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 272418/redis-server
通過 redis-cli 可以連接主 Redis 實例,通過 redis-cli -p 6380 連接從 Redis。并且觀察復制關系。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6380> get hello
"world"
從運行結果中看到復制已經?作了,針對主節點 6379 的任何修改都可以同步到從節點 6380 中,復制過程如圖所示。

可以通過 info replication 命令查看復制相關狀態。
主節點 6379 復制狀態信息:
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=100,lag=0
master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:100
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:100
?從節點 6380 復制狀態信息:
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:170
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:170
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:170
1.2 斷開復制
slaveof 命令不但可以建立復制,還可以在從節點執行?slaveof no one 來斷開與主節點復制關系。
例如在 6380 節點上執行?slaveof no one 來斷開復制。
斷開復制主要流程:
1)斷開與主節點復制關系。
2)從節點晉升為主節點。
從節點斷開復制后并不會拋棄原有數據,只是無法再獲取主節點上的數據變化。
通過 slaveof 命令還可以實現切主操作,將當前從節點的數據源切換到另?個主節點。執行
slaveof {newMasterIp} {newMasterPort} 命令即可。
切主操作主要流程:
1)斷開與舊主節點復制關系。
2)與新主節點建立復制關系。
3)刪除從節點當前所有數據。
4)從新主節點進行復制操作。
1.3 安全性
對于數據比較重要的節點,主節點會通過設置 requirepass 參數進行密碼驗證,這時所有的客戶
端訪問必須使用?auth 命令實行校驗。從節點與主節點的復制連接是通過?個特殊標識的客戶端來完成,因此需要配置從節點的masterauth 參數與主節點密碼保持?致,這樣從節點才可以正確地連接到主節點并發起復制流程。
1.4 只讀
默認情況下,從節點使用?slave-read-only=yes 配置為只讀模式。由于復制只能從主節點到從節
點,對于從節點的任何修改主節點都無法感知,修改從節點會造成主從數據不?致。所以建議線上不要修改從節點的只讀模式。
1.5 傳輸延遲
主從節點一般部署在不同機器上,復制時的網絡延遲就成為需要考慮的問題,Redis 為我們提供
了 repl-disable-tcp-nodelay 參數用于控制是否關閉 TCP_NODELAY,默認為 no,即開啟 tcp-
nodelay 功能,說明如下:
當關閉時,主節點產生的命令數據無論大小都會及時地發送給從節點,這樣主從之間延遲會變小,
但增加了網絡帶寬的消耗。適用于主從之間的網絡環境良好的場景,如同機房部署。
當開啟時,主節點會合并較小的 TCP 數據包從而節省帶寬。默認發送時間間隔取決于 Linux 的內
核,?般默認為 40 毫秒。這種配置節省了帶寬但增大主從之間的延遲。適用于主從網絡環境復雜
的場景,如跨機房部署。
二、拓撲
Redis 的復制拓撲結構可以支持單層或多層復制關系,根據拓撲復雜性可以分為以下三種:?主?
從、?主多從、樹狀主從結構。
2.1 一主一從結構
?主?從結構是最簡單的復制拓撲結構,用于主節點出現宕機時從節點提供故障轉移支持,如圖
所示。當應用寫命令并發量較高且需要持久化時,可以只在從節點上開啟 AOF,這樣既可以保證數據安全性同時也避免了持久化對主節點的性能干擾。但需要注意的是,當主節點關閉持久化功能時,如果主節點宕機要避免自動重啟操作。

2.2 一主多從結構
?主多從結構(星形結構)使得應用端可以利用多個從節點實現讀寫分離,如圖所示。對于
讀比重較大的場景,可以把讀命令負載均衡到不同的從節點上來分擔壓力。同時?些耗時的讀命令可以指定?臺專門的從節點執行,避免破壞整體的穩定性。對于寫并發量較高的場景,多個從節點會導致主節點寫命令的多次發送從而加重主節點的負載。

2.3 樹形主從結構
樹形主從結構(分層結構)使得從節點不但可以復制主節點數據,同時可以作為其他從節點的主
節點繼續向下層復制。通過引入復制中間層,可以有效降低住系欸按負載和需要傳送給從節點的數據量,如圖所示。數據寫入節點 A 之后會同步給 B 和 C 節點,B 節點進?步把數據同步給 D 和 E 節點。當主節點需要掛載等多個從節點時為了避免對主節點的性能干擾,可以采用這種拓撲結構。