8. Redis集群
Redis單機(jī)部署在測試環(huán)境是可以的,但是如果在生產(chǎn)環(huán)境也是單機(jī)的話,就會(huì)有單點(diǎn)故障,因此需要引入集群,保證redis集群的高可用。Redis集群部署有三種方案:
- 主從復(fù)制模式
- 哨兵模式
- 集群模式
8.1 主從復(fù)制模式
8.1.1 主從復(fù)制結(jié)構(gòu)

主從復(fù)制模式中包含一個(gè)主數(shù)據(jù)庫實(shí)例(master)與一個(gè)或多個(gè)從數(shù)據(jù)庫實(shí)例(slave),如上圖??蛻舳丝蓪χ鲾?shù)據(jù)庫進(jìn)行讀寫操作,對從數(shù)據(jù)庫進(jìn)行讀操作,主數(shù)據(jù)庫寫入的數(shù)據(jù)會(huì)實(shí)時(shí)自動(dòng)同步給從數(shù)據(jù)庫。
8.1.2 主從復(fù)制工作機(jī)制
當(dāng)slave啟動(dòng)后,主動(dòng)向master發(fā)送PSYNC命令。master接收到PSYNC命令后在后臺(tái)保存快照(RDB持久化)和緩存保存快照這段時(shí)間的命令,然后將保存的快照文件和緩存的命令發(fā)送給slave。slave接收到快照文件和命令后加載快照文件和緩存的執(zhí)行命令。復(fù)制初始化后,master每次接收到的寫命令都會(huì)同步發(fā)送給slave,保證主從數(shù)據(jù)一致性。

8.1.3 搭建過程
我們在Redis學(xué)習(xí)筆記系列(一)——Redis簡介及安裝一節(jié)中,已經(jīng)介紹過單機(jī)部署的步驟了,現(xiàn)在我們需要再部署兩臺(tái)redis服務(wù)器,其中一臺(tái)redis服務(wù)器做Master節(jié)點(diǎn),另外兩個(gè)節(jié)點(diǎn)作為Slave節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)的部署方法可參照前面那篇文章。
修改配置文件。
修改Master節(jié)點(diǎn)的配置文件redis.conf,允許外部連接,并且開啟密碼驗(yàn)證。
# 是否開啟保護(hù)模式(默認(rèn)開啟)
# 要是配置里沒有指定bind和密碼。
# 開啟該參數(shù)后,redis只會(huì)本地進(jìn)行訪問,拒絕外部訪問。
# 要是開啟了密碼和bind,可以開啟。否則最好關(guān)閉,設(shè)置為no。
protected-mode no
# 指定redis只接收指定IP地址的請求
# 如需處理所有請求(遠(yuǎn)程訪問) bind 0.0.0.0
bind 0.0.0.0
# 設(shè)置密碼
requirepass 123456
修改Slave節(jié)點(diǎn)的配置文件,如下:
# 復(fù)制選項(xiàng),slave復(fù)制對應(yīng)的master
slaveof master 6379
# 如果master設(shè)置了requirepass,那么slave要連上master,需要有master的密碼才行。
# masterauth就是用來配置master的密碼,這樣可以在連上master后進(jìn)行認(rèn)證
masterauth 123456
# 當(dāng)slave同master失去連接或者復(fù)制正在進(jìn)行,slave的運(yùn)行方式
# 1.如果slave-serve-stale-data設(shè)置為yes(默認(rèn)設(shè)置),slave會(huì)繼續(xù)響應(yīng)客戶端的請求。
# 2.如果slave-serve-stale-data設(shè)置為no,除去INFO和SLAVOF命令之外的任何請求都會(huì)返回一個(gè)錯(cuò)誤”SYNC with master in progress”。
slave-serve-stale-data no
- 分別啟動(dòng)Master節(jié)點(diǎn)和Slave節(jié)點(diǎn),在Master節(jié)點(diǎn)和Slave節(jié)點(diǎn)分別查看節(jié)點(diǎn)狀態(tài)。
master: redis-cli
127.0.0.1:6379> auth 123456
OK
# Master節(jié)點(diǎn)
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.6.4,port=6379,state=online,offset=179,lag=0
slave1:ip=192.168.6.5,port=6379,state=online,offset=179,lag=1
master_replid:f0202b49b5d88ad57ed0bde33ffbc3b260924330
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:179
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:179
# Slave節(jié)點(diǎn)
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:3287
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f0202b49b5d88ad57ed0bde33ffbc3b260924330
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3287
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3287
- 測試功能
# Master節(jié)點(diǎn),可讀可寫
127.0.0.1:6379> SET k1 v1
OK
127.0.0.1:6379> GET k1
"v1"
# Slave節(jié)點(diǎn),只可讀
127.0.0.1:6379> GET k1
"v1"
127.0.0.1:6379> SET k1 v2
(error) READONLY You can't write against a read only replica.
8.1.4 優(yōu)缺點(diǎn)分析
- 優(yōu)點(diǎn):
- Master能自動(dòng)將數(shù)據(jù)同步到Slave,可以進(jìn)行讀寫分離,分擔(dān)Master的讀壓力
- Master與Slave之間的同步是以非阻塞的方式進(jìn)行的,同步期間,客戶端仍然可以提交查詢或更新請求。
- 缺點(diǎn):
- 不具備自動(dòng)容錯(cuò)與恢復(fù)功能,Master或Slave的宕機(jī)都可能導(dǎo)致客戶端請求失敗,需要等待機(jī)器重啟或手動(dòng)切換客戶端IP才能恢復(fù)。
- Master宕機(jī),如果宕機(jī)前數(shù)據(jù)沒有同步完,則切換IP后會(huì)存在數(shù)據(jù)不一致的問題。難以支持在線擴(kuò)容,Redis的容量受限于單機(jī)配置。
寫在最后
如果你覺得我寫的文章幫到了你,歡迎點(diǎn)贊、評論、分享、贊賞哦,你們的鼓勵(lì)是我不斷創(chuàng)作的動(dòng)力~