前言
Redis有三種模式:分別是主從同步/復(fù)制、哨兵模式、Cluster
主從復(fù)制:主從復(fù)制是高可用Redis的基礎(chǔ),哨兵和群集都是在主從復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的。主從復(fù)制主要實(shí)現(xiàn)了數(shù)據(jù)的多機(jī)備份,以及對(duì)于讀操作的負(fù)載均衡和簡(jiǎn)單故障恢復(fù)。
缺陷:故障恢復(fù)無(wú)法自動(dòng)化,寫(xiě)操作無(wú)法負(fù)載均衡,存儲(chǔ)能力受到單機(jī)的限制。
哨兵:在主從復(fù)制的基礎(chǔ)上,哨兵實(shí)現(xiàn)了自動(dòng)化的故障恢復(fù)。
缺陷:寫(xiě)操作無(wú)法負(fù)載均衡,存儲(chǔ)能力受到單機(jī)的限制,哨兵無(wú)法對(duì)從節(jié)點(diǎn)進(jìn)行自動(dòng)故障轉(zhuǎn)移;在讀寫(xiě)分離場(chǎng)景下,從節(jié)點(diǎn)故障會(huì)導(dǎo)致讀服務(wù)不可用,需要對(duì)從節(jié)點(diǎn)做額外的監(jiān)控、切換操作。
集群:通過(guò)集群,Redis解決了寫(xiě)操作無(wú)法負(fù)載均衡,以及存儲(chǔ)能力受到單機(jī)限制的問(wèn)題,實(shí)現(xiàn)了較為完善的高可用方案。
redis安裝這里不在贅述,有需要的同學(xué)參考之前的文章【Centos7下安裝與配置 Redis】
一、Redis主從復(fù)制(讀寫(xiě)分離)
環(huán)境準(zhǔn)備
HOSTNAME | IP |
---|---|
redis(主) | 192.168.92.100 |
redis(備) | 192.168.92.101 |
redis(備) | 192.168.92.102 |
1.主從復(fù)制概述
??主從復(fù)制,是指將一臺(tái) Redis 服務(wù)器的數(shù)據(jù),復(fù)制到其他的 Redis 服務(wù)器。前者稱為主節(jié)點(diǎn)(Master),后者稱為從節(jié)點(diǎn)(Slave);數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。
??默認(rèn)情況下,每臺(tái) Redis 服務(wù)器都是主節(jié)點(diǎn);且一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn) (或沒(méi)有從節(jié)點(diǎn)),但一個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)。
2.主從復(fù)制
數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù) (即寫(xiě) Redis 數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀 Redis 數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
高可用基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說(shuō)主從復(fù)制是Redis高可用的基礎(chǔ)。
3.Redis主從復(fù)制流程
??若啟動(dòng)一個(gè)Slave機(jī)器進(jìn)程,則它會(huì)向Master機(jī)器發(fā)送一個(gè)“sync command" 命令,請(qǐng)求同步連接。
??無(wú)論是第一次連接還是重新連接,Master機(jī)器 都會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程,將數(shù)據(jù)快照保存到數(shù)據(jù)文件中(執(zhí)行rdb操作) ,同時(shí) Master 還會(huì)記錄修改數(shù)據(jù)的所有命令并緩存在數(shù)據(jù)文件中。
??后臺(tái)進(jìn)程完成緩存操作之后,Master 機(jī)器就會(huì)向 Slave 機(jī)器發(fā)送數(shù)據(jù)文件,Slave 端機(jī)器將數(shù)據(jù)文件保存到硬盤(pán)上,然后將其加載到內(nèi)存中,接著 Master 機(jī)器就會(huì)將修改數(shù)據(jù)的所有操作一并發(fā)送給 Slave 端機(jī)器。若 Slave 出現(xiàn)故障導(dǎo)致宕機(jī),則恢復(fù)正常后會(huì)自動(dòng)重新連接。
??Master機(jī)器收到 Slave 端機(jī)器的連接后,將其完整的數(shù)據(jù)文件發(fā)送給 Slave 端機(jī)器,如果 Mater 同時(shí)收到多個(gè) Slave 發(fā)來(lái)的同步請(qǐng)求,則 Master 會(huì)在后臺(tái)啟動(dòng)一個(gè)進(jìn)程以保存數(shù)據(jù)文件,然后將其發(fā)送給所有的 Slave 端機(jī)器,確保所有的 Slave 端機(jī)器都正常。
4.搭建Redis主從復(fù)制
1. 三臺(tái)虛擬機(jī)都進(jìn)入Redis服務(wù)器
-
info replication
查看主從復(fù)制信息
role:master #當(dāng)前機(jī)器的角色主還是從
connected)salaces:0 #代表從節(jié)點(diǎn)目前為0
2. 進(jìn)入我們的從節(jié)點(diǎn)(101/102)修改配置
PS: 這是對(duì)從節(jié)點(diǎn)的配置, Master主節(jié)點(diǎn)中只需要開(kāi)啟以下配置中的主從配置的密碼, masterauth XXX, 為后面哨兵搭建提前準(zhǔn)備.
-
搜索Rep找到
replicaof
. -
修改
replocaofi
和masterauth
-
從節(jié)點(diǎn)
replica-read-only
讀操作改為yes.從而實(shí)現(xiàn)讀寫(xiě)分離 -
保存退出, 刪除從節(jié)點(diǎn)機(jī)器上的備份文件,同上步驟配置我們的第二臺(tái)從節(jié)點(diǎn)102
- 重新啟動(dòng)redis服務(wù),同上步驟配置我們的第二臺(tái)從節(jié)點(diǎn)102
-
查看101從節(jié)點(diǎn)的
info replication
-
查看100主節(jié)點(diǎn)的
info replication
PS: 當(dāng)主節(jié)點(diǎn)宕機(jī)后, 從節(jié)點(diǎn)不會(huì)變成主節(jié)點(diǎn)
二、Redis哨兵模式 (Sentinel)
??主從復(fù)制存在的問(wèn)題:主節(jié)點(diǎn)掛了,如何保證可用性,實(shí)現(xiàn)繼續(xù)讀寫(xiě)?
??在Redis主從復(fù)制中, 由于我們的Redis Master節(jié)點(diǎn)宕機(jī)之后, 從節(jié)點(diǎn)Slave無(wú)法自動(dòng)的變?yōu)橹鞴?jié)點(diǎn), 從而無(wú)法為用戶提供寫(xiě)的請(qǐng)求, 只能進(jìn)行讀. 為了解決這個(gè)問(wèn)題, 我們引入了Redis 哨兵機(jī)制.
??通過(guò)哨兵哨兵機(jī)制, 哨兵會(huì)監(jiān)控所有節(jié)點(diǎn), 當(dāng)主節(jié)點(diǎn)宕機(jī)之后, 哨兵就會(huì)讓其中的一個(gè)從節(jié)點(diǎn)來(lái)代替主節(jié)點(diǎn), 接手它的寫(xiě)操作, 從而成為一個(gè)新的主從模式.
環(huán)境準(zhǔn)備
HOSTNAME | IP |
---|---|
redis(主) | 192.168.92.100 |
redis(備) | 192.168.92.101 |
redis(備) | 192.168.92.102 |
1.配置Redis 哨兵機(jī)制
1.進(jìn)入 Redis 安裝目錄cd /usr/local/redis/redis-5.0.0
sentinel.conf 就是我們哨兵機(jī)制的核心配置文件.
2.將sentinel核心配置文件拷貝到我們的/usr/local/redis
下cp sentinel.conf /usr/local/redis
3.編輯我們的哨兵核心配置文件vim sentinel.conf
具體配置信息如下:
- 直接復(fù)制修改參數(shù)即可
# Base
#開(kāi)啟,方便其他節(jié)點(diǎn)器訪問(wèn)
protected-mode no
#哨兵默認(rèn)端口號(hào)
port 26379
#后臺(tái)啟動(dòng)模式
daemonize yes
#哨兵機(jī)制默認(rèn)進(jìn)程號(hào)
pidfile /var/run/redis-sentinel.pid
#設(shè)置哨兵模式的日志文件路勁
logfile /usr/local/redis/sentinel/redis-sentinel.log
#哨兵模式的工作目錄
dir /usr/local/redis/sentinel
# core 核心配置
# my-master:自定義名稱 192.168.92.100 6379:主節(jié)點(diǎn)ip+端口 2:哨兵數(shù)量
sentinel monitor my-master 192.168.92.100 6379 2
#設(shè)置主節(jié)點(diǎn)密碼
sentinel auth-pass my-master 123456
#被哨兵任務(wù)失效的毫秒時(shí)間段,默認(rèn)為30秒,單位毫秒
sentinel down-after-milliseconds my-master 30000
#當(dāng)從節(jié)點(diǎn)后變?yōu)橹鞴?jié)點(diǎn)后,進(jìn)行配置其他的,多少個(gè)從節(jié)點(diǎn)進(jìn)行并行復(fù)制 1:一次接一個(gè)復(fù)制 2:一次復(fù)制2個(gè)
sentinel parallel-syncs my-master 1
#主備的切換時(shí)間,哨兵進(jìn)行故障轉(zhuǎn)移如果超時(shí),則會(huì)交給哨兵集群的另一個(gè)節(jié)點(diǎn)處理進(jìn)行故障轉(zhuǎn)移
sentinel failover-timeout my-master 180000
2. 由于是哨兵集群, 所以3臺(tái)redis節(jié)點(diǎn)的哨兵配置文件一模一樣.
可以直接拷貝一份, 也可使用如下方式遠(yuǎn)程拷貝
PS: 將配置文件進(jìn)行遠(yuǎn)程傳輸scp sentinel.conf root@192.168.92.101:/usr/local/redis
scp sentinel.conf root@192.168.92.102:/usr/local/redis
3. 啟動(dòng)哨兵
啟動(dòng)命令:redis-sentinel sentinel.conf
其中sentinel.conf是哨兵核心配置文件路徑
PS: 沒(méi)有文件夾及文件, 因?yàn)槲覀兪鞘孪榷x好的目錄, 我們?nèi)?chuàng)建即可, 然后再次啟動(dòng)mkdir /usr/local/redis/sentinel -p
ps -ef|grep redis
查看redis進(jìn)程tail -f redis-sentinel.log
動(dòng)態(tài)查看哨兵日志文件末尾
當(dāng)出現(xiàn)這個(gè)說(shuō)明配置成功了,,,
隨后從節(jié)點(diǎn)服務(wù)器也都需要啟動(dòng)哨兵配置文件
4. 測(cè)試哨兵機(jī)制
- 開(kāi)啟所有的主從復(fù)制架構(gòu)節(jié)點(diǎn),當(dāng)前100為主節(jié)點(diǎn)
- 關(guān)閉主節(jié)點(diǎn),查看日志
可以看到101已經(jīng)變味master,宕機(jī)的100節(jié)點(diǎn)也已經(jīng)被剔除
3.啟動(dòng)原來(lái)的100 master節(jié)點(diǎn)
查看日志,100變成存活狀態(tài)后,并不會(huì)恢復(fù)之前的master節(jié)點(diǎn)
5.解決原Master恢復(fù)后不同步問(wèn)題
??相信細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)原來(lái)的Master(100)恢復(fù)成Slave)后,他的同步狀態(tài)不OK,狀態(tài)為master_link_status:dowm,這是為什么呢?
修改redis.conf
中的masterauth為自己密碼即可,我的是123456。
一般master數(shù)據(jù)無(wú)法同步給slave的方案檢查為如下:
- 網(wǎng)絡(luò)通信問(wèn)題,要保證互相ping通,內(nèi)網(wǎng)互通。
- 關(guān)閉防火墻,對(duì)應(yīng)的端口開(kāi)發(fā)(虛擬機(jī)中建議永久關(guān)閉防火墻,云服務(wù)器的話需要保證內(nèi)網(wǎng)互通)。
- 統(tǒng)一所有的密碼,不要漏了某個(gè)節(jié)點(diǎn)沒(méi)有設(shè)置。
6.SpringBoot集成 Redis哨兵
1.配置信息
server:
port: 8088
spring:
datasource: # 數(shù)據(jù)源的相關(guān)配置
url: jdbc:mysql://127.0.0.1:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
password: 123456
redis:
# Redis 單機(jī)單實(shí)例
# database: 0
# host: 192.168.92.100
# port: 6379
# password: 123456
# Redis 哨兵模式
database: 1
password: 123456
sentinel:
master: my-master
nodes: 192.168.92.100:26379,192.168.92.101:26379,192.168.92.102:26379
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.測(cè)試結(jié)果:
三、Redis 集群模式 (Redis-Cluster)
??前面我們一起學(xué)習(xí)了主從復(fù)制以及哨兵,他們可以提高讀的并發(fā),但是單個(gè)master容量有限,數(shù)據(jù)達(dá)到一定程度會(huì)有瓶頸,這個(gè)時(shí)候可以通過(guò)水平擴(kuò)展為多master-slave成為集群。
??那么這一節(jié)開(kāi)始我們就一起來(lái)學(xué)習(xí)redis-cluster:他可以支撐多個(gè)master-.slave,支持海量數(shù)據(jù),實(shí)現(xiàn)高可用與高并發(fā)。
??哨兵模式其實(shí)也是一種集群,他能夠提高讀請(qǐng)求的并發(fā),但是容錯(cuò)方面可能會(huì)有一些問(wèn)題,比如masterf同步數(shù)據(jù)給slave的時(shí)候,這其實(shí)是異步復(fù)制吧,這個(gè)時(shí)候masterf掛了,那么slave.上的數(shù)據(jù)就沒(méi)有master新,數(shù)據(jù)同步需要時(shí)i間的,1-2秒的數(shù)據(jù)會(huì)丟失。master恢復(fù)并轉(zhuǎn)換成slavel后,新數(shù)據(jù)則丟失。
特點(diǎn)
- 每個(gè)節(jié)點(diǎn)知道彼此之間的關(guān)系,也會(huì)知道自己的角色,當(dāng)然他們也會(huì)知道自己存在與一個(gè)集群環(huán)境中,他們彼此之間可以交互和通信,比如ping pong。那么這些關(guān)系都會(huì)保存到某個(gè)配置文件中,每個(gè)節(jié)點(diǎn)都有,這個(gè)我們?cè)诖罱ǖ臅r(shí)候會(huì)做配置的。
- 客戶端要和集群建立連接的話,只需要和其中一個(gè)建立關(guān)系就行。
- 某個(gè)節(jié)點(diǎn)掛了,也是通過(guò)超過(guò)半數(shù)的節(jié)點(diǎn)來(lái)進(jìn)行的檢測(cè),客觀下線后主從切換,和我們之前在哨兵模式中提到的是一個(gè)道理。
- Redis中存在很多的插槽,又可以稱之為槽節(jié)點(diǎn),用于存儲(chǔ)數(shù)據(jù),這個(gè)先不管,后面再說(shuō)。
集群容錯(cuò)
??構(gòu)建Redis集群,需要至少3個(gè)節(jié)點(diǎn)作為master,以此組成一個(gè)高可用的集群,此外每個(gè)masteri都需要配備一個(gè)slave,所以整個(gè)集群需要6個(gè)節(jié)點(diǎn),這也是最經(jīng)典的Redis集群,也可以稱之為三主三從,容錯(cuò)性更佳。所以在搭建的時(shí)候需要有6臺(tái)虛擬機(jī)。請(qǐng)各自準(zhǔn)備6臺(tái)虛擬機(jī),可以通過(guò)克隆去構(gòu)建,使用單實(shí)例的Redis去克隆即可。
- 集群也可以在單服務(wù)器構(gòu)建,稱之為偽集群,但是生產(chǎn)環(huán)境肯定是真的,所以建議用6臺(tái)。
- 克隆后務(wù)必關(guān)閉Redis。
環(huán)境準(zhǔn)備
這里最好找一個(gè)沒(méi)有配置過(guò)的redis,進(jìn)行重頭配置,不要復(fù)用前兩節(jié)的配置文件
Vmware配置完一臺(tái)后可以進(jìn)行系統(tǒng)克隆
HOSTNAME | IP |
---|---|
103 redis | 192.168.92.103 |
104 redis | 192.168.92.104 |
105 redis | 192.168.92.105 |
106 redis | 192.168.92.106 |
107 redis | 192.168.92.107 |
108 redis | 192.168.92.108 |
1. 操作我們第一臺(tái)Cluster服務(wù)器 103
- 進(jìn)入redis.conf目錄下, 編輯該文件
cd /usr/local/redis/
vim redis.conf
- 修改配置如下:
#開(kāi)啟集群模式
cluster-enabled yes
#每一個(gè)節(jié)點(diǎn)需要有一個(gè)配置文件,需要6份。每個(gè)節(jié)點(diǎn)處于集群的角色都需要告知其他所有節(jié)點(diǎn),彼此知道,這個(gè)文件用于存儲(chǔ)集群模式下的集群狀態(tài)等信息,這個(gè)文件是由ris自己維護(hù),我們不要處理
cluster-config-file nodes-6379.conf
#超時(shí)時(shí)間,超時(shí)則認(rèn)為master?宕機(jī),隨后主備切換
cluster-node-timeout 15000
#開(kāi)啟AOF
appendonly yes
- 保存配置文件,重新啟動(dòng)redis,查看服務(wù)出現(xiàn)cluster說(shuō)明配置成功
/etc/init.d/redis_init_script start
2.啟動(dòng)6個(gè)redis實(shí)例
- 啟動(dòng)其他5臺(tái)臺(tái),按上述步驟依次進(jìn)行
- 如果啟動(dòng)過(guò)程出錯(cuò),把rdb等文件刪除清空
cd working/
rm dump.rdb
- 這里可以使用xhell多窗口同時(shí)操作
3. 創(chuàng)建集群
(舊版本redis需要使用redis安裝目錄下的redis-trib.rb 腳本進(jìn)行搭建)
1.操作我們的103(主)節(jié)點(diǎn)
#####
#集群命令說(shuō)明
redis-cli --cluster help
#注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb來(lái)構(gòu)建集群,最新版使用C語(yǔ)言來(lái)構(gòu)建了,這個(gè)要注意
#注意2:以下為新版的redis構(gòu)建方式
#####
#創(chuàng)建集群,主節(jié)點(diǎn)和從節(jié)點(diǎn)比例為1,1-3為主,4-6為從,1和4,2和5,3和6分別對(duì)應(yīng)為主從關(guān)系,這也是最經(jīng)典用的最多的集群模式
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1
##我的集群供參考---------------------------------------------------------------------------------------
#-a 為當(dāng)前redis服務(wù)密碼
redis-cli -a 123456 --cluster create 192.168.92.103:6379 192.168.92.104:6379 192.168.92.105:6379 192.168.92.106:6379 192.168.92.107:6379 192.168.92.108:6379 --cluster-replicas 1
##查看集群信息,任意一個(gè)節(jié)點(diǎn)都行 a 為當(dāng)前redis服務(wù)密碼
redis-cli -a 123456 --cluster 192.168.19.108:6379
當(dāng)出現(xiàn)綠色區(qū)域部分,說(shuō)明我們的三主三從搭建完成了。
Sots:槽,用于裝數(shù)據(jù),主節(jié)點(diǎn)有,從節(jié)點(diǎn)沒(méi)有
2.查看集群信息
任意節(jié)點(diǎn)執(zhí)行:redis-cli -a 123456 --cluster 192.168.19.108:6379
4.slot槽節(jié)點(diǎn) (遵循一致性hash原則)
slot 槽節(jié)點(diǎn)是存在于Redis集群的master節(jié)點(diǎn)中的, 而在slave從節(jié)點(diǎn)中是沒(méi)有槽節(jié)點(diǎn)的.
- slot 槽節(jié)點(diǎn)是平均分配在master節(jié)點(diǎn)上的
- slot 槽節(jié)點(diǎn)是用來(lái)保存數(shù)據(jù)的
查看集群信息
在任意一臺(tái)集群服務(wù)器節(jié)點(diǎn)上都可以查看.redis-cli -c -a xxxx密碼 -h 192.168.92.142 -p 6379
cluster info
查看集群配置信息cluster nodes
查看節(jié)點(diǎn)信息
測(cè)試
5.springboot集成redis集群
1.配置信息
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-788289.html
server:
port: 8088
spring:
datasource: # 數(shù)據(jù)源的相關(guān)配置
url: jdbc:mysql://127.0.0.1:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
password: 123456
redis:
# Redis 單機(jī)單實(shí)例
#database: 0
#host: 192.168.92.100
#port: 6379
#password: 123456
# Redis 哨兵模式
#database: 1
#password: 123456
#sentinel:
# master: my-master
# nodes: 192.168.92.100:26379,192.168.92.101:26379,192.168.92.102:26379
# Redis 集群模式
password: 123456
cluster:
nodes: 192.168.92.103:6379,192.168.92.104:6379,192.168.92.105:6379,192.168.92.106:6379,192.168.92.107:6379,192.168.92.108:6379
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.測(cè)試結(jié)果
可以看到bbb沒(méi)有在104節(jié)點(diǎn),數(shù)據(jù)存儲(chǔ)在了103節(jié)點(diǎn)當(dāng)中文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-788289.html
到了這里,關(guān)于Redis主從復(fù)制、哨兵模式、集群模式的搭建與springboot集成的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!