-
當前位置:首頁 > 創(chuàng)意學院 > 技術 > 專題列表 > 正文
redis高可用集群(redis高可用集群搭建)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于redis高可用集群的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、redis HA方案
HA(High Available,高可用性群集)機集群系統(tǒng)簡稱,是保證業(yè)務連續(xù)性的有效解決方案,一般有兩個或兩個以上的節(jié)點,且分為活動節(jié)點及備用節(jié)點。通常把正在執(zhí) 行業(yè)務的稱為活動節(jié)點,而作為活動節(jié)點的一個備份的則稱為備用節(jié)點。當活動節(jié)點出現(xiàn)問題,導致正在運行的業(yè)務(任務)不能正常運行時,備用節(jié)點此時就會偵測到,并立即接續(xù)活動節(jié)點來執(zhí)行業(yè)務。從而實現(xiàn)業(yè)務的不中斷或短暫中斷。
Redis 一般以主/從方式部署(這里討論的應用從實例主要用于備份,主實例提供讀寫)該方式要實現(xiàn) HA 主要有如下幾種方案:
二、Redis哨兵集群
Redis-Sentinel是redis官方推薦的高可用性解決方案,
當用redis作master-slave的高可用時,如果master本身宕機,redis本身或者客戶端都沒有實現(xiàn)主從切換的功能。
而redis-sentinel就是一個獨立運行的進程,用于監(jiān)控多個master-slave集群,
自動發(fā)現(xiàn)master宕機,進行自動切換slave > master
每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發(fā)送一個 PING 命令
如果一個實例(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線。
如果一個Master被標記為主觀下線,則正在監(jiān)視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態(tài)。
當有足夠數(shù)量的 Sentinel(大于等于配置文件指定的值)在指定的時間范圍內確認Master的確進入了主觀下線狀態(tài), 則Master會被標記為客觀下線
在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令
當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次
若沒有足夠數(shù)量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態(tài)就會被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回復, Master 的主觀下線狀態(tài)就會被移除。
主觀下線和客觀下線
主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對某個redis服務器做出的下線判斷。
客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在對Master Server做出 SDOWN 判斷,并且通過 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下線判斷,然后開啟failover.
SDOWN適合于Master和Slave,只要一個 Sentinel 發(fā)現(xiàn)Master進入了ODOWN, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 并對下線的主服務器執(zhí)行自動故障遷移操作。
ODOWN只適用于Master,對于Slave的 Redis 實例,Sentinel 在將它們判斷為下線前不需要進行協(xié)商, 所以Slave的 Sentinel 永遠不會達到ODOWN。
Redis主從復制可將主節(jié)點數(shù)據(jù)同步給從節(jié)點,從節(jié)點此時有兩個作用:
但是問題是:
那么這個問題,redis-sentinel就可以解決了
Redis的一個進程,但是不存儲數(shù)據(jù),只是監(jiān)控redis
本實驗是在測試環(huán)境下,因此只準備一臺linux服務器用作環(huán)境??!
服務器環(huán)境,一臺即可完成操作
所有配置文件如下
總體redis配置文件如下,6379為master,6380和6381為slave
redis-6380.conf slave配置文件詳解,6381端口的配置文件,僅僅和6380端口不一樣
在主節(jié)點上查看主從通信關系
在從節(jié)點上查看主從關系(6380、6379)
此時可以在master上寫入數(shù)據(jù),在slave上查看數(shù)據(jù),此時主從復制配置完成
redis-sentinel-26379.conf配置文件寫入如下信息
redis-sentinel-26380.conf和redis-sentinel-26381.conf的配置僅僅差異是port(端口)的不同。
然后啟動三個sentinel哨兵
此時查看哨兵是否成功通信
實例的思路
首先查看三個Redis的進程狀態(tài)
第一個
第二個
第三個
直接干掉master,然后等待其他兩個節(jié)點是否能自動被哨兵sentienl,切換為master節(jié)點
此時查看兩個slave的狀態(tài)
然后會發(fā)現(xiàn)slave節(jié)點成為master節(jié)點!!
三、linux 的環(huán)境搭建(二)--redis單機環(huán)境、生產環(huán)境、集群環(huán)境的搭建
一、目錄
1、工具
2、安裝tcl
3、安裝單機版redis
4、把redis設置為daemon進程,每次系統(tǒng)啟動,redis進程一起啟動
5、安裝redis cluster
二、工具
2.1、tcl8.6.1-src.tar.gz
2.2、ruby-2.3.1.tar.gz
2.3、redis-4.1.1.gem
2.4、redis-3.2.8.tar.gz
2.5、openssl-1.0.2r.tar.gz
三、安裝tcl(安裝redis必須先要安裝tcl)
3.1、把tcl8.6.1-src.tar.gz通過WinSCP上傳到虛擬機中的/usr/local目錄下
四、安裝單機版redis
4.1、把redis-3.2.8.tar.gz通過WinSCP上傳到虛擬機中的/usr/local目錄下
4.2、依次運行如下命令:
tar -zxvf redis-3.2.8.tar.gz 解壓文件
cd redis-3.2.8
make && make test && make install
五、把redis設置為daemon進程,每次系統(tǒng)啟動,redis進程一起啟動
5.1、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_6379,6379是我們希望這個redis實例監(jiān)聽的端口號
5.2、修改redis_6379腳本的第6行的REDISPORT,設置為相同的端口號(默認就是6379)
protected-mode no 取消保護模式,保護模式只能127.0.0.1訪問
daemonize yes 讓redis以daemon進程運行
pidfile /var/run/redis_6379.pid 設置redis的pid文件位置
bind 192.168.3.110
port 6379 設置redis的監(jiān)聽端口號
dir /var/redis/6379 設置持久化文件的存儲位置
logfile /var/log/redis/6379.log 設置日志文件位置
5.6、啟動redis,依次執(zhí)行:
cd /etc/init.d,
chmod 777 redis_6379,賦讀寫執(zhí)行的權限(chmod -R 777 * 是遞歸把該目錄下的所有文件和其子文件全部賦權限)
./redis_6379 start 啟動
5.7、確認redis進程是否啟動,ps -ef | grep redis
5.8、讓redis跟隨系統(tǒng)啟動自動啟動
5.9、重啟系統(tǒng),不手動啟動redis,直接連接redis,可以連接上,表示配置成功
此時一個單機版的redis的生產環(huán)境已經搭建好了,每次服務器重啟,redis都會自動的啟動
六、安裝redis cluster
(redis cluster集群,要求至少3個master,去組成一個高可用,健壯的分布式的集群,每個master都建議至少給一個slave,3個master,3個slave)
6.1、前提,我在其它機器上啟動了六個redis(安裝步驟都如下)
2.2、創(chuàng)建三個目錄:
mkdir -p /etc/redis-cluster 存放集群配置信息,自動生成配置
mkdir -p /var/log/redis redis日志
mkdir -p /var/redis/7001 存放redis的rdb文件和aof文件
6.3、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_7001,7001是我們希望這個redis實例監(jiān)聽的端口號,并修改redis_7001配置文件中的REDISPORT=7001
6.4、修改/etc/redis/7001.conf中的部分配置為生產環(huán)境
6.5、完成了一個redis環(huán)境的配置,依次再配置其余五個,分別為7002、7003、7004、7005、7006,每個啟動腳本內,都修改對應的端口號
6.6、啟動6個redis實例
6.7、創(chuàng)建集群(需要安裝ruby、rubygems)
上述命令在部分機器上是可以直接運行完成,成功安裝的,但在部分機器上運行第三條命令時會提示ruby版本太低、openssl找不到的問題,下面依次解決這兩個問題:
6.8、再次運行gem install redis命令,報出兩個錯誤
6.9、再次運行gem install redis命令,報出一個錯誤
6.10、再次運行gem install redis命令,報出一個錯誤
6.11、再次運行gem install redis命令
[root@ceshi01 local]# gem install redis
Successfully installed redis-4.1.1
Parsing documentation for redis-4.1.1
Done installing documentation for redis after 1 seconds
WARNING: Unable to pull data from ' https://rubygems.org/' : SSL_connect returned=1 errno=0 state=error: certificate verify failed ( https://api.rubygems.org/specs.4.8.gz )
1 gem installed
運行成功
此時Redis安裝好,此三個工具也安裝好了,這時我們來做一個Redis集群測試,在一臺服務器中創(chuàng)建了6個Redis實例,開啟6個Redis服務
redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006
[root@eshop-cache02 init.d]# redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006
此時一個redis集群環(huán)境就已經搭建好了,可以通過redis-trib.rb check 192.168.3.105:7003命令查看集群幾點的信息
[root@eshop-cache02 init.d]# redis-trib.rb check 192.168.3.105:7004
redis cluster的優(yōu)點:讀寫分離+高可用+多master
讀寫分離:每個master都有一個slave
高可用:master宕機,slave自動被切換過去
多master:橫向擴容支持更大數(shù)據(jù)量
四、redis常見問題
1. 緩存擊穿
緩存擊穿是指一個請求要訪問的數(shù)據(jù),緩存中沒有,但數(shù)據(jù)庫中有的情況。這種情況一般都是緩存過期了。
但是這時由于并發(fā)訪問這個緩存的用戶特別多,這是一個熱點 key,這么多用戶的請求同時過來,在緩存里面沒有取到數(shù)據(jù),所以又同時去訪問數(shù)據(jù)庫取數(shù)據(jù),引起數(shù)據(jù)庫流量激增,壓力瞬間增大,直接崩潰給你看。
所以一個數(shù)據(jù)有緩存,每次請求都從緩存中快速的返回了數(shù)據(jù),但是某個時間點緩存失效了,某個請求在緩存中沒有請求到數(shù)據(jù),這時候我們就說這個請求就"擊穿"了緩存。
針對這個場景,對應的解決方案一般來說有三種。
借助Redis setNX命令設置一個標志位就行。設置成功的放行,設置失敗的就輪詢等待。就是在更新緩存時加把鎖
后臺開一個定時任務,專門主動更新過期數(shù)據(jù)
比如程序中設置 why 這個熱點 key 的時候,同時設置了過期時間為 10 分鐘,那后臺程序在第 8 分鐘的時候,會去數(shù)據(jù)庫查詢數(shù)據(jù)并重新放到緩存中,同時再次設置緩存為 10 分鐘。
其實上面的后臺續(xù)命思想的最終體現(xiàn)是也是永不過期。
只是后臺續(xù)命的思想,會主動更新緩存,適用于緩存會變的場景。會出現(xiàn)緩存不一致的情況,取決于你的業(yè)務場景能接受多長時間的緩存不一致。
2. 緩存穿透
緩存穿透是指一個請求要訪問的數(shù)據(jù),緩存和數(shù)據(jù)庫中都沒有,而用戶短時間、高密度的發(fā)起這樣的請求,每次都打到數(shù)據(jù)庫服務上,給數(shù)據(jù)庫造成了壓力。一般來說這樣的請求屬于惡意請求。
解決方案有兩種:
就是在數(shù)據(jù)庫即使沒有查詢到數(shù)據(jù),我們也把這次請求當做 key 緩存起來,value 可以是 NULL。下次同樣請求就會命中這個 NULL,緩存層就處理了這個請求,不會對數(shù)據(jù)庫產生壓力。這樣實現(xiàn)起來簡單,開發(fā)成本很低。
3. 緩存雪崩
緩存雪崩是指緩存中大多數(shù)的數(shù)據(jù)在同一時間到達過期時間,而查詢數(shù)據(jù)量巨大,這時候,又是緩存中沒有,數(shù)據(jù)庫中有的情況了。
防止雪崩的方案簡單來說就是錯峰過期。
在設置 key 過期時間的時候,在加上一個短的隨機過期時間,這樣就能避免大量緩存在同一時間過期,引起的緩存雪崩。
如果發(fā)了雪崩,我們可以有服務降級、熔斷、限流手段來拒絕一些請求,保證服務的正常。但是,這些對用戶體驗是有一定影響的。
4. Redis 高可用架構
Redis 高可用架構,大家基本上都能想到主從、哨兵、集群這三種模式。
哨兵模式:
它主要執(zhí)行三種類型的任務:
哨兵其實也是一個分布式系統(tǒng),我們可以運行多個哨兵。
然后這些哨兵之間需要相互通氣,交流信息,通過投票來決定是否執(zhí)行自動故障遷移,以及選擇哪個從服務器作為新的主服務器。
哨兵之間采用的協(xié)議是 gossip,是一種去中心化的協(xié)議,達成的是最終一致性。
選舉規(guī)則:
以上就是關于redis高可用集群相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。
推薦閱讀:
paper免費查重入口官網(wǎng)(paperfree免費查重入口官網(wǎng))