主從復(fù)制:
主從復(fù)制,是指將一臺Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(diǎn)(Master),后者稱為從節(jié)點(diǎn)(Slave);數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。
原理:
主從關(guān)系確定好后,開啟從節(jié)點(diǎn)時,會發(fā)送一個sync的同步命令給主節(jié)點(diǎn),主節(jié)點(diǎn)接收到后會把redis內(nèi)存中的數(shù)據(jù)以快照的方式壓縮保存成rdb文件,在這個期間如果有新的數(shù)據(jù)就會進(jìn)行緩存保存,當(dāng)rdb文件生成后會和緩存文件一起發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)進(jìn)行保存,這就完成了主從復(fù)制。
實驗:
①安裝redis(上篇文章有)
②修改主配置文件:
bind 0.0.0.0 #87行,修改監(jiān)聽地址為0.0.0.0
protected-mode no #111行,將本機(jī)訪問保護(hù)模式設(shè)置no
port 6379 #138行,Redis默認(rèn)的監(jiān)聽6379端口
daemonize yes #309行,設(shè)置為守護(hù)進(jìn)程,后臺啟動
pidfile /usr/local/redis/log/redis_6379.pid #341行,指定 PID 文件
logfile “/usr/local/redis/log/redis_6379.log” #354行,指定日志文件
dir /usr/local/redis/data #504行,指定持久化文件所在目錄
#requirepass sj123 #1037行,可選,設(shè)置redis密碼
appendonly yes #1380行,開啟AOF
③修改從配置文件:
bind 0.0.0.0 #87行,修改監(jiān)聽地址為0.0.0.0
protected-mode no #111行,將本機(jī)訪問保護(hù)模式設(shè)置no
port 6379 #138行,Redis默認(rèn)的監(jiān)聽6379端口
daemonize yes #309行,設(shè)置為守護(hù)進(jìn)程,后臺啟動
pidfile /usr/local/redis/log/redis_6379.pid #341行,指定 PID 文件
logfile “/usr/local/redis/log/redis_6379.log” #354行,指定日志文件
dir /usr/local/redis/data #504行,指定持久化文件所在目錄
#requirepass sj123 #1037行,可選,設(shè)置redis密碼
#masterauth sj123 #535行,可選,指定Master節(jié)點(diǎn)的密碼,僅在Master節(jié)點(diǎn)設(shè)置了requirepass
appendonly yes #1380行,開啟AOF
replicaof 192.168.22.10 6379 #528行,指定要同步的Master節(jié)點(diǎn)IP和端口
然后重啟redis服務(wù)
④驗證:
主節(jié)點(diǎn)上輸入:redis-cli -a sj123 info replication
哨兵模式:
哨兵的核心功能:在主從復(fù)制的基礎(chǔ)上,哨兵引入了主節(jié)點(diǎn)的自動故障轉(zhuǎn)移
哨兵模式的作用:
監(jiān)控:哨兵會不斷地檢查主節(jié)點(diǎn)和從節(jié)點(diǎn)是否運(yùn)作正常。
自動故障轉(zhuǎn)移:當(dāng)主節(jié)點(diǎn)不能正常工作時,哨兵會開始自動故障轉(zhuǎn)移操作,它會將失效主節(jié)點(diǎn)的其中一個從節(jié)點(diǎn)升級為新的主節(jié)點(diǎn),并讓其它從節(jié)點(diǎn)改為復(fù)制新的主節(jié)點(diǎn)。
哨兵結(jié)構(gòu)由兩部分組成,哨兵節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn):
哨兵節(jié)點(diǎn):哨兵系統(tǒng)由一個或多個哨兵節(jié)點(diǎn)組成,哨兵節(jié)點(diǎn)是特殊的redis節(jié)點(diǎn),不存儲數(shù)據(jù)。
數(shù)據(jù)節(jié)點(diǎn):主節(jié)點(diǎn)和從節(jié)點(diǎn)都是數(shù)據(jù)節(jié)點(diǎn)。
故障轉(zhuǎn)移機(jī)制:
1.由哨兵節(jié)點(diǎn)定期監(jiān)控發(fā)現(xiàn)主節(jié)點(diǎn)是否出現(xiàn)了故障
每個哨兵節(jié)點(diǎn)每隔1秒會向主節(jié)點(diǎn)、從節(jié)點(diǎn)及其它哨兵節(jié)點(diǎn)發(fā)送一次ping命令做一次心跳檢測。如果主節(jié)點(diǎn)在一定時間范圍內(nèi)不回復(fù)或者是回復(fù)一個錯誤消息,那么這個哨兵就會認(rèn)為這個主節(jié)點(diǎn)主觀下線了(單方面的)。當(dāng)超過半數(shù)哨兵節(jié)點(diǎn)認(rèn)為該主節(jié)點(diǎn)主觀下線了,這樣就客觀下線了。
2.當(dāng)主節(jié)點(diǎn)出現(xiàn)故障,此時哨兵節(jié)點(diǎn)會通過Raft算法(選舉算法)實現(xiàn)選舉機(jī)制共同選舉出一個哨兵節(jié)點(diǎn)為leader,來負(fù)責(zé)處理主節(jié)點(diǎn)的故障轉(zhuǎn)移和通知。所以整個運(yùn)行哨兵的集群的數(shù)量不得少于3個節(jié)點(diǎn)。
3.由leader哨兵節(jié)點(diǎn)執(zhí)行故障轉(zhuǎn)移,過程如下:
將某一個從節(jié)點(diǎn)升級為新的主節(jié)點(diǎn),讓其它從節(jié)點(diǎn)指向新的主節(jié)點(diǎn);
若原主節(jié)點(diǎn)恢復(fù)也變成從節(jié)點(diǎn),并指向新的主節(jié)點(diǎn);
通知客戶端主節(jié)點(diǎn)已經(jīng)更換。
主節(jié)點(diǎn)的選舉:
1.過濾掉不健康的(已下線的),沒有回復(fù)哨兵 ping 響應(yīng)的從節(jié)點(diǎn)。
2.選擇配置文件中從節(jié)點(diǎn)優(yōu)先級配置最高的。(replica-priority,默認(rèn)值為100)
3.選擇復(fù)制偏移量最大,也就是復(fù)制最完整的從節(jié)點(diǎn)。
實驗:三臺機(jī)子配置一樣
①哨兵模式的配置文件復(fù)制和給屬主和屬組
cp /opt/redis-7.0.9/sentinel.conf /usr/local/redis/conf/
chown redis.redis /usr/local/redis/conf/sentinel.conf
他就在redis的安裝包里面
②修改配置文件
protected-mode no #6行,關(guān)閉保護(hù)模式
port 26379 #10行,Redis哨兵默認(rèn)的監(jiān)聽端口
daemonize yes #15行,指定sentinel為后臺啟動
pidfile /usr/local/redis/log/redis-sentinel.pid #20行,指定 PID 文件
logfile “/usr/local/redis/log/sentinel.log” #25行,指定日志存放路徑
dir /usr/local/redis/data #54行,指定數(shù)據(jù)庫存放路徑
sentinel monitor mymaster ip 6379 2 #73行,修改 指定該哨兵節(jié)點(diǎn)監(jiān)控ip這個主節(jié)點(diǎn),該主節(jié)點(diǎn)的名稱是mymaster,最后的2的含義與主節(jié)點(diǎn)的故障判定有關(guān):至少需要2個哨兵節(jié)點(diǎn)同意,才能判定主節(jié)點(diǎn)故障并進(jìn)行故障轉(zhuǎn)移
#sentinel auth-pass mymaster sj123 #76行,可選,指定Master節(jié)點(diǎn)的密碼,僅在Master節(jié)點(diǎn)設(shè)置了requirepass
sentinel down-after-milliseconds mymaster 3000 #114行,判定服務(wù)器down掉的時間周期,默認(rèn)30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #214行,同一個sentinel對同一個master兩次failover之間的間隔時間(180秒)
③啟動sentinel:先啟master,再啟slave
cd /usr/local/redis/conf/
redis-sentinel sentinel.conf &
④查看哨兵信息:
redis-cli -p 26379 info Sentinel
⑤故障切換:
殺死主節(jié)點(diǎn)的哨兵進(jìn)程
群集模式:
集群由多組節(jié)點(diǎn)(Node)組成,Redis的數(shù)據(jù)分布在這些節(jié)點(diǎn)中。集群中的節(jié)點(diǎn)分為主節(jié)點(diǎn)和從節(jié)點(diǎn):只有主節(jié)點(diǎn)負(fù)責(zé)讀寫請求和集群信息的維護(hù);從節(jié)點(diǎn)只進(jìn)行主節(jié)點(diǎn)數(shù)據(jù)和狀態(tài)信息的復(fù)制。
集群的作用,可以歸納為兩點(diǎn):
(1)數(shù)據(jù)分區(qū):數(shù)據(jù)分區(qū)(或稱數(shù)據(jù)分片)是集群最核心的功能。
集群將數(shù)據(jù)分散到多個節(jié)點(diǎn),一方面突破了Redis單機(jī)內(nèi)存大小的限制,存儲容量大大增加;另一方面每個主節(jié)點(diǎn)都可以對外提供讀服務(wù)和寫服務(wù),大大提高了集群的響應(yīng)能力。
Redis單機(jī)內(nèi)存大小受限問題,在介紹持久化和主從復(fù)制時都有提及;例如,如果單機(jī)內(nèi)存太大,bgsave和bgrewriteaof的fork操作可能導(dǎo)致主進(jìn)程阻塞,主從環(huán)境下主機(jī)切換時可能導(dǎo)致從節(jié)點(diǎn)長時間無法提供服務(wù),全量復(fù)制階段主節(jié)點(diǎn)的復(fù)制緩沖區(qū)可能溢出。
(2)高可用:集群支持主從復(fù)制和主節(jié)點(diǎn)的自動故障轉(zhuǎn)移(與哨兵類似);當(dāng)任一節(jié)點(diǎn)發(fā)生故障時,集群仍然可以對外提供服務(wù)。
Redis集群的數(shù)據(jù)分片:
Redis集群引入了哈希槽的概念
Redis集群有16384個哈希槽(編號0-16383)
集群的每組節(jié)點(diǎn)負(fù)責(zé)一部分哈希槽
每個Key通過CRC16校驗后對16384取余來決定放置哪個哈希槽,通過這個值,去找到對應(yīng)的插槽所對應(yīng)的節(jié)點(diǎn),然后直接自動跳轉(zhuǎn)到這個對應(yīng)的節(jié)點(diǎn)上進(jìn)行存取操作
以3個節(jié)點(diǎn)組成的集群為例:
節(jié)點(diǎn)A包含0到5460號哈希槽
節(jié)點(diǎn)B包含5461到10922號哈希槽
節(jié)點(diǎn)C包含10923到16383號哈希槽
實驗:
①創(chuàng)建集群目錄,并且創(chuàng)建節(jié)點(diǎn)服務(wù)器的目錄:
cd /usr/local/redis/
mkdir -p redis-cluster/redis600{1…6}
② cp /opt/redis-7.0.9/redis.conf /usr/local/redis/redis-cluster/redis600{1…6}
復(fù)制redis.conf 到各個節(jié)點(diǎn)服務(wù)器的目錄
③配置文件:
bind 127.0.0.1 #87行,注釋掉bind項,默認(rèn)監(jiān)聽所有網(wǎng)卡
protected-mode no #111行,關(guān)閉保護(hù)模式
port 6001(+1以此類推) #138行,修改redis監(jiān)聽端口
daemonize yes #309行,設(shè)置為守護(hù)進(jìn)程,后臺啟動
pidfile /usr/local/redis/log/redis_6001.pid(+1以此類推) #341行,指定 PID 文件
logfile “/usr/local/redis/log/redis_6001.log”(+1以此類推) #354行,指定日志文件
dir ./ #504行,指定持久化文件所在目錄
appendonly yes #1379行,開啟AOF
cluster-enabled yes #1576行,取消注釋,開啟群集功能
cluster-config-file nodes-6001.conf(+1以此類推) #1584行,取消注釋,群集名稱文件設(shè)置
cluster-node-timeout 15000 #1590行,取消注釋群集超時時間設(shè)置
④然后用cp復(fù)制,sed命令去更改配置文件內(nèi)容
⑤切換到各個文件中啟動服務(wù):
cd /usr/local/redis/redis-cluster/redis6001
.redis-server redis.conf
⑥ps -ef | grep redis 查看是否都啟動了
⑦啟動集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
⑧查看各個主和從的對應(yīng),查看hash槽的范圍:
⑨測試:
查看鍵的hash值:cluster keyslot 鍵
查看節(jié)點(diǎn)的哈希槽編號范圍:cluster slot文章來源:http://www.zghlxwxcb.cn/news/detail-459410.html
集群擴(kuò)容:
①創(chuàng)建6007和6008的目錄,進(jìn)行修改配置文件:
②創(chuàng)建一個新的主節(jié)點(diǎn)127.0.0.1:6007。命令里需要指定一個已有節(jié)點(diǎn)以便于獲取集群信息(可以知道6007的信息了)
③將127.0.0.1:6008創(chuàng)建為127.0.0.1:6007的從節(jié)點(diǎn)。命令里需要指定一個已有節(jié)點(diǎn)以便于獲取集群信息和主節(jié)點(diǎn)的node ID
④新加入的主節(jié)點(diǎn)是沒有槽數(shù)的,只有初始化集群的時候,才會根據(jù)主的數(shù)據(jù)分配好,如新增的主節(jié)點(diǎn),需要手動分配
⑤檢測文章來源地址http://www.zghlxwxcb.cn/news/detail-459410.html
到了這里,關(guān)于redis的主從復(fù)制、哨兵、集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!