一、主從復(fù)制
主從復(fù)制是實(shí)現(xiàn)Redis高可用的一種有效方式。通過將一個(gè)Redis實(shí)例設(shè)置為主節(jié)點(diǎn)(Master),其他實(shí)例設(shè)置為從節(jié)點(diǎn)(Slave),當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),可以自動(dòng)切換到從節(jié)點(diǎn),保證服務(wù)的持續(xù)運(yùn)行。
1. 配置主節(jié)點(diǎn)
需要在一臺(tái)機(jī)器上啟動(dòng)Redis服務(wù),并將其設(shè)置為主節(jié)點(diǎn)??梢酝ㄟ^修改配置文件或者使用"redis-cli"命令行工具來實(shí)現(xiàn)。在配置文件中,設(shè)置"bind"參數(shù)為服務(wù)器的IP地址和端口號(hào),例如:
bind 127.0.0.1 port 6379
在"redis.conf"文件中,設(shè)置以下相關(guān)參數(shù):
# 開啟AOF持久化 appendonly yes # 設(shè)置AOF文件名 appendfilename "appendonly.aof"
2. 配置從節(jié)點(diǎn)
在另一臺(tái)機(jī)器上啟動(dòng)Redis服務(wù),并將其設(shè)置為從節(jié)點(diǎn)。修改配置文件或使用"redis-cli"命令行工具,設(shè)置"slaveof"參數(shù)為主節(jié)點(diǎn)的IP地址和端口號(hào),例如:
slaveof 127.0.0.1 6379
在從節(jié)點(diǎn)的"redis.conf"文件中,設(shè)置以下相關(guān)參數(shù):
# 避免從節(jié)點(diǎn)與主節(jié)點(diǎn)同時(shí)寫入AOF文件,導(dǎo)致數(shù)據(jù)不一致 requirepass nopasswd # 設(shè)置主節(jié)點(diǎn)的密碼,以便從節(jié)點(diǎn)同步主節(jié)點(diǎn)的數(shù)據(jù) masterauth your_password
二、哨兵模式
哨兵模式是Redis的高可用解決方案之一。通過部署多個(gè)哨兵實(shí)例,可以實(shí)現(xiàn)自動(dòng)監(jiān)控主節(jié)點(diǎn)的狀態(tài),并在主節(jié)點(diǎn)出現(xiàn)故障時(shí)自動(dòng)切換到從節(jié)點(diǎn)。哨兵模式包括單哨兵模式和多哨兵模式。
1. 配置單個(gè)哨兵實(shí)例
在一臺(tái)機(jī)器上啟動(dòng)一個(gè)Redis哨兵實(shí)例,修改配置文件或使用"redis-cli"命令行工具。在配置文件中,設(shè)置以下相關(guān)參數(shù):
sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1
其中,"mymaster"是要監(jiān)控的主節(jié)點(diǎn)名稱;"127.0.0.1"和"6379"分別是主節(jié)點(diǎn)的IP地址和端口號(hào);"2"表示至少需要2個(gè)哨兵實(shí)例同意主節(jié)點(diǎn)故障才會(huì)觸發(fā)故障轉(zhuǎn)移;其他參數(shù)表示故障檢測的時(shí)間間隔和并行同步的數(shù)量等。
2. 配置多個(gè)哨兵實(shí)例和自動(dòng)故障轉(zhuǎn)移(Cluster)模式下的主從關(guān)系
在另外兩臺(tái)機(jī)器上分別啟動(dòng)兩個(gè)哨兵實(shí)例,并修改各自的配置文件。例如:
redis-sentinel /path/to/sentinel1.conf --sentinel mymaster1 & redis-sentinel /path/to/sentinel2.conf --sentinel mymaster2 &
在客戶端連接哨兵實(shí)例時(shí),可以選擇使用Cluster模式。在這種模式下,客戶端會(huì)自動(dòng)連接所有包含數(shù)據(jù)的主節(jié)點(diǎn),并將數(shù)據(jù)分布到不同的從節(jié)點(diǎn)上。當(dāng)某個(gè)主節(jié)點(diǎn)宕機(jī)時(shí),客戶端會(huì)自動(dòng)將請(qǐng)求轉(zhuǎn)發(fā)到其他正常的主節(jié)點(diǎn)或從節(jié)點(diǎn)上。這需要在客戶端代碼中進(jìn)行相應(yīng)的配置。例如,使用Redis Cluster模塊:
const cluster = require('cluster');
const Redis = require('ioredis');
const redis = new Redis(); // 創(chuàng)建一個(gè)Cluster實(shí)例,傳入哨兵實(shí)例的地址列表作為參數(shù),例如:['redis://node1', 'redis://node2']