Redis 復制(Replication)
1. 復制介紹
分布式數據庫為了獲取更大的存儲容量和更高的並發訪問量,會將原來集中式數據庫中的數據分散存儲到多個通過網絡連接的數據存儲節點上。Redis為了解決單點數據庫問題,會把數據復制多個副本部署到其他節點上,通過復制,實現Redis的高可用性,實現對數據的冗余備份,保證數據和服務的高度可靠性。
2. 復制的建立
建立復制的配置方式有三種。
在redis.conf文件中配置slaveof <masterip> <masterport>選項,然后指定該配置文件啟動Redis生效。
在redis-server啟動命令后加上--slaveof <masterip> <masterport>啟動生效。
直接使用 slaveof <masterip> <masterport>命令在從節點執行生效。
我們以最簡單的一主一從模型,使用第2種方式建立復制。
首先先開啟主節點master實例,端口8888
redis-server --port 8888
開啟一個client
,連接上主節點服務器
./redis-cli -p 8888 127.0.0.1:8888> KEYS * //新開啟的Redis服務器,沒有鍵值對 (empty list or set)
接着開啟從節點slave實例,端口9999
,並指定指定主節點。
redis-server --port 9999 --slaveof 127.0.0.1 8888 //命令行開啟Redis服務器后,會打印如下日志信息,已經開啟復制了 Connecting to MASTER 127.0.0.1:8888 MASTER <-> SLAVE sync started Non blocking connect for SYNC fired the event. Master replied to PING, replication can continue... Partial resynchronization not possible (no cached master) Full resync from master: 1aff09ecd70ca640e33083f8422018b29883b9d1:1 MASTER <-> SLAVE sync: receiving 76 bytes from master MASTER <-> SLAVE sync: Flushing old data MASTER <-> SLAVE sync: Loading DB in memory MASTER <-> SLAVE sync: Finished with success
開啟一個client
,連接上從節點服務器。
➜ ~ redis-cli -p 9999 127.0.0.1:9999> INFO replication # Replication role:slave //節點角色 master_host:127.0.0.1 //主節點的IP master_port:8888 //主節點的端口 master_link_status:up //與主節點的連接狀態 master_last_io_seconds_ago:0 //主節點最后與從節點的通信時間間隔,單位秒 master_sync_in_progress:0 //從節點是否正在全量同步主節點的RDB文件 slave_repl_offset:407 //復制偏移量 slave_priority:100 //從節點的優先級 slave_read_only:1 //從節點是否只讀 connected_slaves:0 //連接從節點的個數 master_repl_offset:0 //當前從節點作為其他從節點的主節點時的復制偏移量 //以下四種信息為通用的配置 repl_backlog_active:0 //復制緩沖區的狀態 repl_backlog_size:1048576 //復制緩沖區的大小 repl_backlog_first_byte_offset:0//復制緩沖區起始偏移量,標識當前緩沖區可用的范圍 repl_backlog_histlen:0 //標識復制緩沖區已存在的有效數據長度 127.0.0.1:9999> KEYS * //由於主節點的鍵空間為空,所以從節點的鍵空間也為空。 (empty list or set)
此時,我們查看主節點的INFO replication
信息
//通過INFO replication命令可以查看當前的復制信息 127.0.0.1:6380> INFO replication # Replication role:master //節點角色 connected_slaves:1 //連接從節點的個數 slave0:ip=127.0.0.1,port=9999,state=online,offset=631,lag=0 //連接從節點的信息 master_repl_offset:631 //主節點的偏移量 //以下四種信息為通用的配置 repl_backlog_active:1 //復制緩沖區的狀態 repl_backlog_size:1048576 //復制緩沖區的大小 repl_backlog_first_byte_offset:2 //復制緩沖區起始偏移量,標識當前緩沖區可用的范圍 repl_backlog_histlen:630 //由於主節點的鍵空間為空,所以從節點的鍵空間也為空。
到此,一主一從模型的復制就建立成功了。我們可以在主節點建立一些新的鍵,然后查看從節點的鍵空間的變化
//根據端口區別主從節點 127.0.0.1:8888> HSET hash_key hello world (integer) 1 127.0.0.1:9999> KEYS * //從節點的鍵空間已經更新 1) "hash_key"
我們在查看從節點的INFO replication
信息時,可以知道slave_read_only:1
,從節點默認只能讀不能寫,因此執行寫命令會得到如下回復:
127.0.0.1:9999> SET key value (error) READONLY You can't write against a read only slave.
只讀模式由 redis.conf 文件中的 slave-read-only 選項控制,也可以通過 CONFIG SET命令來開啟或關閉這個模式。
我們在查看從節點的INFO replication信息時,還發現有connected_slaves:0選項 ,說明Redis的復制拓撲結構支持單層或多層復制關系,從節點還可以作為其他從節點的主節點進行復制。
根據拓撲關系可以分為三種:
一主一從
- 一主多從
- 樹型主從結構
3. 復制的斷開
復制斷開也是在從節點執行命令slaveof on one
來斷開於主節點的復制關系。例如,將剛才端口為9999
的從節點斷開復制:
127.0.0.1:9999> SLAVEOF no one OK //從節點服務器會打印如下日志 Connection with master lost. Caching the disconnected master state. Discarding previously cached master state. MASTER MODE enabled (user request from 'id=3 addr=127.0.0.1:40218 fd=7 name= age=2218 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=slaveof') //主節點服務器也會打印斷開的信息 Connection with slave 127.0.0.1:9999 lost.
從節點服務器斷開后,從節點會晉升為主節點。從日志中可以看到MASTER MODE enabled
,也可以從INFO
命令查看到
127.0.0.1:9999> INFO replication # Replication role:master //角色發生變化 ......
4. min-slaves配置選項
Redis的min-slaves-to-write
和min-slaves-max-lag
兩個選項可以防止主節點在不安全的情況下執行寫命令。
min-slaves-to-write 3 //從節點數量少於3個,主節點拒絕執行寫命令 min-slaves-max-lag 10 //3個從節點的延遲(lag)值,大於或等於10,主節點拒絕執行寫命令